简易数字温度计设计_第1页
简易数字温度计设计_第2页
简易数字温度计设计_第3页
简易数字温度计设计_第4页
简易数字温度计设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录摘要2系统设计21.1设计任务21.2设计要求22系统方案论证22.1主控模块的论证与选择22.2显示模块的论证与选择32.3按键模块的论证与选择33系统理论分析与计算33.1 DS18B20的理论分析与计算34电路与程序设计44.1电路的设计44.2程序的设计75测试方案与测试数据85.1测试方案85.2 测试条件与仪器95.3 测试结果96 总结9附录 主要源程序10摘要:本系统利用单片机AT89C52采用程序设计方法来测试温度,还可以通过两个按键设置温度报警上限,当测试温度超过设定的温度上限时,蜂鸣器器就会报警且绿灯关闭,红灯点亮;当温度低于上限时蜂鸣器关闭且红灯关闭,绿灯点亮。并通

2、过液晶屏1602显示其测试温度以及设置的上限温度。 关键词:STC89C52、LCD1602、DS18B20简易数字温度计设计系统设计1.1设计任务设计一数字温度测量系统,能自动实现实际温度的测量与显示。1.2设计要求1.2.1基本功能(1)测温范围-30+120。(2)测量误差在±0.5之内。(3)能正常显示测量的温度。1.2.2扩展功能(1)增加温控功能,并可修改设置温控的上下限。(2)增加温控报警功能。2系统方案论证 本系统主要由主控模块、显示模块、按键模块、蜂鸣器模块、LED模块、传感器模块组成,下面分别论证这几个模块的选择。2.1主控模块的论证与选择 方案一:AT89C52

3、单片机是一种高性能8位单片微型计算机。内核本身具有丰富的指令集,足够实现本次作品的全部基本功能和部分拓展功能,相比Atmega16我们对AT89C52更为熟悉,且芯片价格较低,性价比高。 方案二:采用ATmega16芯片作为主控芯片。由于对芯片的不熟悉,导致如果想要实现温度计全部基本功能和部分拓展功能,较为困难。综上所述,选择方案一。2.2显示模块的论证与选择 方案一:采用LCD1602显示。LCD1602相对便宜,虽然其本身不能显示中文,但是温度计只需显示数字和一些英文,符合这次设计要求。 方案二:采用LCD12864显示。LCD12864屏幕显示细腻直观,且可以显示中文,但是相对昂贵。 综

4、上所述,选择方案一。2.3按键模块的论证与选择 方案一:采用4X4矩阵按键。尽管按键一目了然,但连线复杂,扫描过程烦琐,会耗费大量的系统资源。 方案二:独立按键,我们只使用了两个按键来调节上限,大大节省了系统硬件资源,便于系统扩展。 综上所述,选择方案二。3系统理论分析与计算3.1 DS18B20的理论分析与计算DS18B20 通过编程,可以实现最高 12 位的温度存储值,在寄存器中,以补码的格式存储,如图1所示。图1 DS18B20 温度数据格式寄存器一共 2 个字节,LSB 是低字节,MSB 是高字节,其中 MSb 是字节的高位,LSb 是字节的低位。大家可以看出来,二进制数字,每一位代表

5、的温度的含义,都表示出来了。其中 S表示的是符号位,低 11 位都是 2 的幂,用来表示最终的温度。DS18B20 的温度测量范围是从-55 度到+125 度,而温度数据的表现形式,有正负温度,寄存器中每个数字如同卡尺的刻度一样分布,如图 2所示。图2 DS18B20 温度值二进制数字最低位变化 1,代表温度变化 0.0625 度的映射关系。当 0 度的时候,那就是0x0000,当温度 125 度的时候,对应十六进制是 0x07D0,当温度是零下 55 度的时候,对应的数字是 0xFC90。反过来说,当数字是 0x0001 的时候,那温度就是 0.0625 度了。 4电路与程序设计4.1电路的

6、设计4.1.1系统总体框图系统总体框图如图3所示STC89C52独立按键*2LCD1602DS18B20温度传感器最小系统蜂鸣器模块LED*2图3 系统总体框图4.1.2控制按键&LED电路 按下S1能增加温度报警上限,按下S2能减少温度报警上限。测试温度低于上限时,绿灯LED1亮。当温度超过设定的上限时,红灯LED2亮。图4 控制按键&LED4.1.3蜂鸣器电路 当测试温度超过设定温度时,蜂鸣器开启;当测试温度低于设定温度时,蜂鸣器关闭。蜂鸣器电流相对较大,因此需要用三极管驱动,并且加了一个 1K欧的电阻作为限流电阻。此外还加了一个 D1二极管,这个二极管叫做续流二极管。图5

