
智能报警器
-
2023年3月3日发(作者:综合素质自我评价)智能温度报警器的设计说明书(总
28页)
--本页仅作为文档封面,使用时请直接删除即可--
--内页可以根据需求调整合适字体及大小--
2
吉林建筑大学
电气与电子信息工程学院
传感器与检测技术课程设计报告
设计题目:智能温度报警器的设计
专业班级:信科121
学生姓名:
学号
指导教师:王超、高晓红
设计时间:
教师评语:
成绩评阅教师日期
成绩评阅教师日期
3
目录
第1章绪论.........................................................1
智能温度报警器研究的背景和意义..................................1
智能温度报警器的设计主要内容和要求..............................1
第2章系统总体设计方案.............................................3
总体方案设计图.................................................3
系统工作模块及过程..............................................3
第3章硬件电路设计..................................................5
温度采集模块....................................................5
液晶显示模块....................................................7
电源模块........................................................8
温度报警器模块..................................................9
按键模块.......................................................10
复位模块.......................................................10
控制模块.......................................................11
第4章系统软件设计.................................................14
主程序流程图...................................................14
温度读取转换流程图.............................................15
温度计算流程图.................................................16
总结...............................................................17
参考文献...........................................................17
附录1总电路图....................................................18
4
附录2程序.........................................................19
-1-
第1章绪论
智能温度报警器研究的背景和意义
温度是一个十分重要的物理量,对他的测量与控制有十分重要的意义,随着
现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与
控制温度。本文通过采用压电陶瓷蜂鸣片作为电声元件的温度报警器的设计与
制作,阐明了该装置进行设计与制作的具体过程及方法。这种温度报警器结构
简单,可操作性强,应用广泛。工作时,温度测量范围为10——30ºC。当前
环境温度若超过设定的高温临界温度,由单片机发出报警信号并驱动继电器使
风扇电机转动,从而防止因温度升高而带来的不必要的损失。
现代社会是信息社会,随着安全化程度的日益提高,机房——作为现代化的
枢纽,其安全工作已成为重中之重,机房内一旦发生故障,将导致整个系统瘫
痪,造成巨大的损失很社会影响。造成高温火灾有:电气线路短路、过载、接
触电阻过大等引发高温或火灾;静电产生高温或或火灾;雷电等强电侵入导致
高温或火灾;最主要是机房内电脑、空调等用电设备长时间工作,导致设备老
化,空调发生故障,而不能降温;因此机房内所属的电子产品发热快,在短时
间内机房温度升高超出设备正常温度,导致系统瘫痪或产生火灾,这时温度报
警系统就会发挥应有的功能。
由于现实生活中天然气泄漏、温度超限和失窃、加上以前通信网络的不完
善,对于人们的生命财产有着很大的危害。现在随着通信技术和电子技术的飞
速发展,电子信息技术与社会经济生活,生产的关系越来越密切,对社会经济
的发展起着越来越大的作用。如果主任离开家去上班,家里失窃也不会知道。
如果能实现远程报警,使报警器智能化,这将会给人们的生活带来极大的方
便。
温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温
度控制器来说,总体发展水平还不够高。存在以下几点问题。
(1)行业内企业规模小,较为分散,造成技术力量不够集中.
(2)商品化产品以PID控制器为主,智能化仪表少,这方面同国外差距较大。目
前,国内复杂的及精确度高的温控系统大多采用进口温度控制仪表。
(3)仪表控制用关键技术。相关算法及控制软件方面的研发较国外落后。
制参数多靠人工经验及现场调试来确定。
随着我国经济不断进步,政府对此也非常重视。温度仪表工业得到迅速发
展。
智能温度报警器的设计主要内容和要求
(1)课程设计目的
-2-
通过传感器与检测技术课程设计,使学生掌握传感器及检测系统设计的方法
和设计原则及相应的硬件调试的方法。进一步理解传感器及检测系统的设计和
应用。
(2)智能温度报警器的设计内容
设计一个基于单片机的温度检测、报警的系统,该系统能实时采集周围的温
度信息进行显示,当温度超限时,可以报警。
实现以下功能:
①实时温度检测并显示其对应的值。
②当温度超过预设范围时,可报警。
③其他功能:可以设报警置温度上下限,根据应用环境不同可设定不同的报警
上下限。
(3)本次课程设计要求
①掌握传感器的工作原理及相应的辅助电路设计方法。
②独立设计原理图及相应的硬件电路。
③设计说明书格式规范,层次合理,重点突出。并附上详细的原理图。
-3-
第2章系统总体设计方案
总体方案设计图
在很多单片机测温电路中,大都是使用温度传感器。测温范围广,精度
高,且电路设计简单。其中温度传感器DS18B20体积小,精度高,经济实用,
且容易直接读取被测温度,满足设计要求。
本次设计采用控制器采用单片机AT89C51,可任意设定上下限温度报警功
能;采用DS18B20作为温度传感器,测温范围为-50℃-110℃,误差小于℃;用
LCD液晶屏实现温度及时间日期显示。本设计的系统框图如图所示。
图总体方案设计图
系统工作模块及过程
(1)系统包含温度采集模块、显示模块、电源模块、报警模块、按键模块等几
个部分组成。
①温度采集模块用来采集实时温度。
②显示模块用来显示温度,日期和时间。
③按键用于设置温度的上下限报警。
④电源模块对整个系统进行供电。
⑤报警模块即当温度超过上下限时进行报警提醒。
⑥复位电路进行单片机复位。
(2)工作过程
电源转换模块将电压转换供电,单片机控制中心进行命令。利用温度传感器
DS18B20检测环境温度,通过按键在不同的应用环境设置不同的上下限温度,
载由液晶显示器LCD1602显示实时温度和时间,当环境温度值不在所设的范围
时,报警器发出报警提醒。同时设置复位电路,令单片机复位。
单片机
AT89C51
单片机复位电路
上下限报警
液晶显示
电源辅助电路
温度传感器
按键电路
-4-
第3章硬件电路设计
温度采集模块
图温度采集电路
DS18B20主要特点温度采集模块采用温度传感器DS18B20测取温度信息,然
后使用单片机与温度传感器进行通讯,读取温度信息。
(1)DS18B20的主要特点如下:
①独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实
现微处理器与DS18B20的双向通讯。
②测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误
的)1℃。
③支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联
8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号
传输的不稳定。
④工作电源:~DC(可以数据线寄生电源)。
⑤在使用中不需要任何外围元件。
⑥测量结果以9~12位数字量方式串行传送。
⑦不锈钢保护管直径Φ6。
⑧适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温。
⑨标准安装螺纹M10X1,,G1/2"任选。
⑩PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
(2)DS18B20引脚功能
①DQ为数字信号输入/输出端;
②GND为电源地;
③VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
(3)工作原理
-5-
DS18B20的测温原理如图所示,图中低温度系数晶振的振荡频率受温度的影
响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随
温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生
的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数
振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1
和温度寄存器中,减法计数器1和温度寄存器被预置-55℃所对应的一个基数
值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计
数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新
被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,
如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度
寄存器中的数值即所测温度。
图的测温原理
液晶显示模块
图液晶显示电路
在温度报警器的工作过程中,系统需要对实时的温度和时间进行显示。使用液
晶LCD1602显示器显示。
-6-
(1)LCD1602液晶显示器主要特点
①分表率高,显示质量好
②数字式接口,设计简单,操作方便。
③体积小,重量轻。
④寿命长,功耗低。
(2)引脚功能
引脚分布图如图所示
1
2
3
4
5
6
7-14
15
图引脚图
LCD1602采用标准的16脚接口各个接口引脚为:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时
对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位
器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令
寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操
作。
第6脚:E(或EN)端为使能(enable)端。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
电源模块
VSS
VCC
V0
RS
RW
E
DB0-DB7
BLA
BLK
-7-
图电源电路
(1)模块组成
①电源变压器:是降压变压器,它将电网220V交流电压变换成12V的交流电
压,并送给整流电路,变压器的变比由变压器的副变电压确定。
②整流电路:利用单向掉电元件,把59HZ的正弦交流电变换成脉动的直流
电。
③滤波电路:可以将整流电路输出电压中的交流成分大部分加以滤除,从而得
到比较平滑的直流电压。
④稳压电路:芯片7805稳压电路的功能是使输出的直流电压稳定,不随交流
电网和负载的变化而变化。
(2)工作原理
系统仅需要单个5V稳压电源,所以需要将电压转化。采用三端稳压集成
7805得到+5V的稳定电压。整流电路采用二极管桥式整流电路,在U正半周,
二极管D8、D9导电,D6、D7截止;U的负半周时,D6、D7导电,D8、D9截
止。正负半周均有电流流过负载,而且无论在正半周还是负半周,流过负载的
电流方向是一致的,因而使输出电压的直流成分得到提高,脉冲成分被降低。
桥式整流电路无需采用具有中心抽头的变压器,仍能达到全波整流的目的。
温度报警器模块
图温度报警器电路
-8-
报警电路采用的是LED灯和喇叭进行报警,其作用是当温度不在设定的范围
内,LED灯亮,同时喇叭报警(当温度超过上下限时进行报警提醒)。以此来
提醒用户该注意实时的温度,避免因为温度的原因而带来的损害。
按键模块
图按键电路
按键用于设置温度的上下限报警。通过按键调整液晶屏显示出的温度上限
和下限,为接下来的报警工作做准备。
本次设计按键数较少,采用独立式键盘。3个按键功能为S1为温度上限温
度加1,S2为温度减1,S3为温度下限温度加1。
复位模块
图复位电路
要使主控芯片在上电时能正常复位,按照要求执行程序,必须在上电位时
给主控单片机提供至少两个机器周期以上的高电位复位脉冲。采用的上电复位
电路,该电路在上电瞬间电源通过拉地的10K电阻充电,开始时的电流最大,
电阻两端的电压最高,而后慢慢减小,直到电容充电完毕,电阻两端便保持低
-9-
电平。此变化经单片机内部施密特触发器整形后便成了上电瞬间的一个高电平
脉冲,只要这个脉冲保持两个机器周期以上便可以正常复位。
控制模块
图连接图
控制器主要用于对各模块控制显示、报警、计时等。采用AT89C51作为系
统控制器的CPU。该单片机算术运算功能强,软件编程较灵活、自由度大,可
以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成
熟和成本低等优点,使其在各个领域应广泛。
(1)AT89C51功能
①4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位
定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器
及时钟电路。
②AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模
式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中
断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它
所有部件工作直到下一个硬件复位。
(2)引脚功能
①VCC:供电电压。
②GND:接地。
③P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当
P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储
-10-
器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0口作为原码输入
口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能
接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,
P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在
FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接
收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉
高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据
存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内
部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能
寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
④P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL
门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为
输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RXD(串行输入口)
TXD(串行输出口)
/INT0(外部中断0)
/INT1(外部中断1)
T0(计时器0外部输入)
T1(计时器1外部输入)
/WR(外部数据存储器写选通)
/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
⑤RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电
平时间。OG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的
低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以
不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作
对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储
器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此
时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略
微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
⑥PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机
器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号
将不出现。
⑦EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-
FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为
RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此
引脚也用于施加12V编程电源(VPP)。
⑧XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
⑨XTAL2:来自反向振荡器的输出。
-11-
第4章系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温
度子程序,显示数据子程序等。
主程序流程图
NY
图主程序流程
主程序的主要功能是负责实时显示温度,设置报警温度线,每一秒进行读出
处理DS18B20测量的温度值。
温度读取转换流程图
温度读取流程图如图所示,温度转换流程图如图所示。
初始化
读取温度
读出温度值温度计
算处理显示数据刷
新
发温度转换开始命令
调用显示子程序
序
调用显示子程序
调用显示子程序
发DS18B20复位命令
发DS18B20复位命令
-12-
Y
N
图温度转换流程
Y
N
图温度读取流程
温度读取程序主要是读出RAM中的9字节,再进行CRC校验,校验有错时直
接结束程序,不进行温度数据的改写。温度转换命令子程序主要是发温度转换
开始命令。
温度计算流程图
跳过ROM命令
发读取温度命令
读取操作
9字节完
发跳过ROM命令
发温度转换开始命令
结束
开始
CRC校验正
移入温度暂存器
结束
-13-
图温度计算流程
总结
温度零下
温度值取补码置“1”标志
计算小数位温度
计算整数位温度
结束
置“0”标
志
-14-
智能温度控制报警器是传感器的第一次设计。在本次设计中,作为一个初学
者,由于自身的知识水平有限,在设计过程中碰到了许多问题。
通过查阅资料和同学和老师的帮助,解决了很多问题。一开始并没有想到电
源要转化的问题,后来通过老师的知道,说明电源转换是有必要的。设计报警
电路的时候,二极管等原件的确定总是有些疑问,通过参考前辈的资料来确定
了自己要使用的元器件。
经过两周的学习查阅资料,我终于顺利完成了初步的设计,后期有修改了一
下,但是中间得到的知识是非常让人欣慰又激动的。这种课程设计是非常和有
趣生动的活动,在理论学习的同时又有实践结合,软件的操作。之前我并不擅
长使用软件进行画图设计,但是本次设计中,甚至在网上看视频教程来学习了
软件制作电路图仿真。
当做完以后心里是无法言以表达的激动。对我以后的设计思想、设计方
法、设计过程都将会产生深远的影响。学会查阅资料是我在这次设计中的最大
收获,毕竟一个人的知识水平有限,资料在设计中的作用可以说是举足轻重。
不断地收集和查阅资料使我知识面不断拓宽,为以后也打下了良好的基础。
通过设计,使我对一个传感器的设计过程有了全面的了解,设计过程中出
现的许多困难也使我自己不断完善。不断的坚持使我信心百倍,我会以后继续
努力。在设计过程中感谢老师的悉心指导以及同学们的帮助。
参考文献
-15-
[1]李光飞,楼然苗,胡佳文等.单片机课程设计实例指导[M].北京:北京航空航
天大学出版社,2004
[2]刘文涛.单片机语言C51典型应用设计[M].北京:人民邮电出版社,2001
[3]魏立峰,王宝兴.单片机原理与应用技术[M].北京:北京大学出版社,2007
[4]杨素行.模拟电子技术基础简明教程[M].高等教育出版社,2004
[5]张克农.数字电子技术基础[M].高等教育出版社,2008.
[6]王俊峰.电子产品开发设计与制作[M].北京:北京人民邮电出版社
附录1总电路图
-16-
Ti
t
l
e
N
u
m
b
e
r
R
e
v
i
s
i
o
n
S
i
z
e
E
A/
V
P
P
3
1
X
1
1
9
X
2
1
8
R
E
S
E
T
9
R
D/
P
3
7
1
7
W
R
/
P
3
6
1
6
P
3
2
/
I
N
T
0
1
2
P
3
3
/
I
N
T
1
1
3
P
3
4
/
T
0
1
4
P
3
5
/
T
1
1
5
P
1
0
1
P
1
1
2
P
1
2
3
P
1
3
4
P
1
4
5
P
1
5
6
P
1
6
7
P
1
7
8
P
0
0
3
9
P
0
1
3
8
P
0
2
3
7
P
0
3
3
6
P
0
4
3
5
P
0
5
3
4
P
0
6
3
3
P
0
7
3
2
P
2
0
2
1
P
2
1
2
2
P
2
2
2
3
P
2
3
2
4
P
2
4
2
5
P
2
5
2
6
P
2
6
2
7
P
2
7
2
8
P
S
E
N
2
9
A
L
E/
P
R
D
G
3
0
P
3
1
/
T
X
D
1
1
P
3
0
/
R
X
D
1
0
A
T
8
9
C
5
1
R
3C
1
2
2
V
V
C
C
R
1
R
2
D
1
L
E
D
Q
1
9
0
3
1
L
S
1
R
4
V
C
C
123
P
1
D
S
1
8
B
2
0
V
C
C
12345678
P
2
V
C
C
T
?
T
R
A
N
S
4
1
3
2
V
V
G
N
D
I
N
O
U
T
7
8
L
0
5
D
4
D
2
D
5
D
3
C
2
C
5
C
4
D
6
R
1
3
V
C
C
123456789
1
0
1
1
1
2
1
3
1
4
1
5
1
6
P
3
R
5
R
6
+
5
V
+
5
V
P
2
4
P
2
5
P
2
6
P
0
0
P
0
1
P
0
2
P
0
3
P
0
4
P
0
5
P
0
6
P
0
7
S
1
S
2
S
3
P
3
3
P
3
4
P
3
5
R
6
附录2程序
-17-
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^6//定义DS18B20端口DQ
sbitBEEP=P3^2;sbitUP=P3^3;
sbitDOWN=P3^4;
sbitBJ=P3^1;
sbitJR=P3^0;
sbitMUSIC=P3^5;
bitpresence;
sbitLCD_RS=P2^4
sbitLCD_RW=P2^5
sbitLCD_EN=P2^6
ucharcodecdis1[]={"DS18B20OK"}
ucharcodecdis2[]={"TEMP:C"}
ucharcodecdis3[]={"DS18B20ERR0R"}
ucharcodecdis4[]={"PLEASECHECK"}
unsignedcharcodedis1[]={"playthesong"};
unsignedcharcodedis2[]={"Hopeyouhealthy--SunYue"};
unsignedchardatatemp_data[2]={0x00,0x00}
unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00}unsignedcharcode
ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}
unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}
ucharLIM,tt,LIM2,XX;
#definedelayNOP(){_nop_()_nop_()_nop_()_nop_()}
/***************************************************************/
voiddelay1(intms)
{unsignedcharywhile(ms--)
{for(y=0y<250y++)
{_nop_()_nop_()_nop_()_nop_()
-18-
}}}
/******************************************************************/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/******************************************************************/
bitlcd_busy()
{
bitresult
LCD_RS=0
LCD_RW=1
LCD_EN=1
delayNOP()
result=(bit)(P0&0x80)
LCD_EN=0
return(result)}/*RS=L,RW=L,E=高脉冲,D0-D7=指
令码。*/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy())
LCD_RS=0
LCD_RW=0
LCD_EN=0
_nop_()
_nop_()
P0=cmd
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0}
/*******************************************************************/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
/*****************************************************************/
voidlcd_wdat(uchardat)
-19-
{
while(lcd_busy())
LCD_RS=1
LCD_RW=0
LCD_EN=0
P0=dat
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0}
/*LCD初始化设定*/
/*******************************************************************/
voidlcd_init()
{
delay1(15)
lcd_wcmd(0x01)//清除LCD的显示内容lcd_wcmd(0x38)
//16*2显示,5*7点阵,8位数据
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x0c)//显示开,关光标
delay1(5)
lcd_wcmd(0x06)//移动光标
delay1(5)
lcd_wcmd(0x01)//清除LCD的显示内容
delay1(5)}
/*设定显示位置*/
/*******************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80)//数据指针=80+地址变量}
-20-
/*自定义字符写入CGRAM*/
/*******************************************************************/
voidwritetab()
{
unsignedchari
lcd_wcmd(0x40)//写CGRAM
for(i=0i<8i++)
lcd_wdat(mytab[i])
}
/*us级延时函数*/
/*******************************************************************/
voidDelay(unsignedintnum)
{while(--num)}
/*初始化ds1820*/
/*******************************************************************/
Init_DS18B20(void)
{DQ=1//DQ复位
Delay(8)//稍做延时
DQ=0//单片机将DQ拉低
Delay(90)//精确延时大于480us
DQ=1//拉高总线
Delay(8)
presence=DQ//如果=0则初始化成功=1则初始化失败Delay(100)
DQ=1
return(presence)//返回信号
0=presence,1=nopresence}
/*读一个字节*/
/*******************************************************************/
ReadOneChar(void)
{
unsignedchari=0
unsignedchardat=0
for(i=8i>0i--)
{
-21-
DQ=0//给脉冲信号
dat>>=1
DQ=1//给脉冲信号
if(DQ)
dat|=0x80
Delay(4)}
return(dat)}
/*写一个字节*/
/*******************************************************************/
WriteOneChar(unsignedchardat)
{
unsignedchari=0
for(i=8i>0i--)
{
DQ=0
DQ=dat&0x01
Delay(5)
DQ=1
dat>>=1}}
/*读取温度*/
/*******************************************************************/
Read_Temperature(void)
{Init_DS18B20()
WriteOneChar(0xCC)//跳过读序号列号的操作
WriteOneChar(0x44)//启动温度转换
Init_DS18B20()
WriteOneChar(0xCC)//跳过读序号列号的操作
WriteOneChar(0xBE)//读取温度寄存器
temp_data[0]=ReadOneChar()//温度低8位temp_data[1]=
ReadOneChar()//温度高8位/*数据转换与温度显示*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f
-22-
display[0]=ditab[display[4]]+0x30//查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4)
display[3]=display[4]/100+0x30
display[1]=display[4]%100
display[2]=display[1]/10+0x30
display[1]=display[1]%10+0x30
if(display[3]==0x30)//高位为0,不显示{
display[3]=0x20
if(display[2]==0x30)//次高位为0,不显示display[2]=0x20
}
lcd_pos(0x48)
lcd_wdat(display[3])//百位数显示
lcd_pos(0x49)
lcd_wdat(display[2])//十位数显示
lcd_pos(0x4a)
lcd_wdat(display[1])//个位数显示
lcd_pos(0x4c)
lcd_wdat(display[0])//小数位数显示
}
/*******************************************************************/
/*报警器响一声*/
/*******************************************************************/
voidbeep()
{
Delay(10)
BEEP=!BEEP//BEEP取反
/*DS18B20OK显示菜单*/
/*******************************************************************/
voidOk_Menu()
{
ucharm
lcd_init()//初始化LCDlcd_pos(0)//
设置显示位置为第一行的第1个字符m=0
while(cdis1[m]!='0')
{
-23-
lcd_wdat(cdis1[m])}
lcd_pos(0x40)//设置显示位置为第二行第1个字符
while(cdis2[m]!='0')
{
lcd_wdat(cdis2[m])
}
writetab()//自定义字符写入CGRAM
delay1(5)
lcd_pos(0x4d)
lcd_wdat(0x00)//显示自定义字符
}
/*DS18B20ERROR显示菜单*/
/*******************************************************************/
voidkeyscan()
{if(MUSIC==0)
{Delay(5);
if(MUSIC==0)XX++;
if(XX==2)XX=0;
while(MUSIC==0);}
if(UP==0)
Delay(5);
if(UP==0){LIM++;}
while(UP==0)
{display[3]=LIM/100+0x30
display[1]=LIM%100
display[2]=display[1]/10+0x30
display[1]=display[1]%10+0x30
if(display[3]==0x30)//高位为0,不显示{display[3]=0x20
if(display[2]==0x30)//次高位为0,不显示display[2]=0x20}
lcd_pos(0x48)
lcd_wdat(display[3])//百位数显示
lcd_pos(0x49)
lcd_wdat(display[2])//十位数显示
lcd_pos(0x4a)
lcd_wdat(display[1])//个位数显示
-24-
}
}
if(DOWN==0)
{Delay(5);
if(DOWN==0)
{LIM--;}
while(DOWN==0)
{
display[3]=LIM/100+0x30
display[1]=LIM%100
display[2]=display[1]/10+0x30
display[1]=display[1]%10+0x30
if(display[3]==0x30)//高位为0,不显示
{
display[3]=0x20
if(display[2]==0x30)//次高位为0,不显示display[2]=0x20
}
lcd_pos(0x48)
lcd_wdat(display[3])//百位数显示
lcd_pos(0x49)
lcd_wdat(display[2])//十位数显示
lcd_pos(0x4a)
lcd_wdat(display[1])//个位数显示
}
}
}
voidcsh()
{TMOD=0x01;IE=0x82;
TH0=0xD8;TL0=0xEF;//12MZ晶振,10ms
LIM=28;
ET0=1;
TR0=1;
}
voidPlay_Song(unsignedchari)
{unsignedcharTemp1,Temp2;
-25-
unsignedintAddr;
Count=0;}//中断计数器清0
/*主函数*/
/************************************/
voidmain()
{Ok_Menu()
csh();
while(XX==0)
{Read_Temperature()
Disp_Temperature()
keyscan();
if(display[4]>LIM)
{
beep();
EA=1;
JR=1;}
elseif(display[4]<=26)
{JR=0;
EA=0;}
else
{
EA=0;
}
BJ=1;
}
while(XX==1)
{
EA=1;
JR=1;
BJ=1;
Play_Song(0);
}
}
voidtimer_0(void)interrupt1
{
-26-
TH0=0xD8;
TL0=0xEF;
Count++;
if(XX==0)
{tt++;
if(tt==20)
{
tt=0;
BJ=~BJ;
}
}