無標(biāo)題.jpg (140.43 KB, 下載次數(shù): 37)
下載附件
2023-11-23 13:47 上傳
- #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};//共陽數(shù)碼管編碼
- 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;
- //=======================數(shù)碼管引腳===========================
- sbit d0=P1^1;//d0~d3 “8”字?jǐn)?shù)碼管
- sbit d1=P1^2;
- sbit d2=P1^3;
- sbit d3=P1^4;
- //ACC累加器
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- /***************DS1302有關(guān)子函數(shù)********************/
- void write_byte(uchar dat)//寫一個字節(jié)
- {
- uchar i;
- ACC=dat;
- RST=1;
- for(i=8;i>0;i--)
- {
- IO=ACC0;
- SCLK=0;
- SCLK=1;
- ACC>>=1;
- }
- }
- uchar read_byte()//讀一個字節(jié)
- {
- 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芯片指定地址寫入數(shù)據(jù)
- {
- RST=0;
- SCLK=0;
- RST=1;
- write_byte(add);
- write_byte(dat);
- SCLK=1;
- RST=0;
- }
- uchar read_1302(uchar add)//從1302指定地址讀取數(shù)據(jù)
- {
- 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碼轉(zhuǎn)十進制函數(shù)
- {
- return ((bcd>>4)*10)+(bcd & 0x0f);
- }
- uchar D_BCD(uchar Dec)//十進制轉(zhuǎn)BCD碼函數(shù)
- {
- 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時鐘數(shù)據(jù)
- write_1302(0x8e,0x80); //打開寫保護
- }
- void read_time()//讀1302時鐘數(shù)據(jù)
- {
- 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;//循環(huán)計數(shù)
- }
- void delay(uint r)
- {
- while(r--);
- }
- void main()
- {
- rtc_init();
- while(1)
- {
- data_display();
- display();
- delay(100);
- }
- }
復(fù)制代碼
|