#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit scl=P1^5;
sbit sda=P1^6;
uchar sec=0,min=0,tt=0;
uchar shum[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //8位扫描显示,共阳数码管
void somenop()
{
uchar i=5;
while(i--)
{
_nop_();
}
}
void delaym()
{
uchar i;
for(i=0;i<0xff;i++);
}
void init()
{
sda=1;
somenop();
scl=1;
somenop();
}
void star()
{
sda=1;
somenop();
scl=1;
somenop();
sda=0;
somenop();
}
void stop()
{
sda=0;
somenop();
scl=1;
somenop();
sda=1;
somenop();
}
void ack()
{
scl=1;
somenop();
scl=0;
somenop();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
scl=0;
somenop();
if((temp&0x80)==0x80)
{ sda=1;}
else
{ sda=0;}
temp=temp<<1;
somenop();
scl=1;
somenop();
scl=0;
somenop();
}
scl=0;
somenop();
sda=1;
somenop();
}
uchar read_byte()
{
uchar i,temp1,j;
scl=0;
somenop();
sda=1;
somenop();
for(i=0;i<8;i++)
{
scl=1;
somenop();
j=sda;
temp1=(temp1<<1)|j;
scl=0;
somenop();
}
return temp1;
}
void write_address(uchar address,uchar date)
{
star();
write_byte(0xa0);
ack();
write_byte(address);
ack();
write_byte(date);
ack();
stop();
}
uchar read_address(uchar address)
{
uchar redata;
star();
write_byte(0xa0);
ack();
write_byte(address);
ack();
star();
write_byte(0xa1);
ack();
redata=read_byte();
stop();
return redata;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
sec++;
write_address(10,sec); delaym(); //把秒写入AT24C02的10地址
if(sec==60)
{ sec=0;
min++;
write_address(100,min); delaym(); //单片机写数据会占用一些时间,所以延时一会儿较好
if(min==60)
{ min=0;
}
}
}
}
/*
void int0(void) interrupt 0
{
EA=0;
min++;
if(min==60)
{
min=0;
}
write_address(100,min); //把分写入AT24C02的100地址
delaym();
EA=1;
}
*/
void disp()
{P2=0X00;
P0=shum[sec%10];//sec 个位
P2=0x01;
delaym();
P2=0X00;
P0=shum[sec/10];//sec 十位
P2=0x02;
delaym();
P2=0X00;
P0=shum[min%10]&0x7f; //加小数点
P2=0x04;
delaym();
P2=0X00;
P0=shum[min/10];
P2=0x08;
delaym();
P2=0X00;
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
init();
EA=1;
sec=read_address(10);//从10地址读出秒数据
min=read_address(100);//从100地址读出分数据
while(1)
{
disp();
}
}
at24c02+c51单片机
需积分: 9 177 浏览量
2010-05-17
11:17:26
上传
评论 1
收藏 21KB RAR 举报
yjp101325
- 粉丝: 1
- 资源: 5