|
#include <REGX51.H> #include "16x2LCDDriver.h" //LCD頭文件 #include "DS18B20Driver.h" //DS18B20頭文件 #include "DS1302Driver.h" //DS1302頭文件 struct TimerStruct //定義時鐘的數(shù)據(jù)結(jié)構(gòu) { unsigned char Year; unsigned char Month; unsigned char Day; unsigned char Week; unsigned char Hour; unsigned char Minute; unsigned char Second; }; unsigned char DateBuffer[]={"2005/01/01"}; unsigned char TimeBuffer[]= {"00:00:00"}; unsigned char LCDDisplayBuffer[]={" "}; unsigned int SecondCounter;//秒計數(shù)器(無符號整型) void timer0(void) interrupt 1//定時T0溢出中斷,每25mS產(chǎn)生一次中斷 { unsigned int Temp; unsigned char TemperatureH; unsigned char TemperatureL; struct TimerStruct RealClock; TH0=(65536-46080)/256;//重新裝入定時25mS的初值到TH0,TL0 TL0=(65536-46080)%256; SecondCounter++;//秒計數(shù)器加1 if(SecondCounter==40)//到40,表示1S時間到 { SecondCounter=0; while(DS18B20_Reset());//向DS18B20發(fā)復(fù)位命令 DS18B20_Write(0xCC); //向DS18B20發(fā)讀數(shù)據(jù)命令 DS18B20_Write(0xBE); TemperatureL=DS18B20_Read();//讀DS18B20的第1個BYTE TemperatureH=DS18B20_Read();//讀DS18B20的第2個Byte while(DS18B20_Reset());//向DS18B20發(fā)復(fù)位命令 DS18B20_Write(0xCC);//向DS18B20發(fā)啟動溫度轉(zhuǎn)換開始命令 DS18B20_Write(0x44); //----以下是關(guān)于讀取DS18B20的數(shù)據(jù)時行處理,并將結(jié)果顯示出來 Temp=TemperatureH*256+TemperatureL; if(Temp & 0xf800) { LCDDisplayBuffer[0]=''-''; Temp=(~Temp)+1; TemperatureL=Temp%256; TemperatureH=Temp/256; } Temp>>=4; LCDDisplayBuffer[1]=Temp/10+0x30; LCDDisplayBuffer[2]=Temp%10+0x30; Temp=TemperatureL; Temp&=0x000F; Temp*=625; Temp/=100; LCDDisplayBuffer[3]=''.''; LCDDisplayBuffer[4]=Temp/10+0x30; LCDDisplayBuffer[5]=Temp%10+0x30; LCDDisplayBuffer[6]=''C''; //---以下是讀取DS1302的時鐘信息,并將結(jié)果存儲到顯示緩沖區(qū)中 Temp=Read_DS1302_RTC(0x81);//讀秒信息 RealClock.Second=Temp; TimeBuffer[7]=Temp%16+0x30; TimeBuffer[6]=Temp/16+0x30; Temp=Read_DS1302_RTC(0x83);//讀分信息 RealClock.Minute=Temp; TimeBuffer[4]=Temp%16+0x30; TimeBuffer[3]=Temp/16+0x30; Temp=Read_DS1302_RTC(0x85);//讀時信息 RealClock.Hour=Temp; TimeBuffer[1]=Temp%16+0x30; TimeBuffer[0]=Temp/16+0x30; Temp=Read_DS1302_RTC(0x87);//讀日信息 RealClock.Day=Temp; DateBuffer[9]=Temp%16+0x30; DateBuffer[8]=Temp/16+0x30; Temp=Read_DS1302_RTC(0x89);//讀月信息 RealClock.Month=Temp; DateBuffer[6]=Temp%16+0x30; DateBuffer[5]=Temp/16+0x30; Temp=Read_DS1302_RTC(0x8d);//讀年信息 RealClock.Year=Temp; DateBuffer[3]=Temp%16+0x30; DateBuffer[2]=Temp/16+0x30; //---送到LCD上顯示出來 lcd_displaystr_ram(0,3,DateBuffer);//刷新LCD上的日期信息 lcd_displaystr_ram(1,1,TimeBuffer);//刷新LCD上的時間顯示信息 lcd_displaystr_ram(1,sizeof(TimeBuffer),LCDDisplayBuffer); } } void main(void) { TMOD=0x01;//T0工作于16位定時功能 TH0=(65536-46080)/256;//T0定時25mS的初值裝入TH0,TL0 TL0=(65536-46080)%256; TR0=1;//啟動T0開始工作 ET0=1;//允許T0溢出中斷 EA=1;//CPU開中斷 initize_lcd();//初始化LCD Init_DS1302_RTC();//初始化DS1302 //clock initize Write_DS1302_RTC(0x8e,0x00); Write_DS1302_RTC(0x80,0x00); Write_DS1302_RTC(0x82,0x55); Write_DS1302_RTC(0x84,0x11); Write_DS1302_RTC(0x86,0x16); Write_DS1302_RTC(0x88,0x11); Write_DS1302_RTC(0x8a,0x05); Write_DS1302_RTC(0x8c,0x05); Write_DS1302_RTC(0x8e,0x80); while(1) { ; } } |