#include <REGX52.H> #include "LCD1602.h" #include "DS1302.h" void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } main() { SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302(); GotoXY(0,0); Print(" tian ma dian zi"); GotoXY(0,1); Print("Time: "); while(1) { DS1302_GetTime(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,1); Print(CurrentTime.TimeString); Delay1ms(400); } } |
人工置顶 |
自顶一下 |
main函数在这 #include"stc15f2k60s2.h" #include"ds1302.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit Wr=P3^6; #define rst573 P2&=0x1f//关闭选中 #define smgY6C P2|=0xc0 //位选 #define smgY7C P2|=0xe0 //段选 #define ledY4C P2|=0x80 //选中LED #define beeY5C P2|=0xa0 //选中蜂鸣器+继电器 sbit k0=P3^0; sbit k1=P3^1; sbit k2=P3^2; sbit k3=P3^3; //行线 sbit k4=P3^4; sbit k5=P3^5; sbit k6=P4^2; sbit k7=P4^4; uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; // 全灭+ 1~8wei uchar code wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 uchar num=0,time; void CHS_BEEP_close() //关闭蜂鸣器继电器 { Wr=0; P2=0x5; P06=1; P04=0; Wr=1; } void delay(uint z)//ms延时函数 { uint x,y; for(x=z;x>0;x--) for(y=1100;y>0;y--); } void display(uchar adt1,uchar adt2,uchar adt3) { P0=0x00; //消影 delay(1); Wr=0; //位选 smgY6C; P0=wei[1]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt1/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[2]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt1%10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[3]; P2=0x1f; Wr=0; smgY7C; //段选 P0=0xbf; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[4]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt2/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[5]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt2%10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[6]; P2=0x1f; Wr=0; smgY7C; //段选 P0=0xbf; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[7]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt3/10]; P2=0x1f; Wr=1; delay(1); Wr=0; //位选 smgY6C; P0=wei[8]; P2=0x1f; Wr=0; smgY7C; //段选 P0=duan[adt3%10]; P2=0x1f; Wr=1; } void keyscan() { if(k0==0){delay(50);if(k0==0)num=0;while(!k0);} if(k1==0){delay(50);if(k1==0)num=1;while(!k1);} } void init_time() { TMOD=0x00; //16位自动重装定时器 TH0=0xec; //定时5MS TL0=0x78; ET0=1; EA=1; TR0=1; } void main() { init_time(); CHS_BEEP_close(); Ds1302_Init(); Ds1302_Write_Time(); Ds1302_Read_Time(); while(1) { keyscan(); if(num)display(time_buf1[1],time_buf1[2],time_buf1[3]);//显示年月日 else display(time_buf1[4],time_buf1[5],time_buf1[6]);//显示时分秒 } } void timer_0() interrupt 1 { time++; if(time==20) //定时读数据 { Ds1302_Read_Time(); time=0; } } |
这是DS1302的驱动文件 #include "ds1302.h" unsigned char time_buf1[8] = {20,15,3,27,18,15,00,5};//空年月日时分秒周 unsigned char time_buf[8]; //空年月日时分秒周 /*------------------------------------------------ 向DS1302写入一字节数据 ------------------------------------------------*/ void Ds1302_Write_Byte(unsigned char addr, unsigned char d) { unsigned char i; RST_SET; //写入目标地址:addr addr = addr & 0xFE; //最低位置零 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; addr = addr >> 1; } //写入数据:d for (i = 0; i < 8; i ++) { if (d & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; d = d >> 1; } RST_CLR;//停止DS1302总线 } /*------------------------------------------------ 从DS1302读出一字节数据 ------------------------------------------------*/ unsigned char Ds1302_Read_Byte(unsigned char addr) { unsigned char i; unsigned char temp; RST_SET; //写入目标地址:addr addr = addr | 0x01;//最低位置高 for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; addr = addr >> 1; } //输出数据:temp for (i = 0; i < 8; i ++) { temp = temp >> 1; if (IO_R) { temp |= 0x80; } else { temp &= 0x7F; } SCK_SET; SCK_CLR; } RST_CLR;//停止DS1302总线 return temp; } /*------------------------------------------------ 向DS1302写入时钟数据 ------------------------------------------------*/ void Ds1302_Write_Time(void) { unsigned char i,tmp; for(i=0;i<8;i++) { //BCD处理 tmp=time_buf1[i]/10; time_buf[i]=time_buf1[i]%10; time_buf[i]=time_buf[i]+tmp*16; } Ds1302_Write_Byte(ds1302_control_add,0x00);//关闭写保护 Ds1302_Write_Byte(ds1302_sec_add,0x80);//暂停 //Ds1302_Write_Byte(ds1302_charger_add,0xa9);//涓流充电 Ds1302_Write_Byte(ds1302_year_add,time_buf[1]);//年 Ds1302_Write_Byte(ds1302_month_add,time_buf[2]);//月 Ds1302_Write_Byte(ds1302_date_add,time_buf[3]);//日 Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周 Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]);//时 Ds1302_Write_Byte(ds1302_min_add,time_buf[5]);//分 Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]);//秒 Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);//周 Ds1302_Write_Byte(ds1302_control_add,0x80);//打开写保护 } /*------------------------------------------------ 从DS1302读出时钟数据 ------------------------------------------------*/ void Ds1302_Read_Time(void) { unsigned char i,tmp; time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);//年 time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);//月 time_buf[3]=(Ds1302_Read_Byte(ds1302_date_add)); //日 time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);//时 time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);//分 time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒 time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);//周 for(i=0;i<8;i++) { //BCD处理 tmp=time_buf[i]/16; time_buf1[i]=time_buf[i]%16; time_buf1[i]=time_buf1[i]+tmp*10; } } /*------------------------------------------------ DS1302初始化 ------------------------------------------------*/ void Ds1302_Init(void) { RST_CLR;//RST脚置低 SCK_CLR;//SCK脚置低 Ds1302_Write_Byte(ds1302_sec_add,0x00); } |