IIC具有回忆功用,其实之前没有体会好为什么会回忆,由于编的程序是让灯闪耀的,所以了解不出它能够所谓回忆的原理,今日经过数码管让其回忆单片机开机次数,总算明日了它的真实原理,其实是单片机操控它的时分,程序不断运转,把程序运转得到的数据不断地写入IIC寄存器中,而寄存器是掉电后不数据不会丢掉的,所以当咱们把程序关了,也便是掉电了今后数据被保存了下来,下次再开机运转的时分,程序是从头开端的,可是地址是从咱们前次咱们寄存器贮存地址开端的,所以就达到了回忆的功用。这个的应用在数据的存储和维护是很大的,比方交通灯回忆违章车辆,账户贮存,数据累积等能够靠它进行贮存。
下面是IIC回忆单片机开机次数的程序:
程序如下:
//版权所有:单片机网http://www.51hei.com
#include
#include
#define uchar unsigned char//宏界说
#define uint unsigned int
sbit scl=P2^0;//这两个位界说是操控IIC的引脚
sbit sda=P2^1;
uchar number[10]={ //数码管数组界说
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f
};
void delayt(void)//数码管的延时
{
uint x,y;
for(x=0;x<5;x++)
for(y=0;y<120;y++);
}
void delay(void)//IIC的习惯延时
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void start()//开端
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//中止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void init()//初始化设置
{
sda=1;
scl=1;
}
void answer()//应对
{
uchar i;
scl=1;
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void noanser()//非应对
{
scl=1;
delay();
sda=1;
delay();
scl=0;
delay();
}
void writebyte(uchar dat)//写字节
{
uchar i;
scl=0;
delay();
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
}
uchar readbyte()//读字节
{
uchar i,dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
delay();
}
return dat;
}
void write_byte(uchar add,uchar dat)//写字节的封装
{
init();
start();
writebyte(0xae);
answer();
writebyte(add);
answer();
writebyte(dat);
answer();
stop();
}
uchar read_byte(uchar add)//读字节的封装
{
uchar value;
init();
start();
writebyte(0xae);
answer();
writebyte(add);
answer();
start();
writebyte(0xaf);
answer();
value=readbyte();
noanser();
stop();
return value;
}
void main()
{
uchar temp,k,j;
temp=read_byte(0x10);//数码管个位和十们的操作
k=temp/10;
j=temp%10;
temp++;
write_byte(0x10,temp);
delay();
while(1)//数码管显现
{
P1=number[k];
P0=0;
delayt();
P1=number[j];
P0=1;
delayt();
}
}