问答
rhjf3887

求一个ds1302时钟芯片的c程序和电路图。最好是能调节时间的。

优质回答

电路图就自己接了,网上大把呢 #include #define Writesecond 0x80 #define Readsecond 0x81 #define Writeminute 0x82 #define Readminute 0x83 #define Writehour 0x84 #define Readhour 0x85 #define Writeday 0x86 #define Readday 0x87 #define Writemonth 0x88 #define Readmonth 0x89 #define Writeweek 0x8a #define Readweek 0x8b #define Writeyear 0x8c #define Readyear 0x8d #define Writeprotect 0x8e #define uchar unsigned char #define uint unsigned int sbit DS1302_CLK=P3^3; sbit DS1302_IO=P3^4; sbit DS1302_RST=P3^5; uchar bdata dsdata; sbit dsbit=dsdata^7; uchar time[3]={19,2,30}; uchar date[4]={12,9,19,3}; uchar Times[]="19:02:00"; uchar Dates[]="2012/05/13"; uchar num[]="0123456789"; /*************写入一字节地址/数据**********/ void DS1302_Writebyte(uchar dat) { uchar i,rdsdata; rdsdata=dat; for(i=0;i<8;i++) { DS1302_CLK=0; _nop_();_nop_();_nop_(); DS1302_IO=(bit)(rdsdata&0x01); DS1302_CLK=1; //上升沿写入数据/地址 _nop_();_nop_();_nop_(); rdsdata>>=1; } } /***************读取一字节数据******************/ uchar DS1302_Readbyte() { uchar i; for(i=0;i<8;i++) { dsbit=DS1302_IO; DS1302_CLK=1; _nop_();_nop_();_nop_();_nop_();_nop_(); dsdata>>=1; DS1302_CLK=0; //下降沿读取数据 _nop_();_nop_();_nop_();_nop_();_nop_(); } return dsdata; } /**************写入数据**********************/ void DS1302_Write(uchar addr,dat) { DS1302_RST=0; //置低,终止数据传递 DS1302_CLK=0; //清空时钟线 DS1302_RST=1; //置高,开始数据传递 DS1302_Writebyte(addr); DS1302_Writebyte(dat); DS1302_CLK=1; DS1302_RST=0; } /***************读取数据****************/ uchar DS1302_Read(uchar addr) { uchar rdsdata,rdsdatah,rdsdatal; DS1302_RST=0; DS1302_CLK=0; DS1302_RST=1; DS1302_Writebyte(addr); rdsdata=DS1302_Readbyte(); DS1302_CLK=1; DS1302_RST=0; rdsdatah=rdsdata/16; //进制转换,十六进制转换为十进制 rdsdatal=rdsdata%16; rdsdata=rdsdatah*10+rdsdatal; return rdsdata; } /**************DS1302初始化***************/ void DS1302_Init(void) { DS1302_Write(Writeprotect,0x00); _nop_();_nop_();_nop_();_nop_();_nop_(); DS1302_Write(Writeprotect,0x80); unsigned char timechange(unsigned char num)//将十进制表示的时间转换为十六进制表示 { unsigned char a; a=num/10*6+num; return a; } void DS1302_Settime(uchar tab[]) //格式:时分秒数值型数组 { DS1302_Write(Writeprotect,0x00); DS1302_Write(Writesecond,timechange(tab[2])); DS1302_Write(Writeminute,timechange(tab[1])); DS1302_Write(Writehour,timechange(tab[0])); DS1302_Write(Writeprotect,0x80); } void DS1302_Setdate(uchar tab[]) //格式:年月日星期数值型数组 { DS1302_Write(Writeprotect,0x00); DS1302_Write(Writeday,timechange(tab[2])); DS1302_Write(Writemonth,timechange(tab[1])); DS1302_Write(Writeyear,timechange(tab[0])); DS1302_Write(Writeweek,timechange(tab[3])); DS1302_Write(Writeprotect,0x80); } void DS1302_Default() //载入初始时间 { DS1302_Write(Writeprotect,0x00); _nop_();_nop_();_nop_();_nop_();_nop_(); DS1302_Write(0x90, 0x03); //失能充电 _nop_();_nop_();_nop_();_nop_();_nop_(); DS1302_Settime(time); DS1302_Setdate(date); DS1302_Write(Writeprotect,0x80); } void Time2Times() { Times[0]=num[time[0]/10]; //时 Times[1]=num[time[0]%10]; Times[3]=num[time[1]/10]; //分 Times[4]=num[time[1]%10]; Times[6]=num[time[2]/10]; //秒 Times[7]=num[time[2]%10]; } void Date2Dates() { Dates[2]=num[date[0]/10]; //年 Dates[3]=num[date[0]%10]; Dates[5]=num[date[1]/10]; //月 Dates[6]=num[date[1]%10]; Dates[8]=num[date[2]/10]; //日 Dates[9]=num[date[2]%10]; } /***************获取时间***************/ void DS1302_Gettime(void) // 获得时分秒信息 { time[0]=DS1302_Read(Readhour); //时 time[1]=DS1302_Read(Readminute); //分 time[2]=DS1302_Read(Readsecond); //秒 Time2Times(); } /***************获取日期***************/ void DS1302_Getdate(void) // 获得年月日星期信息 { date[2]=DS1302_Read(Readday); //日 date[1]=DS1302_Read(Readmonth); //月 date[0]=DS1302_Read(Readyear); //年 date[3]=DS1302_Read(Readweek); //星期 Date2Dates(); }

Tomy492189 2016-09-14
相关问答
相关资讯

问答

登录 | 注册