#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); //} } }