- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar displaydata[4];
- uchar code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码
- uchar code read_rtc_addr[7] ={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//DS1302读取地址
- uchar code write_rtc_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//DS1302写地址
- //顺序:秒分时日月周年,存储格式为十进制
- uchar time[7]={30,31,11,23,11,4,23};//时间
- bit flicker;//闪烁
- //=======================DS1302引脚===========================
- sbit SCLK=P0^6;
- sbit IO =P0^4;
- sbit RST =P0^5;
- //=======================数码管引脚===========================
- sbit d0=P1^1;//d0~d3 “8”字数码管
- sbit d1=P1^2;
- sbit d2=P1^3;
- sbit d3=P1^4;
- //ACC累加器
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- /***************DS1302有关子函数********************/
- void write_byte(uchar dat)//写一个字节
- {
- uchar i;
- ACC=dat;
- RST=1;
- for(i=8;i>0;i--)
- {
- IO=ACC0;
- SCLK=0;
- SCLK=1;
- ACC>>=1;
- }
- }
- uchar read_byte()//读一个字节
- {
- uchar i;
- RST=1;
- for(i=8;i>0;i--)
- {
- ACC7=IO;
- SCLK=1;
- SCLK=0;
- ACC>>=1;
- }
- return ACC;
- }
- void write_1302(uchar add,uchar dat)//向1302芯片指定地址写入数据
- {
- RST=0;
- SCLK=0;
- RST=1;
- write_byte(add);
- write_byte(dat);
- SCLK=1;
- RST=0;
- }
- uchar read_1302(uchar add)//从1302指定地址读取数据
- {
- uchar temp;
- RST=0;
- SCLK=0;
- RST=1;
- write_byte(add);
- temp=read_byte();
- SCLK=1;
- RST=0;
- return(temp);
- }
- uchar BCD_D(uchar bcd)//BCD码转十进制函数
- {
- return ((bcd>>4)*10)+(bcd & 0x0f);
- }
- uchar D_BCD(uchar Dec)//十进制转BCD码函数
- {
- return (Dec/10*16+Dec%10);
- }
- void rtc_init()//初始化1302
- {
- uchar i,
- RST=0;
- SCLK=0;
- write_1302(0x8e,0x00); //允许写,禁止写保护
- for(i=0;i<7;i++)
- write_1302(write_rtc_addr[i],D_BCD(time[i]));//写1302时钟数据
- write_1302(0x8e,0x80); //打开写保护
- }
- void read_time()//读1302时钟数据
- {
- uchar i;
- write_1302(0x8e,0x00);
- for(i=0;i<7;i++)
- {
- time[i]=BCD_D(read_1302(read_rtc_addr[i]));
- }
- write_1302(0x8e,0x80);
- }
- void data_display()
- {
- static uchar temp;
- static uchar i;
- read_time();
- if(temp!=time[0])
- {
- temp=time[0];
- flicker=1;
- }
- displaydata[0]=smgduan[time[1]%10];
- displaydata[1]=smgduan[time[1]/10];
- if(flicker)
- {
- if(++i>=200)
- {
- i=0;
- flicker=0;
- }
- displaydata[2]=smgduan[time[2]%10]&0x7f;//秒闪点
- }
- else displaydata[2]=smgduan[time[2]%10];
- displaydata[3]=smgduan[time[2]/10];
- }
- void display()
- {
- static uchar i;
- P1&=0xe1;//清位码、消隐
- P2=displaydata[i];//送段码
- P1|=0x02<<i;//送位码
- i=++i%4;//循环计数
- }
- void delay(uint r)
- {
- while(r--);
- }
- void main()
- {
- rtc_init();
- while(1)
- {
- data_display();
- display();
- delay(100);
- }
- }
复制代码
|