单片机/MCU论坛
直播中

刘涛

7年用户 720经验值
私信 关注
[问答]

单片机中模拟I2C总线来控制E2pROM芯片进行掉电保护?

#include
#define uchar unsigned char
#define uint unsigned int
sbit a=P2^2; //138编码器
sbit b=P2^3; //138编码器
sbit c=P2^4; //138编码器
sbit scl=P2^1;
sbit sda=P2^0;
bit write=0;
uchar num1,num;
uchar code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{ ;;}

void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}

void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

unsigned char writebyte (unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
sda=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
delay();
scl=1;
delay();//建立时间>4.7us
scl=0;
delay();//时间大于4us
}
sda=1;
delay();
scl=1;
while(sda)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
scl=0;
delay();
return 0;
}
}
scl=0;
delay();
return 1;
}

uchar readbyte()
{
uchar i,k;
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
delay();
scl=0;
delay();
}
return k;
}

void write_byte(uchar address,uchar date)
{
start();
writebyte(0xa0);
writebyte(address);
writebyte(date);
stop();
}

uchar read_byte(uchar address)
{
uchar date;
start();
writebyte(0xa0);
writebyte(address);
start();
writebyte(0xa1);
date=readbyte();
stop();
return date;
}

void display(uchar shi,uchar ge)
{

a=0;
b=0;
c=0;
P0=d[ge]; // 将数据送到P0口的数码管

P0=0;
a=1;
b=0;
c=0;
P0=d[shi];
P0=0;

}

void ahead()
{
sda=1;
delay();
scl=1;
delay();
}

void main()
{
ahead();
num=read_byte(2);
if(num>100)
num=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65336-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display(num/10,num%10);
if(write==1)
{
write=0;
write_byte(2,num);
}
}
}
void t0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65336-50000)%256;
num1++;
if(num1==20)
{
num1=0;
write=1;
num++;
if(num==100)
num=0;
}
}

无法进行掉电后数据的保护

回帖(3)

陈伟

2023-5-8 17:48:53
上面的代码读取,写入功能可以实现了?先要确定IIC通信部分没问题了,再走下一步。。。
举报

刘涛

2023-5-8 17:49:02
难道我的代码有问题?
举报

陈伟

2023-5-8 17:49:09
就这么看也不好判断是不是代码问题,,但是我发现你那个num变量中断里又动过。。。。
能不能先写入固定的值比如128,再读取看看读到的是不是128?如果可以了,再在别的地方用这个代码来进行掉电保护什么的。。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分