基于51单片机带温度显示的液晶万年历

合集下载

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。

此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。

STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。

此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。

所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。

关键词:单片机;DS1302;DS18B20;LCD1602ABSTRACTWith the social progress and development, Electronic calendar is widely used as a daily timing tool. The electronic calendar in hardware using STC89C51 microcontroller as the main control center, provided by the DS1302 clock chip and 1602LCD LCD display. STC89C51 microcontroller is produced by the macro crystal company, small power consumption, the voltage can be choosen among 3.4V ~ 5.5V for power supply; DS1302 clock chip is a low power real-time clock chip produced by DALLAS, it can be a time of years,months,days,weeks,hours,minutes,seconds, and DS1302 has a long service life. The error is small; for the digital electronic calendar using visual digital display, 1602LCD digital display is used to display LCD screen that can display years, months, days, weeks, hours, minutes and seconds, temperature and other information. In addition, the electronic calendar mainly includes calendar program,time to adjust procedures,display program etc in sofeware. After the completion of all the procedures, in the Keil software debugging, determine no problem after, and burning to the microcontroller test.The curriculum design mainly by the clock chip DS1302 and temperature sensor DS18B20 collecting data to the microcontroller for processing and then through the LCD1602 display, this design mainly studies the liquid crystal display LCD and the clock chip DS1302, the hardware connection and communication between the temperature sensor DS18B20 and the MCU, a number of hardware connection scheme for a detailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602目录第一章绪论 ------------------------------------------------------------------------------------------------------------ - 1 -1.1 单片机的概述------------------------------------------------------------------------------------------------- - 1 -1.1.1 单片机的概念 --------------------------------------------------------------------------------------- - 1 -1.1.2 单片机的特点 --------------------------------------------------------------------------------------- - 1 -1.2 课题背景 ------------------------------------------------------------------------------------------------------- - 1 -1.3 课题内容 ------------------------------------------------------------------------------------------------------- - 2 - 第二章设计要求和方案 --------------------------------------------------------------------------------------------- - 3 -2.1 设计要求 ------------------------------------------------------------------------------------------------------- - 3 -2.2 设计方案 ------------------------------------------------------------------------------------------------------- - 3 -2.2.1 单片机芯片的选择--------------------------------------------------------------------------------- - 3 -2.2.2 各模块方案选择 ------------------------------------------------------------------------------------ - 3 -2.3 工作原理 ------------------------------------------------------------------------------------------------------- - 4 - 第三章系统的硬件设计及实现------------------------------------------------------------------------------------ - 7 -3.1 电路设计原理框图 ------------------------------------------------------------------------------------------ - 7 -3.2 STC89C51单片机的介绍 ----------------------------------------------------------------------------------- - 7 -3.2.1 主要功能及性能参数 ----------------------------------------------------------------------------- - 7 -3.2.2单片机的引脚功能说明 --------------------------------------------------------------------------- - 8 -3.3 各模块电路的设计及原理图 ----------------------------------------------------------------------------- - 9 -3.3.1 时钟电路模块的设计 ----------------------------------------------------------------------------- - 9 -3.3.2 温度采集模块的设计及原理图 --------------------------------------------------------------- - 11 -3.3.3 显示模块的设计及原理 ------------------------------------------------------------------------- - 11 - 第四章系统的软件设计 -------------------------------------------------------------------------------------------- - 13 -4.1 程序流程框图------------------------------------------------------------------------------------------------ - 13 -4.2 时间调整程序流程图 -------------------------------------------------------------------------------------- - 14 - 第五章系统测试 ------------------------------------------------------------------------------------------------------ - 15 -5.1 硬件测试 ------------------------------------------------------------------------------------------------------ - 15 -5.2 软件测试 ------------------------------------------------------------------------------------------------------ - 15 - 第六章总结与致谢 --------------------------------------------------------------------------------------------------- - 17 -6.1 总结------------------------------------------------------------------------------------------------------------- - 17 -6.2 致谢------------------------------------------------------------------------------------------------------------- - 18 - 参考文献 ------------------------------------------------------------------------------------------------------------------- - 19 - 附录 ------------------------------------------------------------------------------------------------------------------------ - 21 - 附录一:实物图 --------------------------------------------------------------------------------------------------- - 21 - 附录二:源程序 --------------------------------------------------------------------------------------------------- - 23 -第一章绪论1.1 单片机的概述1.1.1 单片机的概念单片机即单片微型计算机,是把中央处理器、存储器、定时/计数器、输入输出接口都集成在一块集成电路芯片上的微型计算机。

