1、通过LED数码管实现不停的加1计数。
2、分别设计暂停健与继续健。
3、通过(IIC)AT 24C02C保存计数数字(Proteus元件库中没有AT24C02,可用FM24C02芯片代替。),以便重启系统后继续计数。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^1;
sbit SDA=P1^0;
uchar Second,total=100;
uchar code DSY_CODE[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar DSY_Buffer[4]={0,0,0,0};
void delay(){ ;; }
void Start()
{
SDA=1;SCL=1;delay();SDA=0;delay();SCL=0;
}
void Stop()
{
SDA=0;SCL=0;delay();SCL=1;delay();SDA=1;
}
void RACK()
{
SDA=1;delay();SCL=1;delay();SCL=0;
}
/*void NO_ACK()
{
SDA=1;SCL=1;delay();SCL=0;SDA=0;
} */
void initint()
{
TMOD = 0x01;
TH0 = 0xee;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
//PX0 = 0;
//PX1 = 1;
}
void initiic()
{
SDA=1;
delay();
SCL=1;
delay();
}
void Write_A_Byte(uchar b)
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;SDA=CY;_nop_();SCL=1;delay();SCL=0;
}
RACK();
}
uchar Receive_A_Byte()
{
uchar i,d;
for(i=0;i<8;i++)
{
SCL=1;d<<=1;d|=SDA;SCL=0;
}
return d;
}
void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(uchar address,uchar date)
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(address);
Write_A_Byte(date);
Stop();
}
uchar read_add(uchar address)
{
uchar date;
Start();
Write_A_Byte(0xa0);
Write_A_Byte(address);
Start();
Write_A_Byte(0xa1);
date=Receive_A_Byte();
Stop();
return date;
}
void main()
{
uchar i,m,Num;
initiic();
initint();
Second=read_add(23);
while(1)
{
Num = Second;
m = 0x7f;
DSY_Buffer[1] = Num/100;
DSY_Buffer[2] = Num/10%10;
DSY_Buffer[3] = Num%10;
DSY_Buffer[0] = 0;
for(i=0;i<4;i++)
{
m = _crol_(m,1);
P2 = m;
P0 = DSY_CODE[DSY_Buffer[i]];
delay1(10);
}
}
}
void timer0() interrupt 1
{
TH0 = 0xee;
TL0 = 0x00;
total--;
if(total <= 0)
{
Second++;
write_add(23,Second);
delay1(100);
total = 100;
}
}
void int0() interrupt 0
{
ET0 = 0;
TR0 = 0;
}
void int1() interrupt 2
{
ET0 = 1;
TR0 = 1;
}
图片: