|
DS1302 須要BCD處理
- #include "reg51.h"
- #define ds1302_sec_add 0x80 //秒數(shù)據(jù)地址
- #define ds1302_min_add 0x82 //分?jǐn)?shù)據(jù)地址
- #define ds1302_hr_add 0x84 //時(shí)數(shù)據(jù)地址
- #define ds1302_date_add 0x86 //日數(shù)據(jù)地址
- #define ds1302_month_add 0x88 //月數(shù)據(jù)地址
- #define ds1302_day_add 0x8a //星期數(shù)據(jù)地址
- #define ds1302_year_add 0x8c //年數(shù)據(jù)地址
- #define ds1302_control_add 0x8e //控制數(shù)據(jù)地址
- #define ds1302_charger_add 0x90
- #define ds1302_clkburst_add 0xbe
- sbit RST= P3^5;
- sbit SCLK= P3^6;
- sbit DPIO= P3^4;
- unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- unsigned char time[7];
- void delay()
- {
- unsigned char i;
- unsigned char j;
- for(i=0;i<6;i++)
- for(j=0;j<6;j++);
- }
- void sendbyte(unsigned char addr ,unsigned char dat)
- {
- unsigned char i;
- RST =0;
- delay();
- SCLK =0;
- delay() ;
- RST =1;
- delay();
- for(i=0;i<8;i++)
- {
- DPIO=addr&0x01;
- addr>>=1;
- SCLK =1;
- delay();
- SCLK =0;
- delay();
- }
- for(i=0;i<8;i++)
- {
- DPIO=dat&0x01;
- dat>>=1;
- delay();
- SCLK =1;
- delay();
- delay();
- SCLK =0;
- delay();
- }
- RST=0;
- delay();
- SCLK =0;
- delay();
- }
- unsigned char read(unsigned char addr)
- {
- unsigned char i;
- unsigned char dat;
- unsigned char tmp;
- RST =0;
- delay();
- SCLK =0;
- RST =1;
- delay();
- for(i=0;i<8;i++)
- {
- DPIO=addr&0x01;
- addr>>=1;
- SCLK =1;
- delay();
- SCLK =0;
- delay();
- }
- for(i=0;i<8;i++)
- {
- DPIO=tmp;
- dat|=tmp<<7;
- SCLK =1;
- delay();
- SCLK =0;
- delay();
- }
- RST=0;
- delay();
- SCLK =0;
- delay();
- DPIO = 0;
- delay();
- return dat;
- }
- void read_reg()
- {
- unsigned char i, tmp;
- unsigned char time_buf[8] ;
- for(i=0;i<8;i++)
- {
- time_buf[i]=read( READ_RTC_ADDR[i]);
- }
- for(i=0;i<8;i++)
- { //BCD處理
- tmp=time_buf[i]/16;
- time[i]=time_buf[i]%16;
- time[i]=time[i]+tmp*10;
- }
- }
- void write()
- {
- unsigned char i, tmp;
- unsigned char time_buf[8] ;
- sendbyte(0x8e,0x00);
- time[0]=0x30;
- time[1]=0x35;
- time[2]=0x20;
- time[3]=0x25;
- time[4]=0x05;
- time[5]=0x05;
- time[6]=0x18;
- for(i=0;i<7;i++)
- { //DS1302 須要BCD處理
- tmp=time[i]/10;
- time_buf[i]=time[i]%10;
- time_buf[i]=time_buf[i]+tmp*16;
- }
- for(i=0;i<7;i++)
- {
- sendbyte(WRITE_RTC_ADDR[i],time_buf[i]);
- delay();
- }
- sendbyte(0x8E, 0x80);
- }
- void uart_init(void)
- {
- // 波特率9600
- SCON = 0x50; // 串口工作在模式1(8位串口)、允許接收
- PCON = 0x00; // 波特率不加倍
- // 通信波特率相關(guān)的設(shè)置
- TMOD = 0x20; // 設(shè)置T1為模式2
- TH1 = 253;
- TL1 = 253; // 8位自動(dòng)重裝,意思就是TH1用完了之后下一個(gè)周期TL1會(huì)
- // 自動(dòng)重裝到TH1去
- TR1 = 1; // 開(kāi)啟T1讓它開(kāi)始工作
- }
- // 通過(guò)串口發(fā)送1個(gè)字節(jié)出去
- void uart_send_byte(unsigned char c)
- {
- // 第1步,發(fā)送一個(gè)字節(jié)
- SBUF = c;
- // 第2步,先確認(rèn)串口發(fā)送部分沒(méi)有在忙
- while (!TI);
- // 第3步,軟件復(fù)位TI標(biāo)志位
- TI = 0;
- }
- void main()
- {
- unsigned char k;
- uart_init();
- write();
-
- while(1)
- {
- read_reg();
- for(k=0;k<7;k++)
- {
- uart_send_byte(time[k]);
- }
- delay();
- }
- }
復(fù)制代碼 |
|