基于stc51单片机的LCD1602显示时间的电子万年历(显示

基于stc51单片机的LCD1602显示时间的电子万年历(显示

1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。

Keil C51开发系统基本知识Keil C51开发系统基本知识1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍Keil C51开发系统各部分功能和使用。

2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

基于单片机带温度显示的液晶万年历

基于单片机带温度显示的液晶万年历

摘要在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。

考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。

温度显示精度达到0.1摄氏度。

关键词:单片机 DS18B20 万年历温度1.硬件工作介绍(1)上电自动复位及手动复位电路STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。

本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。

(2)时钟振荡电路作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。

(3)1602液晶显示接口1602采用标准的16脚接口(见附图),其中:第1脚:GND为地电源第2脚:VCC接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:VCC第16:GND(4)键盘键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。

S4对所选中的对象进行加一调整,而S5对所选对象进行减一调整。

基于51单片机的万年历

基于51单片机的万年历

基于51单片机的万年历摘要本篇论文主要介绍了运用单片机实现电子万年历的设计,其中51单片机作为对系统的主要控制器,由DS1302完成对时钟电路的显示和DS18B20对温度的检测。

设计主要由时钟电路模块、稳压电路模块、液晶显示模块、温度测试模块组成。

实现了年、月、日、星期、温度显示,及闹钟报警的功能。

这个设计具有体积小,简单方便,功能齐全,精度高等特点。

关键词51单片机;时钟芯片;温度显示;闹钟设置AbstractThis paper mainly introduces the realization of electronic calendar application of the design of SCM,51 MCU as the main controller of the system,DS1302 completed by the clock circuit display and temperature test DS18B20。

Designed for use mainly by the clock circuit module, voltage regulator circuit module, liquid crystal display module, temperature measurement modules。

Achieved a year, month, day, week, temperature display, and alarm clock function。

This design is small, simple and convenient, complete functions and high accuracy。

Key words51 MCU;Clock chip;Temperature display;Alarm clock settings目录1. 引言................................................ 错误!未定义书签。

基于51单片机的万年历设计

基于51单片机的万年历设计

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。

51 单片机作为核心控制器,负责整个系统的运行和数据处理。

时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。

二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。

2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。

3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。

4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。

三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。

然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。

接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。

2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。

3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。

4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。

四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。

在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。

设置完成后,将新的时间数据保存到时钟芯片中。

五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。

通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。

六、系统调试在完成硬件和软件设计后,需要对系统进行调试。

基于51单片机的温度报警和万年历

基于51单片机的温度报警和万年历
uchar code table2[]={" : : "};
uchar num,miao,a,fen,shi,tt,date,s1sum,nian,yue,ri,week,i,temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
while(i--);
}
}
void ds18b20changtemp() //转换温度
{
ds18b20init();
delay1ms(1);
ds18b20write(0xcc); //跳过rom操作
ds18b20write(0x44); //温度转换命令
}
/*
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char ds18b20init()
{
unsigned int i;
ds=0; //总线拉低480us-960us
i=70;
while(i--); //延时642us
ds=1; //然后拉高总线,ds18b20做出反应会在15——60us后总线拉高
i=0;
while(ds)
{
i++;
ye1602init();
if(temp<0)
{
writecom(0x80+0x40+11);
writedate('-');

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统摘要随着社会发展需求的改变,电子万年历是一个应用非常广泛的实用日常计时工具,带有显示世纪,年,月,日,星期,时,分,秒和按键可调时间及其按键设置闹钟的功能,同时具有月末自动更新,闰年补偿功能等多种功能。

温度检测报警系统也是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。

此系统是基于STC89C52单片机设计的,包含液晶显示模块,DS12C887实时时钟模块,DS18B20温度采集模块,键盘扫描模块,报警模块,HX1838红外接收头模块。

STC89C52作为控制核心,具有功耗低,功能强等特点,电压可选5VUSB 供电。

显示模块采用12864液晶动态显示,相对数码管而言经济实用,占用空间小,对于显示数字、字母最为合适,而且与单片机连线简单,占用IO口相对较少。

实时时钟芯片DS12C887是一款与DS12C885实时时钟兼容的替代产品,该器件提供RTC/日历、定时闹钟等功能,如果检测到主电源故障,该器件可自动切换到备用电源供电,DS12C887将石英晶体与电池集成在一起,在断电后仍可精确走10年。

温度检测报警模块采用数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优点,易与单片机连接,模块电路组成简单并同时具有温度报警功能。

关键词:STC89C52,DS12C887,DS18B20,12864液晶显示,电子万年历,采集周围设备温度、温度报警一、设计要求与方案论证1.1设计要求设计一个能够实现世纪,年,月,日,星期,小时,分,秒显示附带温度检测显示的实时时钟电子万年历,同时具有时间调节和闹钟设置功能,以及时间预设报警、温度报警、报警解除等功能。

该产品共设有四个按键,每个按键具有多种功能,充分利用各个按键。

也可利用红外遥控来进行实时调节,体现时尚方便的特性,并且通过编程还可以控制12864液晶显示,随心所欲。

基于51单片机的12864液晶显示的万年历

基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。

考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。

温度显示精度达到0.1摄氏度。

关键词:单片机 DS18B20 万年历温度1.硬件工作介绍(1)上电自动复位及手动复位电路STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。

本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。

(2)时钟振荡电路作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。

(3)1602液晶显示接口1602采用标准的16脚接口(见附图),其中:第1脚:GND为地电源第2脚:VCC接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:VCC第16:GND(4)键盘键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。

S4对所选中的对象进行加一调整,而S5对所选对象进行减一调整。

(5)蜂鸣器对温度进行测量,高低温超限报警,正常温度在15.0-36.0摄氏度,超过最高或低于最低温度就会鸣叫报警。

2.软件工作介绍由于C语言功能丰富,表达能力和可移植能力强,而且操作方便,简单易懂,因此软件部分由C语言编写,程序的重点和难点是闰月的时间调整以及键盘对时间的调整,恳请老师指正。

主程序流程图设计总结在制作的过程中,因为板子是在学校自己动手做的最小系统板,接插线还是比较简单的,难的是硬件的调试,因为理论与实践总是存在着差距,想出来的东西没有经过实践的检验是不可靠的,任何一个小小的疏忽大意都能导致失败。

比如说对hour, min , sec,day, moth的定义,一开始我用的unsigned char ,但是在调试减一时,减到零时再按下键盘就会出现乱码,几经调试,终于发现问题地所在并及时地解决了问题,之后再一次对硬件进行调试,终于成功了。

从这一方面来说,我认识到做要比说难得多,做的过程中必定有很多的阻碍,但是一定要慢慢来,一点一点地找出问题,再一点一点地解决它,这样的话,到达成功的彼岸也就仅仅是时间的问题了。

我通过这次设计,特别是通过对程序的编写,深层了解了单片机内部结构和外围器件的应用。

我学到的不仅仅是电子方面的知识,更重要的是,我学到了作为一名电子设计者所必需的心理素质,那就是——决心加上耐心!附录1:程序代码:#include <reg51.h>#define Lcd_Data P0 //定义数据端口#define _TH0_TL0_ (65536 - 50000)#define HI (_TH0_TL0_ / 256) //给高8位赋值#define LO (_TH0_TL0_ % 256) //给低8位赋值#define M 20 //(1000/50)1秒要20个中断的累计char hour = 0, min = 0, sec = 0,N=0,day=1,moth=1,week=7;//初始化要显示的值unsigned char SEG_TAB[] = {0x30,0x31,0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38, 0x39};//0-9数字unsigned int year=8;sbit RS = P2^ 5; //定义和LCD的连接端口sbit RW = P2^ 4;sbit E = P2^ 3;sbit Busy = P0^ 7;sbit S3 = P3^2;//定义开关s3选择键sbit S4 = P3^3;//s4加一键sbit S5 = P3^4;//s5减一键sbit DQ = P2^0;//DS18B20sbit speak = P2^1; //蜂鸣器警报/******************************************************************** *******/void delay1(unsigned int num)//短延时函数{while( num-- );}/******************************************************************** **********/void Delay(unsigned char t)//长延时函数,延时1MS*t S{unsigned char a;while(--t != 0){for(a = 0; a < 125; a++);}}/*******************************************************************/ void Timer0Init(void) //初始化定时器0程序{TMOD = 0x01; //设置模式1 定时器0 工作方式0TH0 = HI; //给TH0,TL0赋初始值TL0 = LO;TR0 = 1; //启动定时器0ET0 = 1; //定时器中断开EA = 1; //总中断开}/******************************************************************** **********/void Read_Busy(void)//读忙信号判断{do{Lcd_Data = 0xff;RS = 0;RW = 1;E = 0;Delay(2);E = 1;}while(Busy);}/******************************************************************** **********/void Write_Comm(unsigned char lcdcomm) //写指令函数{Lcd_Data = lcdcomm;RS = 0;RW = 0;E = 0;Read_Busy();E = 1;}/******************************************************************** **********/void Write_Data(unsigned char lcddata)//写数据函数{Lcd_Data = lcddata;RS = 1;RW = 0;E = 0;Read_Busy();E = 1;}/******************************************************************** **********/void Init_LCD(void)//初始化LCD{Delay(400); //稍微延时,等待LCD进入工作状态Write_Comm(0x01);//清显示Write_Comm(0x02);//光标归位Write_Comm(0x38);//8位2行5*8Write_Comm(0x06);//文字不动,光标右移Write_Comm(0x0c);//显示开/关,光标开闪烁开Write_Comm(0x18);//左移}/******************************************************************** ***********/Init_DS18B20(void)//初始化ds1820{unsigned char x = 0;DQ = 1; //DQ复位delay1(8); //稍做延时DQ = 0; //单片机将DQ拉低delay1(80); //精确延时大于480usDQ = 1; //拉高总线delay1(14);x = DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay1(20);}/**********************************************************************************/ReadOneChar(void)//读一个字节{unsigned char i = 0;unsigned char dat = 0;for (i = 8; i > 0; i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80;delay1(4);}return (dat);}/******************************************************************** **************/WriteOneChar(unsigned char dat)//写一个字节{unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;delay1(5);DQ = 1;dat>>=1;}}/******************************************************************** **************/Read_Disp_Temperature(void)//读取并显示温度{unsigned int a = 0, b = 0, c = 0, t = 0;float tt = 0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a = ReadOneChar();b = ReadOneChar();t = b;t <<= 8;t = t | a;tt = t * 0.0625;t = tt * 10 + 0.5; //放大10倍输出并四舍五入a = t / 100; //十位b = t / 10 - a * 10; //个位c = t - a * 100 - b * 10; //小数位if((t>=360)||(t<=150)) //温度报警范围{ speak=0;}else speak=1;Write_Comm(0x8d); //lcd显示温度Write_Data( SEG_TAB[a]);Write_Data( SEG_TAB[b]);Write_Data( '.');Write_Data( SEG_TAB[c]);}/******************************************************************** **********/void main(void)//主函数--数字读取和计算{Init_LCD(); //初始化LCDTimer0Init();//初始化定时器0Write_Comm(0x83); //写入":"字符Write_Data(':');Write_Comm(0x86);Write_Data(':');Write_Comm(0x89);//温度提示字符Write_Data('T');Write_Data('e');Write_Data('m');Write_Data('p');Write_Comm(0xc1);//第二行首地址//写入"20 - -"字符Write_Data('2');Write_Data('0');Write_Comm(0xc5);Write_Data('-');Write_Comm(0xc8);Write_Data('-');Write_Comm(0xcb);Write_Data('-');while(1){Read_Disp_Temperature(); //温度if(S3==0){delay1(10);if(S3==0)N++;if(N>6) {N=0;}while(S3==0);Write_Comm(0xcf);Write_Data(SEG_TAB[N]); //显示切换键位所示的位置N//0:秒,1:分,2:时,3:日,4:月,5:年6:星期}if(S4==0)//时间调整--加{delay1(10);if(S4==0){if(N==1){min++;if(min==60) min=0;Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);}if(N==2){hour ++;if(hour==24) hour=0;Write_Comm(0x81);Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);}if(N==3){day++;if(moth==2&&(year%4==0)&&day==30)day=1; //闰年2月天数计算if(moth==2&&(year%4!=0)&&day==29)day=1; //平年2月if((moth==4||moth==6||moth==9||moth==11)&&day==31)day=1;//4,6,9,11月计算if(day==32)day=1;//1,3,5,7,8,10,12月天数计算Write_Comm(0xC9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xCa);Write_Data(SEG_TAB[day%10]);}if(N==4){moth++;if(moth==13)moth=1;Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);}if(N==5){year++;if(year==51)year=0;Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);}if(N==6){week++;if(week==8) week=1;Write_Comm(0xcc);Write_Data(SEG_TAB[year/10]);}while(S4==0);}}if(S5==0)//时间调整--减{delay1(10);if(S5==0){if(N==1){min--;if(min<0) {min=59;}Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);}if(N==2){ hour--;if(hour<0){hour=23;}Write_Comm(0x81);Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);}if(N==3){ day--;if(moth==2&&(year%4==0)&&day<1)day=29;if(moth==2&&(year%4!=0)&&day<1)day=28; if((moth==4||moth==6||moth==9||moth==11)&&day<1)day=30;if(day<1)day=31;Write_Comm(0xC9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xCa);Write_Data(SEG_TAB[day%10]);}if(N==4){ moth--;if(moth==0){moth=12;}Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);}if(N==5){ year--;if(year<0){year=50;}Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);}if(N==6){week--;if(week==0) week=7;Write_Comm(0xcc);Write_Data(SEG_TAB[week]);}while(S5==0);}}}}/******************************************************************** ******/void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序{static unsigned char count = 0; //定义静态变量countTR0 = 0; //时间误差调整TL0 += (_TH0_TL0_ + 9) % 256;TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;TR0 = 1;count++;if(count == M)//1秒种时间到{count = 0;sec++;if(sec == 60)//1分钟时间到{min++;sec = 0;if(min == 60)//1小时时间到{hour++;min = 0;if(hour == 24)//24小时时间到{ day++;week++;hour = 0;min = 0;sec = 0;if(week==8){ week=1;}if((moth==2&&(year%4==0)&&day==30)||(moth==2&&(year%4!=0)&&day==29)||( (moth==4||moth==6||moth==9||moth==11)&&day==31)||(day==32)){ //一个月到moth++;day=1;if(moth==13) //一年到{ year++;moth=1;}}}}}}Write_Comm(0x81); //时间显示Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);Write_Comm(0x83);Write_Data(':');Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);Write_Comm(0x86);Write_Data(':');Write_Comm(0x87);Write_Data(SEG_TAB[sec/10]);Write_Comm(0x88);Write_Data(SEG_TAB[sec%10]);Write_Comm(0x8f);Write_Data( '.');Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);Write_Comm(0xc5);Write_Data('-');Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);Write_Comm(0xc8);Write_Data('-');Write_Comm(0xc9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xca);Write_Data(SEG_TAB[day%10]);Write_Comm(0xcb);Write_Data('-');Write_Comm(0xcc);Write_Data(SEG_TAB[week]);Write_Comm(0xcd);Write_Data(0xfe);Write_Comm(0xce);Write_Data(0xfe);Write_Comm(0xcf+1);Write_Data(0xfe);}附录2:电路图。

相关文档
最新文档