基于STC89C51的温度检测及报警系统设计Word文档格式.docx
《基于STC89C51的温度检测及报警系统设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于STC89C51的温度检测及报警系统设计Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
![基于STC89C51的温度检测及报警系统设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/26/07c32f3c-1880-4ff1-ade5-8f96623b4464/07c32f3c-1880-4ff1-ade5-8f96623b44641.gif)
1.2设计要求
利用STC89C51、DS18B20、数码管、蜂鸣器等元器件设计温度检测、显示和报警系统完成日期与时间显示系统。
系统具有以下功能:
1、能正确检测温度;
2、在数码管上实时显示温度;
3、当温度超过或低于设定的阈值时,蜂鸣器报警;
4、可通过矩阵键盘调整温度报警阈值;
5、其他功能可根据系统上的资源自行设定。
2课程设计方案及器材选用分析
2.1设计总体方案
提及到温度的检测,我们首先会考虑传统的测温元件有热电偶和热电阻,而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试也复杂,制作成本高。
因此,本数字温度计设计采用智能温度传感器DS18B20作为检测元件,测温范围为-55°
C至+125°
C,最大分辨率可达0.0625°
C。
DS18B20可以直接读出被测量的温度值,而采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
按照系统设计功能的要求,确定系统由三个模块组成:
主控制器STC89C51,温度传感器DS18B20,驱动显示电路。
总体电路框图如下:
2.2器材选用分析
2.2.1DS18B20温度传感器
DS18B20产品的特点:
(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。
C到+125。
C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
DS18B20内部结构如图3所示:
图3DS18B20内部结构
DS18B20功能命令如表1所示:
表1DS18B20功能命令表
命令
功能描述
代码
CONVERT
启动温度转换
44H
READSCRATCHPAD
读取温度寄存器
BEH
READROM
读DS18B20的序列号
33H
WRITESCRATPAD
将数据写入暂存器的第2、3字节中
4EH
MATCHROM
匹配ROM
55H
SEARCHROM
搜索ROM
F0H
ALARMSEARCH
报警搜索
ECH
SKIPROM
跳过读序列号的操作
CCH
READPOWERSUPPLY
读电源供给方式,0寄生,1外部电源
B4H
其连线使用如图4所示(2接P3.6):
图4DS18B20连线图
由于DS18B20单线通信功能是分时完成的,所以有严格的时隙概念,读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的复位时序
DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
2.2.2STC89C51单片机介绍
STC89C51是一种带4K字节闪烁可编程可擦除只读存储器FPEROM—flashProgrammableandErasableReadOnlyMemory的低电压高性能CMOS8位微处理器俗称单片机。
而AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造与工业标准的MCS-51指令集和输出管脚相兼容。
STC89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
与MCS-51兼容4K字节可编程闪烁存储器寿命1000写/擦循环·
数据保留时间10年全静态工作0Hz-24Hz三级程序存储器锁定128*8位内部RAM
32位可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路
单片机引脚图
各引脚功能叙述如下:
1、电源和晶振VCC40脚
——接+5V电源GND20脚
——接数字地XTAL119脚
——片内震荡器反相放大器和时钟发生器电路的输入端XTAL218脚
——片内震荡器反相放大器的输出端
2、I/O4个口32根P0口——P0口为一个8位漏级开路双向I/O口每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时被定义为高阻输入。
P0能够用于外部程序数据存储器它可以被定义为数据/地址的第八位。
在FIASH编程时P0口作为原码输入口当FIASH进行校验时P0输出原码此时P0外部必须被拉高。
P1口——P1口是一个内部提供上拉电阻的8位双向I/O口P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后被内部上拉为高可用作输入P1口被外部下拉为低电平时将输出电流这是由于内部上拉的缘故。
在FLASH编程和校验时P1口作为第八位地址接收。
P2口——P2口为一个内部上拉电阻的8位双向I/O口;
P2口——P2口缓冲器可接收输出4个TTL门电流当P2口被写“1”时其管脚被内部上拉电阻拉高且作为输入。
并因此作为输入时P2口的管脚被外部拉低将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时P2口输出地址的高八位。
在给出地址“1”时它利用内部上拉优势当对外部八位地址数据存储器进行读写时P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口——P3口管脚是8个带内部上拉电阻的双向I/O口可接收输出4个TTL门电流。
当P3口写入“1”后它们被内部上拉为高电平并用作输入。
作为输入由于外部下拉为低电平P3口将输出电流ILL这是由于上拉的缘故。
同时P3口也可作为STC89C51的一些特殊功能口如下表所示口管脚备选功能P3.0RXD串行输入口P3.1TXD串行输出口P3.2/INT0外部中断0P3.3/INT1外部中断1P3.4T0记时器0外部输入P3.5T1记时器1外部输入P3.6/WR外部数据存储器写选通P3.7/RD外部数据存储器读选通P3口同时为闪烁编程和编程校验接收一些控制信号。
3、控制线(共4根)RST复位输入。
当振荡器复位器件时要保持RST脚两个机器周期的高电平时间。
ALE/PROG当访问外部存储器时地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间此引脚用于输入编程脉冲。
在平时ALE端以不变的频率周期输出正脉冲信号此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是每当用作外部数据存储器时将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时ALE只有在执行MOVXMOVC指令是ALE才起作用。
另外该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止置位无效。
/PSE外部程序存储器的选通信号。
在由外部程序存储器取指期间每个机器周期两次/PSEN有效。
但在访问外部数据存储器时这两次有效的/PSEN信号将不出现。
/EA/VPP当/EA保持低电平时则在此期间外部程序存储器0000H-FFFFH不管是否有内部程序存储器。
注意加密方式1时/EA将内部锁定为RESET当/EA端保持高电平时此间内部程序存储器。
在FLASH编程期间此引脚也用于施加12V编程电源VPP。
3硬件电路设计
3.1电源电路
工作原理220V交流市电经过电源变压器变换成交流低电压再经过桥式整流电路D2D5和滤波电容C5的整流和滤波在三端稳压器LM7805的Vin和GND两端形成一个并不十分稳定的直流电压(该电压常常会因为市电电压的波动或负载的变化等原因而发生变化)。
此直流电压经过LM7805的稳压和C7的滤波便在稳压电源的输出端产生了精度高、稳定度好的直流输出电压。
本稳压电源可作为TTL电路或单片机电路的电源。
三端稳压器是一种标准化、系列化的通用线性稳压电源的集成电路其具有体积小、成本低、性能好、工作可靠、使用简捷方便等特点成为目前稳压电源中应用最为广泛的一种单片式集成稳压器件。
电源电路图如图
电源电路
LM7805简介LM7805是一种常用的三端稳压器一般使用的是TO-220封装能提供DC5V的输出电压应用范围极广内含过流过热及调整管的保护电路和过载保护电路。
带散热片时能持续提供1A的电流。
电子制作中经常采用。
但当稳压管温度过高时稳压性能将变差甚至损坏。
其外形引脚如图
3.2显示电路、报警电路、复位电路、按键电路
显示电路
共阴数码管管脚图为
显示连接电路图为:
报警电路
报警电路采用简单的发光二极管与蜂鸣器组合电路当温度超出上下门限值时二极管发光同时蜂鸣器鸣响。
其电路图如图:
蜂鸣器电路二极管电路
复位电路
本设计所用复位电路与其他单片机所用电路类似为电容式复位,主要实现温度和时间的复位。
其电路图如下
按键电路,由上拉电阻和按键组成,主要实现温度上下限和时间的调整
4软件流程及描述
系统的软件主要是采用C语言对单片机进行编程实现各种功能。
当然也可以采用汇编语言但程序设计较麻烦本设计采用C语言来编程主程序对模块进行初始化而后调用读温度、处理温度、显示、键盘报警等模块。
用的是循环查询方式来显示和调节温度主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值并负责调用各子程序。
4.1主程序流程图和按键处理子程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见下图
按键处理子程序主要是负责参数的设置主程序每循环一次都要对按键进行扫描,判断是否有输入键按下则进行一系列的按键输入操作。
其程序流程框图如下图所示:
4.2读温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如下图1
12
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如上图2
5心得体会
这次课程设计是软件与硬件结合的实践。
历时一周。
分别进行了电路仿真图的设计以及实物电路板的焊制两个过程。
通过这次的课程设计,我们不仅加深了对Proteus仿真软件的了解和使用,还学到了许多课本上没有涉及知识,练习了电路原理图的设计和仿真运行,同时对本学期学习的单片机课程进行了一次全面的复习和巩固,受益匪浅。
第一天,我们完成了对各部分电路原理图的设计与绘制。
刚开始感觉有一定的难度,主要是对对Proteus仿真软件及其功能的不了解。
但通过XX和老师同学的帮助下还是顺利的绘制完成了,也对接下来的设计有了信心。
在这部分的设计中,主要包括了以下几部分电路的设计:
时钟电路的原理图设计,复位电路原理图的设计,LED灯电路(控制温度超过上限下限的显示灯)原理图的设计,温度传感器DS18D20电路原理图设计,蜂鸣器电路原理图设计,串行口下载电路原理图的设计,键盘控制电路原理图的设计,数码管显示电路和稳压电路设计。
第二天,我们开始对所绘制的电路原理图进行仿真测试。
首先要做的就是根据找的资料编写实验要求的功能程序。
刚开始,一头雾水,不知道从何下手,对代码看得也很陌生,有点茫然,通过单片机课本,也将各个模块分开,慢慢的能看懂一部分代码,逐个突破,最后终于勉强将程序修改完成。
完成了仿真测试。
第三天,我们开始了自我们感觉最难的部分---焊接实物。
在这部分,很考验我们的细心与谨慎,如果没有仔细查明各个元器件的管脚特性,一不小心就焊错了。
首先在稳压电源这部分电路,由于起初的疏忽,焊错了两个电容的关系,导致后面在调试最小系统时,遇到了障碍。
检查了几遍最小系统的电路都没有发现问题,后来经过同学的帮助,才纠正过来。
再而就是,数码显示这部分电路,花了我们不少功夫,找出对应的端口。
总的来说,今天勉强完成了硬件的焊接。
第四天,开始软件下载,硬件调试的一天了。
陆陆续续的有人做出来了。
有点紧张硬件上的结果。
果不其然,仿真可以,到硬件上还需要在纠结一段。
这部分碰到了几个很棘手烦人问题。
第一、数码管上的数字显示不完整,经检测发现时有一个小路短路了。
纠正后显示正常了。
第二、复位电路,复位键不行用,经检测问题是出现在复位电路的那个10K的电阻没有接好;
最后问题是蜂鸣器的反应时好时坏,问题出现在电路不稳定。
第五天,检查,总结,写报告。
总的来说,这次课设,体验到很多。
通过本次课设,能够使我们熟练掌握单片机控制电路的设计、程序编写和整体焊接及系统调试,从而全面地提高我们对单片机的软件、硬件等方面的理解,进而增强我们在实践环节的动手操作能力。
譬如,我们可以根据实验指导书的要求,完成BS18D20电路的硬件设计、电路器件的选择、单片机软件的运行、以及整体系统调试,并写出完善的设计报告。
相信此次学到的知识在以后的生活和学习中对我会有很大的帮助!
6参考文献、
[5]许敏,单片机原来及应用
[6]韩颖;
Proteus在单片机技术实训教学中的应用[J];
中国科教创新导刊;
2008年31期
[7]周灵彬;
张靖武.PROTEUS的单片机教学与应用仿真[J].单片机与嵌入式系统应用;
2008年01期
7附录
、仿真图与试验结果图:
1、电路仿真原理图:
各部分图电路设计原理图:
a、时钟电路:
b、复位电路:
c、LED灯电路:
d、按键电路e、蜂鸣器电路f、传感器电路
2、实物焊接电路:
3、温度显示(左:
仿真电路显示;
右:
实物电路显示;
)
4、时间时和分显示(左:
仿真电路显示;
;
5、温度上限调整:
(左:
6、温度下限调整:
7、时间的时与分调整:
8、复位功能实现:
、程序:
#include<
reg51.h>
#defineuintunsignedint
#defineucharunsignedchar//宏定义
sbitDQ=P3^6;
sbitSET=P3^4;
//定义选择报调整警温度上限和下限(1为上限,0为下限)
sbitADD=P3^2;
sbitCUT=P3^3;
sbitLING=P1^7;
sbitp00=P2^4;
sbitp01=P2^5;
sbitp02=P2^6;
sbitp03=P2^7;
sbitdp=P0^7;
sbitled=P1^2;
sbitledh=P1^3;
sbitledl=P1^4;
signedcharm;
//温度值全局变量
bitsign=0;
bitsigns=0;
signedchary=1;
unsignedcharr;
signedcharflag=1;
signedcharshangxian=40;
//上限报警温度,默认值为38
signedcharxiaxian=20;
//下限报警温度,默认值为5
signedcharshi=0;
signedcharfen=0;
ucharcodeLEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
/*****延时子程序*****/
voidDelay(uinti)
{
while(i--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
unsignedcharx=0;
DQ=1;
Delay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
Delay(80);
//精确延时,大于480us
//拉高总线
Delay(14);
x=DQ;
//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
/*****读一个字节*****/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
{
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
i>
i--)
DQ=dat&
0x01;
Delay(5);
voidTmpchange(void)//发送温度转换命令
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
/*****读取温度*****/
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Tmpchange();
WriteOneChar(0xBE);
//读取温度寄存器
a=ReadOneChar();
//读低8位
b=ReadOneChar();
//读高8位
t=b;
t<
<
=8;
t=t|a;
tt=t*0.0625;
t=tt*100+0.5;
//放大10倍输出并四舍五入
return(t);
/*****显示开机初始化等待画面*****/
Disp_init()
P0=0x3f;
//显示-
p00=0;
p01=1;
p02=1;
p03=1;
Delay(100);
P0=0x3f;
p00=1;
p01=0;
Delay(100);
p02=0;
p03=0;
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
uinta,b,c,d,e;
e=ReadTemperature();
//获取温度值