7、 蜂鸣器电路4.1.4显示电路显示电路使用LCD1602,第一行显示”Temperature”第二行显示测试温度和温度上限,两者中间显示一个”或”。RP1为上拉排阻。图6 显示电路4.1.5传感器电路图7 传感器电路4.1.6总体电路图8 整体电路4.1.7电源 使用5V直流电源。4.2程序的设计4.2.1程序功能描述(1)能够测试-30+120的温度。(2)按下S1能增加温度报警上限,按下S2能减少温度报警上限。(3)测试温度低于上限时,绿灯亮,蜂鸣器关闭。当温度超过设定的上限时,红灯亮且蜂鸣器响起。4.2.2程序流程图开始定时器初始化启动DS18B20液晶初始化读取温度温度<warn

8、T?蜂鸣器开启红灯点亮绿灯关闭将二进制转换成整数并显示到LCD上蜂鸣器关闭红灯关闭绿灯点亮是否S1按下?S2按下?warnT+1warnT-1是是否否图9 程序流程图5测试方案与测试数据5.1测试方案5.1.1软件仿真测试用Proteus 7.5软件画出电路图,模拟硬件对程序进行调试。 5.1.2硬件软件联调将编写的单片机C语言程序下载到实际硬件中,进行硬件软件联调。5.2 测试条件与仪器测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。测试仪器:数字示波器,数字万用表。5.3 测试结果系统上电运行后,LCD能正常显示测试温度且绿灯点亮

9、,测试温度每秒更新。按下S1能使报警温度上限 +1,按下S2能使报警温度上限-1。当测试温度超过上限温度时,绿灯关闭,红灯点亮且蜂鸣器开启;当测试温度低于上限温度时,红灯关闭,绿灯点亮且蜂鸣器关闭。6 总结本系统以单片机STC89C52芯片为核心部件,利用LCD1602、独立按键、蜂鸣器、DS18B20并配合C语言算法实现了简易数字温度计设计,完成此次设计题目中的全部基本功能和部分拓展功能。在系统设计过程中,力求硬件线路简单,充分发挥软件编程方便灵活的特点,来满足系统设计要求。在本次设计的过程中,遇到了许多突发事件和困难,设计制作曾一度止步不前,但通过仔细分析和调整后解决了一个又一个的问题。在

10、整个过程中我们深刻的体会到团队精神的重要性,并提高了自己解决问题的能力。附录 主要源程序main程序:#include <reg52.h>sbit KEY1 = P10; / 上调报警温度sbit KEY2 = P11; / 下调报警温度sbit LED1 = P12; / 正常时绿灯亮sbit LED2 = P13; / 报警时红灯亮sbit BUZZ = P16;bit enBuzz = 0; /蜂鸣器使能标志bit flag1s = 0; /1s定时标志unsigned int warnT = 30; /报警温度值unsigned char T0RH = 0; /T0重载值的

11、高字节unsigned char T0RL = 0; /T0重载值的低字节void ConfigTimer0(unsigned int ms); unsigned char IntToString(unsigned char *str, int dat);extern bit Start18B20();extern bit Get18B20Temp(int *temp);extern void InitLcd1602();extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);extern voi

12、d LcdWriteCmd(unsigned char cmd);void main() bit res;bit backup = 1; int temp; /读取到的当前温度值 int intT, decT; /温度值的整数和小数部分 unsigned char len,len1; unsigned char str12,str112; EA = 1; /开总中断P1 = 0XF3; ConfigTimer0(1); /T0定时1ms Start18B20(); /启动DS18B20 InitLcd1602(); /初始化液晶 while (1) if (flag1s) /每秒更新一次温度

13、flag1s = 0; res = Get18B20Temp(&temp); /读取当前温度 if (res) /读取成功时,刷新当前温度显示 intT = temp >> 4; /分离出温度值整数部分 decT = temp & 0xF; /分离出温度值小数部分 len = IntToString(str, intT); /整数部分转换为字符串 len1 = IntToString(str1, warnT); /报警温度转换为字符串 strlen+ = '.' /添加小数点 decT = (decT*10) / 16; /二进制的小数部分转换为1/

14、位十进制位 strlen+ = decT + '0' /十进制小数位再转换为/ASCII字符strlen+ = 0xdf; /添加字符串“”strlen+ = 'C'strlen+ = ' 'strlen = '0' /添加字符串结束符str1len1+ = 0xdf; /添加字符串“”str1len1+ = 'C'str1len1 = '0' /添加字符串结束符if (intT < warnT) /超过报警温度时执行报警 enBuzz = 0;/关闭蜂鸣器 LcdWriteCmd(0x01)

