#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit rst=P2^6;//定义时钟芯片的复位端 相当于片选信号或使能端
sbit scl=P2^5;//定义时钟线
sbit io=P2^4;//定义数据线
sbit duanma=P2^0;//定义段锁存
sbit weima=P2^1;//定义位锁存
uchar code duanm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//段码
uchar code weim[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位码
uchar time_data[7]={12,7,2,5,20,30,30};//年周月日时分秒 //初始化时钟芯片ds1302数组
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //写的“年周月日时分秒”寄存器地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //读的“年周月日时分秒”寄存器地址
uchar pro[8],t;
void delay(uint t);//延时函数
void write_ds1302_byte(uchar date);//单字节写入函数
void write_ds1302(uchar add,uchar date);//双字节写入函数 先写地址再写数据
uchar read_ds1302(uchar add); //读出函数
void set_rtc();//时钟芯片ds1302初始化函数
void read_rtc();//读出时钟芯片ds1302的时间数据
void time_pros();//数据处理函数 将十六进制转化为十进制
void display();//数码管显示函数
void main()
{
//TMOD=0X01;
//TH0=(65536-50000)/256;
//TL0=(65536-50000)%256;
//EA=1;
//ET0=1;
//TR0=1;
//set_rtc();
while(1)//死循环 实现数码管时间的实时更新
{
read_rtc();
time_pros();
display();
}
}
//void timer0() interrupt 1
//{
//TH0=(65536-60000)/256;
//TL0=(65536-60000)%256;
//t++;
//}
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=10;y>0;y--);
}
void write_ds1302_byte(uchar date)
{
uchar i;
for(i=0;i<8;i++)//数据是由地位开始读
{
scl=0;
io=date&0x01;
date=date>>1;
scl=1;
}
}
void write_ds1302(uchar add,uchar date)
{
rst=0;
_nop_();
scl=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(date);
rst=0;
_nop_();
io=1;
scl=1;
}
uchar read_ds1302(uchar add)
{
uchar i,val;
rst=0;
_nop_();
scl=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)//数据由低位开始读取
{
val=val>>1;
scl=0;
if(io)
val=val|0x80;// 不能用val=(val>>1)|io;因为val=(val>>1)|io是将val的高位与io或
scl=1;
}
rst=0;
_nop_();
scl=0;
_nop_();
scl=1;
io=1;
return(val);
}
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++)//转化为十六制
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);//加写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()//将十六进制数转化为十进制数
{
pro[0]=time_data[6]%16;
pro[1]=time_data[6]/16;
pro[2]=16;
pro[3]=time_data[5]%16;
pro[4]=time_data[5]/16;
pro[5]=16;
pro[6]=time_data[4]%16;
pro[7]=time_data[4]/16;
}
void display()
{
uchar i;
P0=0;
for(i=0;i<8;i++)
{
//if(t==1)
//{
// t=0;
duanma=1;
P0=duanm[pro[i]];
duanma=0;
;;;;;;;;;
weima=1;
P0=weim[i];
weima=0;
delay(22);
//}
}
}