㈠ 为什么单片机断电以后程序就不能用了
断电以后程序还是保存在单片机里面的,核查下 上电下程序和断电后再运行程序 有什么不一样,程序结束的地方放了while(1)没有?估计程序跑飞了。
㈡ 如何实现单片机让开关断电
如果只是控制开关断电,很容易也很简单,没必要用单片机,反倒麻烦了,还需要写程序。而只用一个继电器就行,用继电器的常闭触点作开关,一旦继电器吸合就断电了。
㈢ 单片机断电后是不是就复原了
你的理解是正确的,只有ROM中的数据还在。
前一次运行程序不会给单片机留下记录,程序的初始数据不会改变
㈣ 51单片机断电后数据怎么存储
用存储芯片,比如AT24C0x系列的EEPROM,掉电后可以存储数据,上电后从断电时的数开始计算!这些芯片的用法资料很多的,你可以找一下!
㈤ 单片机断电瞬间引起外中断如何屏蔽。
进入中断后,执行nop 几次(或短暂延时)后再检查INT输入的电平,如果确实是低电平,才认为是中断产生。
㈥ 怎么实现单片机断电实现数据
可以用定时器控制,同时每50ms就将数据保存一次。 在主程序的开始再将数据读取出来就可以了,51单片机内部没有EEPROM,所以不能够实现该功能,可以用52。 或者是用外部芯片,用24c02,也可以实现这个功能。
㈦ 单片机断电之后,管脚状态
单片机的管脚有三种状态 高电平 低电平 高阻
断电后 管脚是高阻态
至于你说的误动作 很对 最好是低电平动作 不行加个反相器也可以
㈧ 宏晶单片机,如何在断电程序中,保护数据。请附程序
单片机中有EPROM,我用的是STC12C5A60S2,有1K空间的EPROM,是可以断电保存用户数据的,其他型号STC单片机的EPROM大小不一,参考手册,但程序差不多的,程序如下:
/********************************************************************
* *
* 单片机学习开发板BP-51A - 内部EPROM读写演示程序 *
* 版本: V1.0 (2011/10/13) *
* 作者: BestProvider *
* 说明: STC12C5A60S2单片机有1K字节的内部EPROM,可以用来存放用户数 *
* 据(断电不丢失),EPROM分2个扇区,地址为0X0000-0X1FFF和0X2000 *
* -0X3FFF,需要注意的是在进行写操作时,必须先要进行所在扇区 *
* 的清除操作 *
* 硬件: 本实验需要液晶屏LCD1602来显示数据 *
* 参考: 《STC12C5A60S2中文资料》- 第12章 STC12C5A60S2系列单片机 *
* EPROM的应用 *
* *
********************************************************************/
#include <stc12c5a60s2.h>
typedef unsigned char BYTE; // 数据范围0-255
typedef unsigned int WORD; // 数据范围0-65535
typedef bit BOOL ; // 数据范围0-1
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_WRITE 2
#define CMD_ERASE 3
#define ENABLE_IAP 0X82
BYTE write_data[5]={0,1,2,3,4};
BYTE read_data[5];
BYTE code dis1[ ] = {"EPROM Write/Read"} ;
BYTE code dis2[ ] = {"Data: "} ;
sbit LCD_RS = P2^0; // LCD控制线
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
/* ms级延时 */
/********************************/
void delay_ms(WORD n)
{
WORD i=0;
WORD j;
while(i<n)
{
for(j=0;j<1000;j++){}
i++;
}
}
/* 测试LCD忙碌状态 */
/********************************/
BOOL lcd_bz()
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delay_ms(1);
result = (BOOL)(P0 & 0x80);
LCD_EN = 0;
return result;
}
/* 写入指令数据到LCD */
/********************************/
void lcd_wcmd(BYTE cmd)
{
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay_ms(1);
P0 = cmd;
delay_ms(1);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
/* 设定显示位置 */
/********************************/
void lcd_pos(BYTE pos)
{
lcd_wcmd(pos | 0x80);
}
/* 写入字符显示数据到LCD */
/********************************/
void lcd_wdat(BYTE dat)
{
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay_ms(1);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
/* LCD初始化设定 */
/********************************/
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(10);
lcd_wcmd(0x0c);
delay_ms(10);
lcd_wcmd(0x06);
delay_ms(10);
lcd_wcmd(0x01); // 清除LCD的显示内容
delay_ms(10);
}
/* EPROM 扇区清除 */
/********************************/
void Iaperasesector(unsigned char addr)
{
IAP_ADDRH=addr;
IAP_ADDRL=0x00;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
delay_ms(10);
}
/* EPROM 写操作 */
/********************************/
void Iapwritebyte()
{
BYTE i;
Iaperasesector(0x00); // 在进行内部EPROM写操作前需进行扇区清除操作
IAP_CONTR=ENABLE_IAP;
for(i=0;i<5;i++)
{
IAP_ADDRH=0x00;
IAP_ADDRL=0x00+i;
IAP_DATA=write_data[i];
IAP_CMD=CMD_WRITE;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
delay_ms(10);
}
IAP_CONTR=0x00;
}
/* EPROM 读操作 */
/********************************/
void Iapreadbyte()
{
BYTE i;
for(i=0;i<5;i++)
{
IAP_DATA=0;
IAP_CONTR=ENABLE_IAP;
IAP_ADDRH=0x00;
IAP_ADDRL=0x00+i;
IAP_CMD=CMD_READ;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
delay_ms(10);
read_data[i]=IAP_DATA;
}
IAP_CONTR=0x00;
}
/* 数据显示 */
/********************************/
void Display()
{
BYTE m ;
lcd_pos(0) ; // 设置显示位置为第一行的第1个字符
m = 0 ;
while(dis1[m] != '\0')
{
lcd_wdat(dis1[m]) ; // 显示字符
m++ ;
}
lcd_pos(0x40) ; // 设置显示位置为第二行第1个字符
m = 0 ;
while(dis2[m] != '\0')
{
lcd_wdat(dis2[m]) ; // 显示字符
m++ ;
}
lcd_pos(0x46); // 显示读取的第1个数据
lcd_wdat(0x30+read_data[0]);
lcd_pos(0x48); // 显示读取的第2个数据
lcd_wdat(0x30+read_data[1]);
lcd_pos(0x4a); // 显示读取的第3个数据
lcd_wdat(0x30+read_data[2]);
lcd_pos(0x4c); // 显示读取的第4个数据
lcd_wdat(0x30+read_data[3]);
lcd_pos(0x4e); // 显示读取的第5个数据
lcd_wdat(0x30+read_data[4]);
}
/* 主程序 */
/********************************/
main()
{
delay_ms(200); // 通电后延迟200ms,再进行EPROM操作
Iapwritebyte(); // 将4个数据存入单片机内部EPROM中
delay_ms(10);
Iapreadbyte(); // 从EPROM中读取数据
lcd_init(); // 初始化LCD
delay_ms(10);
Display(); // 显示读取的数据
while(1);
}
㈨ 怎样保持单片机的断电后的时间
选一款有EEPROM的单片机,必要时保存就行了,也可以加块电池,扩展一点SRAM来随时保存。
㈩ 单片机断电引脚处于什么状态
每个引脚是不一样的,一般有下面几种:
电平输入脚,一般呈现“高阻”状态;
电平输出脚,呈现“电阻”状态;
控制端,呈现“高阻”状态;
电源脚,呈现“电阻”状态;
晶振端,呈现“高阻”状态;
复位脚,呈现“电阻”状态;
通讯端,呈现“电阻”状态;
读写端,呈现“电阻”状态。