15、; /清屏 LcdShowStr(2, 0, "Temperature");/显示第一行 LcdShowStr(2, 1, str); /显示实时温度 LcdShowStr(9, 1, "<"); LcdShowStr(11, 1, str1); /显示报警温度 else enBuzz = 1; /启动蜂鸣器发声 LcdWriteCmd(0x01); /清屏 LcdShowStr(4, 0, "Warning!"); /显示警告 LcdShowStr(0, 1, "Temp:"); LcdShowStr(5,

16、 1, str); /显示实时温度 LcdShowStr(11, 1, ">"); LcdShowStr(12, 1, str1); /显示报警温度 else /读取失败时,提示错误信息 LcdShowStr(4, 1, "error!"); Start18B20(); /重新启动下一次转换 /* 按键动作函数 */void KeyAction () if (KEY1 = 0) KEY1 = 1; warnT+; else if (KEY2 = 0) KEY2 = 1; warnT-; /* 整型数转换为字符串,str-字符串指针,dat-待转换数

17、,返回值-字符串长度 */unsigned char IntToString(unsigned char *str, int dat) signed char i = 0; unsigned char len = 0; unsigned char buf6; if (dat < 0) /如果为负数,首先取绝对值,并在指针上添加负号 dat = -dat; *str+ = '-' len+; do /先转换为低位在前的十进制数组 bufi+ = dat % 10; dat /= 10; while (dat > 0); len += i; /i最后的值就是有效字符的个

18、数 while (i- > 0) /将数组值转换为ASCII码反向拷贝到接收指针上 *str+ = bufi + '0' *str = '0' /添加字符串结束符 return len; /返回字符串长度/* 配置并启动T0,ms-T0定时时间 */void ConfigTimer0(unsigned int ms) unsigned long tmp; /临时变量 tmp = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tm

19、p = tmp + 28; /补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0/* T0中断服务函数,完成250ms, 1s定时 */void InterruptTimer0() interrupt 1 static unsig

20、ned int tmr1s = 0;static unsigned int tmrms = 0; TH0 = T0RH; /重新加载重载值 TL0 = T0RL;if (enBuzz) /蜂鸣器发声处理 BUZZ = BUZZ; /启动蜂鸣器发声LED1 = 0;LED2 = 1;else BUZZ = 1;/关闭蜂鸣器LED1 = 1;LED2 = 0; tmr1s+;tmrms+;if (tmrms >= 250)/延时250ms tmrms = 0; KeyAction (); if (tmr1s >= 1000) /定时1s tmr1s = 0; flag1s = 1; D

21、S18B20程序:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P32; /DS18B20通信引脚/* 软件延时函数,延时时间(t*10)us */void DelayX10us(unsigned char t) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (-t);bit Get18B20Ack()bit ack;EA = 0;IO_18B20 = 0;DelayX10us(50);IO_1

22、8B20 = 1;DelayX10us(6);ack = IO_18B20;while(!IO_18B20);EA = 1;return ack;void Write18B20(unsigned char dat)unsigned char mask;EA = 0;for(mask=0x01; mask!= 0; mask<<=1)IO_18B20 = 0;_nop_();_nop_();if(mask&dat) = 0)IO_18B20 = 0;elseIO_18B20 = 1;DelayX10us(6);IO_18B20 = 1;EA = 1;unsigned char

23、 Read18B20()unsigned char dat;unsigned char mask;EA = 0;for(mask=0x01; mask!=0; mask<<=1)IO_18B20 = 0;_nop_();_nop_();IO_18B20 = 1;_nop_();_nop_();if(!IO_18B20)dat &= mask;elsedat |= mask;DelayX10us(6);EA = 1;return dat;bit Start18B20()bit ack;ack = Get18B20Ack();if(ack = 0)Write18B20(0xCC

24、);Write18B20(0x44);return ack;bit Get18B20Temp(int *temp)bit ack;unsigned char LSB, MSB;ack = Get18B20Ack();if(ack = 0)Write18B20(0xCC);Write18B20(0xBE);LSB = Read18B20();MSB = Read18B20();*temp = (int)MSB<<8) + LSB;return ack;LCD1602程序:#include <reg52.h>#define LCD1602_DB P0sbit LCD1602

25、_RS = P20;sbit LCD1602_RW = P21;sbit LCD1602_E = P22;/* 等待液晶准备好 */void LcdWaitReady() unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = LCD1602_DB; /读取状态字 LCD1602_E = 0; while (sta & 0x80); /bit7等于1表示液晶正忙,重复检测直到其等于0为止/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */void LcdWriteCmd(unsigned char cmd) LcdWaitReady(); LCD1602_RS = 0; LCD1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论