|
|
| | -文章搜索 - 最新文章 - | |
带温度测量的LCD显示的实时时钟 |
| 发布时间:2006年7月23日 点击次数:1356 |
| 来源: 作者: |
/*********************************************************** SP0605-51/AVR单片机学习实验开发系统实验例程(30) 此实验属于综合实验类,将LCD显示,温度测量,实时时钟等内容结合起来,构成一个复杂 的实验系统,完成在LCD上显示日历和环境温度,可以用于家庭的信息提示和监测系统 通过此实验可以掌握LCD显示的驱动程序的设计和编程方法 通过此实验可以掌握DS18B20的温度测量的驱动程序设计和编程方法 通过此实验可以掌握DS1302的实时时钟的驱动程序设计和编程方法 supermcu@126.com www.supermcu.com 作者(Author):孙安青(Sun An-Qing) 西谱电子(西谱单片机电子网) SP0605-51/AVR单片机学习实验开发系统 ***************************************************************************/ #include <REGX51.H> #include "16x2LCDDriver.h" //LCD头文件 #include "DS18B20Driver.h" //DS18B20头文件 #include "DS1302Driver.h" //DS1302头文件 struct TimerStruct //定义时钟的数据结构 { unsigned char Year; unsigned char Month; unsigned char Day; unsigned char Week; unsigned char Hour; unsigned char Minute; unsigned char Second; }; unsigned char DateBuffer[]={" unsigned char TimeBuffer[]= {"00:00:00"}; unsigned char LCDDisplayBuffer[]={" "}; unsigned int SecondCounter;//秒计数器(无符号整型) void timer0(void) interrupt 1//定时T0溢出中断,每25mS产生一次中断 { unsigned int Temp; unsigned char TemperatureH; unsigned char TemperatureL; struct TimerStruct RealClock; TH0=(65536-46080)/256;//重新装入定时25mS的初值到TH0,TL0 TL0=(65536-46080)%256; SecondCounter++;//秒计数器加1 if(SecondCounter==40)//到40,表示1S时间到 { SecondCounter=0; while(DS18B20_Reset());//向DS18B20发复位命令 DS18B20_Write(0xCC); //向DS18B20发读数据命令 DS18B20_Write(0xBE); TemperatureL=DS18B20_Read();//读DS18B20的第1个BYTE TemperatureH=DS18B20_Read();//读DS18B20的第2个Byte while(DS18B20_Reset());//向DS18B20发复位命令 DS18B20_Write(0xCC);//向DS18B20发启动温度转换开始命令 DS18B20_Write(0x44); //----以下是关于读取DS18B20的数据时行处理,并将结果显示出来 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&=0x Temp*=625; Temp/=100; LCDDisplayBuffer[3]=''.''; LCDDisplayBuffer[4]=Temp/10+0x30; LCDDisplayBuffer[5]=Temp%10+0x30; LCDDisplayBuffer[6]=''C''; //---以下是读取DS1302的时钟信息,并将结果存储到显示缓冲区中 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(0x Write_DS1302_RTC(0x Write_DS1302_RTC(0x8e,0x80); while(1) { ; } } |
|
|
|
|
[单片机] 相关文章: 单片机控制实时时钟X1226的应用设计简介:
X1226具有时钟和日历的功能,时钟依赖时、分、秒寄存器来跟踪,日历依赖日期、星期、月和年寄存器来跟踪,日历可正确通过2099年,具有自动闰年修正。 拥有强大的双报警功能,能够被设置到任何时钟/日历值上,精确度可到ls。可用软件设置1 Hz,4096 Hz或32768Hz中任意一个频率输出。 该器件提供一个备份电源输入脚VBACK1允许器件用电池或大容量电容备份供电。许多电池类型能够用做Xicor公司实时时钟器件X1226的备份电池,3.O...... 液晶显示模块TC1602A与单片机的接口技术
[转载]嵌入式系统设计方法的演化—— 从单片机到单片系统
[转载]嵌入式实时操作系统的现状和未来
GPS术语缩写
电磁炉精确测温技术现状与发展方向
SPMC65P2404A在电磁炉中的应用(凌阳)
HT46R22单片机在电磁炉功率控制中的应用
基于SN8P1706芯片的电磁炉(源程序)(sonix)
A51 4.1.3 堆栈段(Stack Segment) |
|
|
|