1、- . 目录一前言1二根本功能与参数22.1系统根本功能22.2 参数2三系统总体设计2四硬件设计34.1 单片机最小系统设计34.1.1 电源电路34.1.2 振荡电路与复位电路34.2 DS18B20与单片机的接口电路44.3独立式键盘电路44.4报警模块54.5 数码管显示模块54.6 PROTEUS仿真图64.7 DS18B20简单介绍6五软件设计75.1 主程序流程图85.2读出温度子程序85.3温度转换命令子程序95.4计算温度子程序105.5按键扫描处理子程序11六心得及体会:11参考文献:12附录元件清单12附录总体电路图13附录源程序14基于单片机的温度检测系统设计孟祥柱 航
2、空航天大学自动化学院摘要:随着时代的进步和开展,单片机技术已经普及到我们生活、工作、科研等各个领域,已经成为一种比拟成熟的技术。本文主要设计了一个基于AT89C51单片机的温度监测系统,详细描述了利用数字传感器DS18B120完成监测温度的过程,重点对系统的硬件连接,软件编程,各模块系统流程以及各局部的电路进展了分析介绍。本设计是以AT89C51为核心,通过温度传感器DS18B20将温度值转换为电量输出,可以利用小键盘设定温度的最大值和最小值,对于超过最大值或者最小值的温度数据通过红黄灯进展报警,所以这个系统使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活
3、和工、农业生产中的温度测量,具有广泛的应用前景。关键词:单片机AT89C51;温度采集;温度传感器DS18B20;报警功能一前言传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的本钱低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。这里设计的数字温度计具有读数方便,测温围广,测温准确,数字显示,适用围宽等特点。本设计选用STC89C52型单片机作为主控制器件,DS18B20作为测温传感器,通过LED数码管实现温度显示。通过DS18B20直接读取被测温度值,进展数据转换,该器件的物理化学性能稳定,线性度较好,在0100最大线性偏差小于0.01。该器件可直接向单片
4、机传输数字信号,便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。二 根本功能与参数2.1系统根本功能 a.实现温度的实时测量与显示。b.可手动设置监测温度围的上限和下限。c.超出温度监测围,可进展声光报警或执行预定操作。2.2 参数a. DS18B20 的温度测量围为-55C+125C,在-20C+60C 围,精度为0.5Cb.显示温度值准确到0.1C,监测温度准确到1Cc精度误差小于0.5三系统总体设计本设计的温度测量报警系统以STC89C52 单片机为核心部件,外加温度采集电路、键盘及显示电路、越限报警等电路。采用数字温度芯片DS18B20 测
5、量温度,输出信号全数字化。由数字温度计DS18B20和STC89C52单片机构成的温度测量装置,它直接输出温度的数字信号。利用STC89S52芯片控制温度传感器DS18B20进展实时温度检测并显示,快速测量环境温度,并可以根据需要设定上下限温度。系统框图如图1所示。时钟振荡电路STC89C52复位电路电源电路LED报警显示LED数码管显示蜂鸣器报警键盘调整控制模块DS18B20温度传感器图1 DS18B20温度测温系统框图四硬件设计4.1 单片机最小系统设计4.1.1 电源电路图2 电源电路4.1.2 振荡电路与复位电路晶振采用12MHZ。复位电路采用上电加按钮复位。图3 振荡电路图4 复位电
6、路4.2 DS18B20与单片机的接口电路图5 DS18B20与单片机的接口电路4.3独立式键盘电路图6 独立式键盘电路4.4报警模块图7 报警电路4.5 数码管显示模块显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。P2口的低四位作为数码管的位选端。采用动态扫描的方式显示。图8 数码管显示电路4.6 proteus仿真图图9 proteus仿真图4.7 DS18B20简单介绍DS18B20 的性能特点如下独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯DS18B20支持多点组网功能,
7、多个DS18B20可以并联在唯一的三线上,实现组网多点测温DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路适应电压围更宽,电压围:3.05.5V,在寄生电源方式下可由数据线供电温围55125,在-10+85时精度为0.5零待机功耗可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温在9位分辨率时最多在93.75ms把温度转换为数字,12位分辨率时最多在750ms把温度值转换为数字,速度更快用户可定义报警设置报警搜索命令识别并标志超过程序限定温度温度报警条件的器件测量结果直接输出数字温度信号,以
8、一线总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作DS18B20部构造主要由四局部组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置存放器。DS18B20的管脚排列、各种封装形式如图11所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。图10外部封装形式五 软件设计系统程序主要包括主程序、读取温度子程序、温度转换命令子程序、计算温度子程序、按键扫描处理子程
9、序、显示数据子程序等。5.1 主程序流程图主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进展一次。这样可以在一秒之测量一次被测温度,其程序流程见图11所示。初始化读取温度SET键是否按下读出温度值温度计算处理显示数据刷新发温度转换开场命令NY调用显示子程序设置报警温度图11 主程序流程图5.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进展CRC校验,校验有错时不进展温度数据的改写。其程序流程图如图12所示。5.3温度转换命令子程序温度转换命令子程序主要是发温度转换开场命令,当采用12位分辨率时转换时间约为750ms
10、,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图13所示。Y发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器完毕NNY发DS18B20复位命令发跳过ROM命令发温度转换开场命令 完毕图12 读温度流程图 图13 温度转换流程图5.4计算温度子程序计算温度子程序将RAM中读取值进展BCD码的转换运算,并进展温度值正负的判定,其程序流程图如图14所示。 开场温度零下?温度值取补码置“1标志计算小数位温度BCD值 计算整数位温度BCD值 完毕置“0标志NY图14计算温度流程图5.5按键扫描处理
11、子程序按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否那么显示当前温度。如下列图15示。SET键按下ADD键按下DEC键按下显示切换标志位是否为“0调用显示子程序报警温度加1报警温度减1YNYNYN图15 按键扫描处理子程序六心得及体会:此次实习我用单片机做一个完整的系统,在完成的过程中走了很多弯路,比方由于对硬件方面的东西尚不熟,查阅资料以及准备材料时都没有考虑到实践的可行性,在这里要特别感实验室的教师给予了我们耐心的指导,并给我们提出了建立性的意见。在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,虽然以前写过几次程序,但我觉的写
12、好一个程序并不简单。正是通过这些弯路我们才真正学到了不少东西。在做系统的同时,和同学们之间的相互探讨也使我获益匪浅。我们必须学会独立思考,用自己的能力去完成一件作品。有好多的东西,只有我们去试着做了,才能真正的掌握。参考文献:1鑫. 单片机原理与应用 电子工业 2021.12马忠梅,凯,等. 单片机的C语言应用程序设计(第四版) 航空航天大学 3包建华,兴奎等.单片机原理实验与实训教程 东南大学 2021.94 文涛.单片机语言C51典型应用设计. :人民邮电,19985 勇,宇.Vision2单片机应用程序开发指南. :科学,19986 蔡朝洋.单片机控制实习与专题制作. :航天航空大学出社
13、,20007 复华. 单片机及其应用系统. :清华大学,19928 为. 单片机典型系统设计实例精讲及其应用系统. :电子工业,20069 斌,董慧颖. 可重组机器人研究和开展现状. 工业学院学报,2000,194:23-2710 道德.单片机接口技术C51版.:水利水电,1995附录 元件清单元件名称型号数量单片机AT89C511电平转换芯片74HC5732数码管7SEG-MPX4-CA1按键BUTTON4电阻RES2附录总体电路图附录 源程序源程序如下#include#define uint unsigned int#define uchar unsigned charsbit ds =
14、P20 ;sbit dula = P26 ;sbit wela = P27 ;sbit beep = P21 ;sbit SET1 = P22; /定义上限显示调整键sbit DEC = P23; /定义增加减少键sbit ADD = P24; /定义增加减少键sbit SET2= P25; /定义下限显示调整键int temp ;float f_temp ;int warn_l1 = 50 ;int warn_l2 = 0 ;int warn_h1 = 300 ;int warn_h2 = 1000 ;/*xian shi */uchar code table = 0x3f,0x06,0x5
15、b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40;void delay(int z)int a,b ;for(a = 0;a z ;a+)for(b = 0;b 120; b+);void display(uchar num , uchar dat)uchar i;dula = 0;wela = 0; wela = 1;i = 0x00;i = i | (0x01)0)i-;ds = 1;i = 4;while(i0)i-;uchar temp_readbit(
16、void)uint i;bit dat;ds = 0;i+;ds = 1;i+;i+;i+;dat = ds;i = 8;while(i0)i-;return(dat);uchar temp_read(void)uchar i,j,dat;dat = 0;for(i = 0;i 8;i+)j = temp_readbit();dat = (j 1);return(dat);void temp_write(uchar dat)uint i;uchar j;bit testb;for(j = 1;j 1;if(testb)ds = 0;i+;i+;i+;ds = 1;i =8;while(i0)i
17、-;elseds = 0;i = 8;while(i0)i-;ds = 1;i+;i+;void temp_change(void)ds_reset();delay(1);temp_write(0xcc);temp_write(0x44);uint get_temp()uchar a,b;EA = 0;ds_reset();delay(1);temp_write(0xcc);temp_write(0xbe);a = temp_read();b = temp_read();temp = b;temp warn_l2)&(t = warn_l1)warn(10,0x01);else if(t =
18、warn_l2)warn(1,0x02);else if(t = warn_h1)warn(10,0x04);else if(t = warn_h2)warn(1,0x08);elsei = 40;while(i-)dis_temp(get_temp();/*报 警 监 测 显 示*/void bjxs(int a)int x,y,z;x=a/100; /计算得到shi位数字display(5,x); y=a/10-x*10; /计算得到ge位数字display(6,y+10);z=a-x*100-y*10; /计算得到xiao数display(7,z);/*键盘 扫描*/void key()
19、 if(SET1 = 0) delay(100);if(SET1 = 0)while(SET1 = 0)bjxs( warn_h1); if(ADD=0&SET1=0) if(ADD=0&SET1=0) while(ADD=0)bjxs( warn_h1);warn_h1 = warn_h1+10; if(warn_h11000)warn_h1 = 1000;bjxs( warn_h1); else if(DEC=0&SET1=0) if(DEC=0&SET1=0)while(DEC=0)bjxs( warn_h1);warn_h1 = warn_h1-10; if(warn_l1warn_h
20、1)warn_h1=warn_l1;bjxs( warn_h1); if(SET2 = 0) delay(100);if(SET2 = 0)while(SET2 = 0)bjxs( warn_l1); if(ADD=0&SET2=0) if(ADD=0&SET2=0) while(ADD=0)bjxs( warn_l1);warn_l1 = warn_l1+10; if(warn_l1warn_h1)warn_l1 = warn_h1;bjxs( warn_l1); else if(DEC=0&SET2=0) if(DEC=0&SET2=0)while(DEC=0)bjxs( warn_l1);warn_l1 = warn_l1-10; if(warn_l10)warn_l1=0; bjxs( warn_l1); void scan() int i;temp_change();deal(temp);for(i = 0;i 10;i+)dis_temp(get_temp(); EA = 1;void timer0(void)interrupt 1 key(); TH0 = (65536-10000)/256;TL0 = (65536-10000)%256; void main()dula = 0;wela = 0;init_();while(1)scan();. word.zl.