AT89C52单片机掉电存储程序的电路与程序代码
时间: 2023-11-09 12:04:48 浏览: 99
51单片机STC89C52RC开发板例程之AT24C02(EEPROM)保存计时数程序源代码.rar
AT89C52单片机掉电存储程序的实现需要使用外部EEPROM或Flash存储器。以下是一个基于AT89C52的掉电存储程序的电路和程序示例:
电路图:
![AT89C52掉电存储程序电路图](https://img-blog.csdnimg.cn/20200908110710593.png)
程序代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^7; //IIC时钟线
sbit SDA=P1^6; //IIC数据线
sbit LED=P2^0; //测试LED
//AT24C02 IIC总线地址
#define EEPROM_ADD 0xA0
//AT24C02地址计算
uchar addr=0x00;
uchar eeprom_address(uchar addr)
{
return ((EEPROM_ADD&0xfe)|((addr>>7)&0x01));
}
//IIC起始信号
void iic_start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//IIC停止信号
void iic_stop()
{
SDA=0;
SCL=1;
SDA=1;
}
//IIC应答信号
void iic_ack()
{
SDA=0;
SCL=1;
SCL=0;
SDA=1;
}
//IIC非应答信号
void iic_nack()
{
SDA=1;
SCL=1;
SCL=0;
SDA=1;
}
//IIC发送一个字节
void iic_send_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SDA=dat&0x80;
SCL=1;
SCL=0;
dat<<=1;
}
}
//IIC接收一个字节
uchar iic_receive_byte()
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
dat|=SDA;
SCL=0;
}
return dat;
}
//写入EEPROM
void eeprom_write(uchar addr,uchar dat)
{
iic_start();
iic_send_byte(eeprom_address(addr));
iic_ack();
iic_send_byte(addr&0xff);
iic_ack();
iic_send_byte(dat);
iic_ack();
iic_stop();
}
//读取EEPROM
uchar eeprom_read(uchar addr)
{
uchar dat;
iic_start();
iic_send_byte(eeprom_address(addr));
iic_ack();
iic_send_byte(addr&0xff);
iic_ack();
iic_start();
iic_send_byte(eeprom_address(addr)|0x01);
iic_ack();
dat=iic_receive_byte();
iic_nack();
iic_stop();
return dat;
}
//延时函数
void delay(uint t)
{
uint i;
for(i=0;i<t;i++);
}
//主函数
void main()
{
uchar i,d;
for(i=0;i<10;i++)
{
eeprom_write(i,i+1); //将数据写入EEPROM
delay(1000); //延时1s
}
while(1)
{
d=eeprom_read(addr); //从EEPROM读取数据
LED=d; //测试LED
delay(500); //延时500ms
addr++; //地址自增
if(addr>9) //地址溢出
addr=0x00;
}
}
```
这个程序将数字1~10写入EEPROM的0~9地址中,并且在程序运行时从EEPROM中读取数据并在LED上显示。当地址达到9时,地址将自动溢出到0。
阅读全文