版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于单片机的智能温度计的设计摘 要随着时代的进步和发展,智能仪表已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系
2、统的辅助扩展。DS18B20与STC89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。关键词:温度测量;DS18B20;STC89C51目录1 智能仪器仪表的简介11.1智能仪器仪表简介11.2智能仪器仪表的作用21.3本课题的背景和意义22 系统设计简介32.1 数字温度计简介32.2 设计要求32.3 设计方案论证33.系统硬件设计53.1主控制器选择53.2显示电路53.3温度传感器简介63.4蜂鸣器模块电路73.6电源模块84 设计语言及软件介绍84.1 C51语言介绍84.2 keil uvision4软件介绍95
3、系统软件设计105.1 概述105.2 系统程序设计模块105.2.1主程序105.2.2 LCD写指令子函数115.2.3 LCD写数据子函数115.2.4 LCD 写字符串子函数125.2.5 LCD初始化子函数135.2.6 DS18B20复位子函数145.2.7 DS18B20读数据子函数155.2.8 DS18B20写数据子函数165.2.9 读取温度值并转换子函数175.2.10 显示温度子函数185.2.11 设置报警值子函数185.2.12报警子程序195.3 控制源程序195.3.1 C51程序195.3.2程序清单265.4 调试及仿真265.4.1温度计功能仿真275.4
4、.2设置报警功能仿真27431 智能仪器仪表的简介1.1智能仪器仪表简介1. LCD1602液晶显示器工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶
5、大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。2. 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。蜂鸣器采用直流电压供电,其能发出单调的或者某个固定频率的声音,如嘀嘀嘀,嘟嘟嘟等。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,通常在计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件使用。3. DS18B20DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹
6、式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。4. STC89C51STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8K Bytes的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统
7、及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路。1.2智能仪器仪表的作用1. LCD1602液晶显示器:显示传感器当前所感受到的温度2. 蜂鸣器:当当前温度超过或低于所固定温度时工作,即发出警报3. STC89C51:储存用户程序实现程序功能4.
8、DS18B20:感受温度,用于获取温度1.3本课题的背景和意义2 系统设计简介2.1 数字温度计简介数字温度计可以准确的判断和测量温度,以数字显示,而非指针或水银显示。故称数字温度计或数字温度表。数字温度计采用温度敏感元件也就是温度传感器(如铂电阻,热电偶,半导体,热敏电阻等),将温度的变化转换成电信号的变化,如电压和电流的变化,温度变化和电信号的变化有一定的关系,如线性关系,一定的曲线关系等,这个电信号可以使用模数转换的电路即AD转换电路将模拟信号转换为数字信号,数字信号再送给处理单元,如单片机或者PC机等,处理单元经过内部的软件计算将这个数字信号和温度联系起来,成为可以显示出来的温度数值,
9、如25.0摄氏度,然后通过显示单元,如LED,LCD或者电脑屏幕等显示出来给人观察。这样就完成了数字温度计的基本测温功能。2.2 设计要求1、利用温度传感器(DS18B20)测量所接触物体的温度。2、测量范围在050内可以随意规定,精度为±0.5。3、测量温度由LCD1602液晶显示器直读显示。4、超过规定范围发出警报。2.3 设计方案论证根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示等功能。选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路
10、,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用4位共阳LED数码管以动态扫描法实现。检测范围-55摄氏度到125摄氏度。按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。本课题以是89C51单片机为核心设计的一种数字温度控制系统,系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等组成。系统框图主要由主控制器、单片机复位、时钟振荡、LED显示、温度传感器组成。数字温度计总体电路结构框
11、图如图2.3所示。STC89C51主控制器按键模块液晶模块 电源模块蜂鸣器模块传感器模块 图2.3 数字温度计总体电路结构框图3.系统硬件设计3.1主控制器选择图3-1STC89C51引脚图3.2显示电路 显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用P0和P3口,串口的发送和接收,采用4位共阳LED数码管,,此处选择型号为7SEG-MPX4-CA红灯共阳数码管,从主控制器AT89C51芯片P0口输出段码,列扫描用P3.0P3.3口来实现,列驱动用74HC04六反相器。如图所示: 图3-2显示电路3.3温度传感器简介 由于传统的热敏电阻等测温元件测出的一般都是电压,再转
12、换成对应的温度,要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用DALLAS公司的数字温度传感器DS18B20作为测温元件。图3-3 DS18B20的测温原理图 3.4蜂鸣器模块电路图3-4蜂鸣器原理图3.5按键模块电路图3-5按键模块原理图3.6电源模块图3-6电源模块原理图4 设计语言及软件介绍4.1 C51语言介绍单片机C51语言是由C语言继承而来的。和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于普通的桌面平台。C51语言具有C语言结构清晰的优点,便于学习,同时具有汇编语言的硬件操作能力。对于具有C语言编程基础的读者,能够轻松地掌握单片机C51语言的程序
13、设计。单片机C51语言兼备高级语言与低级语言的优点。语法结构和标准C语言基本一致,语言简洁,便于学习。 运行于单片机平台,支持的微处理器种类繁多,可移植性好。对于兼容的8051系列单片机,只要将一个硬件型号下的程序稍加修改,甚至不加改变,就可移植到另一个不同型号的单片机中运行。 其具有高级语言的特点,尽量减少底层硬件寄存器的操作。 单片机C51语言提供了完备的数据类型、运算符及函数供使用。 C51语言是一种结构化程序设计语言,可以使用一对花括号“”将一系列语句组合成一个复合语句,程序结构清晰明了。C51语言代码执行的效率方面十分接近汇编语言,且比汇编语言的程序易于理解,便于代码共享。4.2 k
14、eil uvision4软件介绍Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。2009年2月发布Keil Vision4,Keil Vision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全
15、控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多最新的ARM芯片,还添加了一些其他新功能。5 系统软件设计5.1 概述5.2 系统程序设计模块系统程序主要包括主函数,LCD写指令子函数,LCD写数据子函数,LCD 写字符串子函数,LCD初始化子函数,DS18B20复位子函数,DS18B20读数据子函数,DS18B20写数据子函数,读取温度值并转换子函数,显示温度子程序,设置报警值子程序和报警子程序等。5.2.1主程序主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值。温度测量每1s进行一次。
16、图5.2.1 主程序流程图5.2.2 LCD写指令子函数图5.2.2 LCD写指令子函数流程图5.2.3 LCD写数据子函数图5.2.3 LCD写数据子函数流程图 5.2.4 LCD 写字符串子函数图5.2.4 LCD写字符串子函数流程图5.2.5 LCD初始化子函数图5.2.5 LCD初始化子函数流程图5.2.6 DS18B20复位子函数图5.2.6 DS18B20复位子函数流程图5.2.7 DS18B20读数据子函数图5.2.7 DS18B20读数据子函数流程图5.2.8 DS18B20写数据子函数图5.2.8 DS18B20写数据子函数流程图5.2.9 读取温度值并转换子函数图5.2.9
17、 读取温度值并转换子函数流程图5.2.10 显示温度子函数图5.2.10 显示温度子函数流程图5.2.11 设置报警值子函数图5.2.11 设置报警值子函数流程图 5.2.12报警子程序图5.2.3 报警子程序图 5.3 控制源程序5.3.1 C51程序#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit DQ=P37;/ds18b20与单片机连接口unsigned char code str1="Current T= &qu
18、ot;unsigned char code str2=" H=38C L=16C "uchar data disdata5;uint tvalue,CurrentT=0;/温度值uchar tflag;/温度正负标志#define LCD_BUS P0sbit RS=P11;sbit RW=P12;sbit EN=P14;sbit SetKey = P10;sbit UpKey = P13;sbit DnKey = P16;sbit BEEP = P23;unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;uch
19、ar Current_Temp_Display_Buffer=" TEMP: "uchar code df_Table= 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9;uchar Temp_Value=0x00,0x00;uchar Display_Digit=0,0,0,0;bit DS18B20_IS_OK = 1;void delayms(uint ms) /延时xx毫秒 uchar i;while(ms-) for(i=0;i<120;i+);void command(uint com) /LCD写指令 RS=0; /RS为0 LCD_BUS
20、=com; /装载指令 delayms(5); /延时5ms EN=1; /LCD使能 delayms(5);/延时5ms EN=0;/LCD不使能void write_dat(uchar dat) /LCD写数据 RS=1;/RS为1 LCD_BUS=dat;/装载数据 delayms(5); /延时5ms EN=1; /LCD使能 delayms(5); /延时5ms EN=0; /LCD不使能void writestring(uchar x,uchar y,uchar *s) /LCD 写字符串 if (y = 0) command(0x80 + x); /表示第一行 else comm
21、and(0xC0 + x); /表示第二行while (*s) /判断是否字符串的结尾 write_dat( *s); /显示当前字符 s +; /字符串地址加1 void writeChar(uchar x,uchar y,uchar s) /LCD 写字符串 if (y = 0) command(0x80 + x); /表示第一行 else command(0xC0 + x); /表示第二行 write_dat( s); /显示当前字符 void LCD_Initial()/LCD初始化 EN=0; /LCD不使能 RW=0; /RW为0 command(0x38);/发送初始化指令 co
22、mmand(0x0c);/发送初始化指令 command(0x06); /发送初始化指令 command(0x01); /发送初始化指令 command(0x80+0x02);/发送LCD初始位置/*DS1820程序*/void delay_18B20(unsigned int i)/延时1微秒 while(i-);void ds1820rst(void)/*ds1820复位*/ unsigned char x=0;DQ = 1; /DQ复位delay_18B20(4); /延时DQ = 0; /DQ拉低delay_18B20(100); /精确延时大于480usDQ = 1; /拉高dela
23、y_18B20(40); uchar ds1820rd(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;delay_18B20(10); return(dat);void ds1820wr(uchar wdata)/*写数据*/unsigned char i=0; for (i=8; i>0; i-) DQ = 0;DQ = wdata&0x01;delay_18B20
24、(10);DQ = 1;wdata>>=1; unsigned int Read_Temperature(void)/*读取温度值并转换*/uchar a,b;ds1820rst(); ds1820wr(0xcc);/*跳过读序列号*/ds1820wr(0x44);/*启动温度转换*/ds1820rst(); ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0xbe);/*读取温度*/ a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a; if(tvalue<0x0fff
25、) tflag=0; else tvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625);/温度值扩大10倍,精确到1位小数CurrentT=tvalue;return(tvalue);void Display_Temperature()/显示温度uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue%1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 if(tflag=0) flag
26、dat=43;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号:-if(tflag=1)writeChar(10,0,flagdat);/显示符号位writeChar(11,0,disdata0);/显示百位writeChar(12,0,disdata1);/显示十位 writeChar(13,0,disdata2);/显示个位 writeChar(14,0,0X2E);/显示小数点 writeChar(15,0,disdata3);/显示小数位elsewriteChar(10,0,disdata0);/显示百位writeChar(11,0,disdata1);/显示十
27、位 writeChar(12,0,disdata2);/显示个位 writeChar(13,0,0X2e);/显示小数点 writeChar(14,0,disdata3);/显示小数位 writeChar(15,0,' ');/显示小数位 void SetFun(void)unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;if(SetKey=0)delayms(20); /延时防抖if(SetKey=0) /Set按键按下if(Set<2)Set+; /设置项加1else Set=0;switch(Set) /根据设置项,在设置项前显
28、示指示符合case 0: writestring(0,1," ");writestring(8,1," ");break;case 1:writestring(0,1,">");writestring(8,1," ");break;case 2:writestring(0,1," ");writestring(8,1,">");break;while(SetKey=0);if(UpKey=0)&&(Set!=0) /设置项参数递减delayms(2
29、0);if(UpKey=0)switch(Set)case 1:if(AlarmTempLow<125) AlarmTempLow+;else AlarmTempLow=125; break;case 2:if(AlarmTempTop<125) AlarmTempTop+;else AlarmTempTop=125; break;i1 = AlarmTempLow/100; /获得温度值的百位 i2 = AlarmTempLow%100/10; /获得温度值的十位i3 = AlarmTempLow%10; /获得温度值的个位i4 = AlarmTempTop/100; /获得温度
30、值的百位 i5 = AlarmTempTop%100/10; /获得温度值的十位i6 = AlarmTempTop%10; /获得温度值的个位writestring(5,1," "); /清除显示writestring(13,1," ");/清除显示if(i1!=0)writeChar(5,1,i1+'0'); /显示百位if(i1=0)&&(i2!=0) writeChar(5,1,i2+'0');/显示十位,消隐百位0if(i1!=0) writeChar(6,1,i2+'0');/显示
31、十位if(i1=0)&&(i2=0)writeChar(5,1,i3+'0');/显示个位else if(i1=0)&&(i2!=0)writeChar(6,1,i3+'0');/显示个位,消隐十位0if(i1!=0) writeChar(7,1,i3+'0');/显示个位if(i4!=0)writeChar(13,1,i4+'0');if(i4=0)&&(i5!=0) writeChar(13,1,i5+'0');if(i4!=0) writeChar(14,1,i
32、5+'0');if(i4=0)&&(i5=0)writeChar(13,1,i6+'0');else if(i4=0)&&(i5!=0)writeChar(14,1,i6+'0');if(i4!=0) writeChar(15,1,i6+'0');while(UpKey=0);if(DnKey=0)&&(Set!=0)/设置项参数递增delayms(20);if(DnKey=0)switch(Set)case 1:if(AlarmTempLow>0) AlarmTempLow-
33、;else AlarmTempLow=0; break;case 2:if(AlarmTempTop>0) AlarmTempTop-;else AlarmTempTop=0; break;i1 = AlarmTempLow/100; /获得温度值的百位 i2 = AlarmTempLow%100/10; /获得温度值的十位i3 = AlarmTempLow%10; /获得温度值的个位i4 = AlarmTempTop/100; /获得温度值的百位 i5 = AlarmTempTop%100/10; /获得温度值的十位i6 = AlarmTempTop%10; /获得温度值的个位writ
34、estring(5,1," ");writestring(13,1," ");if(i1!=0)writeChar(5,1,i1+'0');if(i1=0)&&(i2!=0) writeChar(5,1,i2+'0');if(i1!=0) writeChar(6,1,i2+'0');if(i1=0)&&(i2=0)writeChar(5,1,i3+'0');else if(i1=0)&&(i2!=0)writeChar(6,1,i3+'
35、0');if(i1!=0) writeChar(7,1,i3+'0');if(i4!=0)writeChar(13,1,i4+'0');if(i4=0)&&(i5!=0) writeChar(13,1,i5+'0');if(i4!=0) writeChar(14,1,i5+'0');if(i4=0)&&(i5=0)writeChar(13,1,i6+'0');else if(i4=0)&&(i5!=0)writeChar(14,1,i6+'0'
36、);if(i4!=0) writeChar(15,1,i6+'0');while(DnKey=0);void Alarm(void) /报警子函数if(CurrentT>(AlarmTempTop*10)|(CurrentT<(AlarmTempLow*10)|(tflag=1) /判断是否超出设定范围BEEP=0; /超出报警else BEEP=1; /取消报警void main(void)unsigned char i=0;P2=0xef;BEEP=1; LCD_Initial(); /LCD 初始化Read_Temperature(); /读取温度值write
37、string(1,0,"DS18B20 Alarmer"); /显示“DS18B20 Tester”delayms(1000);/延时1Swritestring(0,0,"Current T= "); /显示“Current T= ”writestring(0,1," Low=10 Top=40 "); /显示“Low=10 Top=40”NG=0;while(1) Read_Temperature();/读取温度值Display_Temperature();/显示温度值SetFun(); / 按键功能子函数Alarm();/ 报警功能子函数5.3.2程序清单HEX输出文件5.4 调试及仿真经软件调试
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 技术职业学院招标文件延长公告
- 中原地产房屋买卖合同问答
- 标准砖块采购合同样本
- 进口购销合同
- 盾构工程分包合同劳务
- 方式选购协议案例
- 互联网服务合同协议
- 家电行业联盟合同
- 产权房屋买卖合同范本模板
- 酒精制品购销合同
- 小工 日工劳务合同范本
- 幼儿园教师职称五套试题及答案
- 广东2024年广东省通信管理局局属单位招聘笔试历年典型考题及考点附答案解析
- 报告文学研究
- 弃土综合利用协议
- 幼儿园中班语言课件:《小花猫交朋友》
- SH/T 3065-2024 石油化工管式炉急弯弯管工程技术规范(正式版)
- 2024年《艺术概论》知识考试题库(附答案)
- GB/T 43878-2024旋挖钻机截齿
- 摊位安全责任书
- 《纸质文物修复与保护》课件-03纸质文物病害类型
评论
0/150
提交评论