1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。基于单片机的温度系统设计 摘要 随着时代的进步和发展, 单片机技术已经普及到我们生活、 工作、 科研、 各个领域, 已经成为一种比较成熟的技术, 本文主要介绍了一个基于AT89C52 单片机的测温系统, 详细描述了利用数字温度传感器DS18B20 开发测温系统的过程, 重点对传感器在单片机下的硬件连接, 软件编程以及各模块系统流程进行了详尽分析, 特别是数字温度传感器DS18B20 的数据采集过程。对各部分的电路也一一进行了介绍,该系统能够方便的实现实现温度采集和显示, 并可根据需要任意设定上下限报警温度, 它使用起来相当方便, 具
2、有精度高、 量程宽、 灵敏度高、 体积小、 功耗低等优点, 适合于我们日常生活和工、 农业生产中的温度测量, 也能够当作温度处理模块嵌入其它系统中, 作为其它主系统的辅助扩展。DS18B20 与AT89C52 结合实现最简温度检测系统, 该系统结构简单, 抗干扰能力强, 适合于恶劣环境下进行现场温度测量, 有广泛的应用前景。关键词 单片机;AT89C52;温度传感器;DS18B20; Design of temperature measurement system based on single chip microcomputerAbstract With the era of progre
3、ss and development, single-chip technology has spread to our lives, work, research and in various fields, has become a relatively mature technology. This paper introduces a temperature measuring system based on AT89C52, a detailed description of the use of digital temperature sensor DS18B20 measurem
4、ent system development process, focusing on the sensor in SCM hardware connection, software programming and system flow of each module in detail, especially the digital temperature sensor DS18B20 data acquisition process. On the part of the circuit and one one were introduced, the system can facilit
5、ate the realization of the realization of temperature acquisition and display, and can be arbitrarily set the alarm temperature. it is very convenient to use, has high accuracy, wide measuring range, high sensitivity, small volume and low power consumption, suitable for our daily life and work in ag
6、ricultural production and temperature measurement, but also can be used as a temperature processing module embedded in other systems, as the other main system aided extension.DS18B20 combined with AT89C52 to achieve the most simple temperature detection system, the system has the advantages of simpl
7、e structure and strong anti-interference ability, suitable for harsh environment on-site temperature measurement, and has wide application prospect.Keywords Single-chip; AT89C52;Temperature sensor;DS18B20;目录1 概述41.1 课程设计的意义 41.2 设计的任务和要求42 系统总体方案及硬件设计52.1 数字温度计设计方案论证52.1.1 方案一52.1.2 方案二52.2 系统总体设计52
8、.3 系统模块62.3.1 主控制器62.3.2 显示电路72.3.3 温度传感器72.3.4 报警温度调整按键83 系统软件算法分析93.1 主程序流程图93.2 读出温度子程序93.3 温度转换命令子程序93.4 计算温度子程序103.5 显示数据刷新子程序103.6 按键扫描处理子程序104 实验仿真125 总结与体会13查考文献13附1 源程序代码131 概述1.1 课程设计的意义本次课程设计是在我们学过单片机后的一次实习, 可增加我们的动手能力。特别是对单片机的系统设计有很大帮助。本课程设计由两个人共同完成, 在锻炼了自己的同时也增强了自己的团队意识和团队合作精神。1.2 设计的任务
9、和要求1、 基本范围-50-1102、 精度误差小于0.53、 LED 数码直读显示4、 能够任意设定温度的上下限报警功能2 系统总体方案及硬件设计2.1数字温度计设计方案论证2.1.1方案一由于本设计是测温电路, 能够使用热敏电阻之类的器件利用其感温效应, 在将随被测温度变化的电压或电流采集过来, 进行A/D 转换后, 就能够用单片机进行数据的处理, 在显示电路上, 就能够将被测温度显示出来, 这种设计需要用到A/D 转换电路, 其中还涉及到电阻与温度的对应值的计算, 感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。2.1.2 方案二进而考虑到用温度传感器, 在
10、单片机电路设计中, 大多都是使用传感器, 因此这是非常容易想到的, 因此能够采用一只温度传感器DS18B20, 此传感器, 能够很容易直接读取被测温度值, 进行转换, 电路简单, 精度高, 软硬件都以实现, 而且使用单片机的接口便于系统的再扩展, 满足设计要求。从以上两种方案, 很容易看出, 采用方案二, 电路比较简单, 费用较低, 可靠性高, 软件设计也比较简单, 故采用了方案二。2.2系统总体设计温度计电路设计总体设计方框图如图1 所示, 控制器采用单片机AT89C52, 温度传感器采用DS18B20, 用3位LED数码管以串口传送数据实现温度显示。AT89C52显示单片机复位蜂鸣器, 指
11、示灯报警温度调整键温度传感器时钟振荡图2.21 总体设计方框图图2.22 系统仿真图2.3系统模块系统由单片机最小系统、 显示电路、 按键、 温度传感器等组成。2.3.1 主控制器单片机AT89S51 具有低电压供电和体积小等特点, 四个端口只需要两个口就能满足电路系统的设计需要, 很适合便携手持式产品的设计使用系统可用二节电池供电。晶振采用12MHZ。复位电路采用上电加按钮复位。图2.3.11 晶振电路图2.3.12 复位电路2.3.2 显示电路显示电路采用4 位共阴极LED 数码管, P0 口由上拉电阻提高驱动能力, 作为段码输出并作为数码管的驱动。P2 口的低四位作为数码管的位选端。采用
12、动态扫描的方式显示。图2.3.2 数码管显示电路2.3.3温度传感器DS18B20 温度传感器是美国DALLAS 半导体公司最新推出的一种改进型智能温度传感器, 与传统的热敏电阻等测温元件相比, 它能直接读出被测温度, 而且可根据实际要求经过简单的编程实现位的数字值读数方式。DS18B20 的性能特点如下: 1、 独特的单线接口仅需要一个端口引脚进行通信; 2、 多个DS18B20 能够并联在惟一的三线上, 实现多点组网功能3、 无须外部器件; 4、 可经过数据线供电, 电压范围为3.05.5; 5、 零待机功耗; 6、 温度以或位数字; 7、 用户可定义报警设置; 8、 报警搜索命令识别并标
13、志超过程序限定温度( 温度报警条件) 的器件; 9、 负电压特性, 电源极性接反时, 温度计不会因发热而烧毁, 但不能正常工作; DS18B20 能够采用两种方式供电, 一种是采用电源供电方式, 此时DS18B20 的1 脚接地, 2脚作为信号线, 3 脚接电源。另一种是寄生电源供电方式, 如图4 所示单片机端口接单线总线, 为保证在有效的DS18B20 时钟周期内提供足够的电流, 可用一个MOSFET 管来完成对总线的上拉。 温度传感器与单片机的连接当DS18B20 处于写存储器操作和温度A/D 转换操作时, 总线上必须有强的上拉, 上拉开启时间最大为10us。采用寄生电源供电方式时VDD
14、端接地。由于单线制只有一根线, 因此发送接口必须是三态的。2.3.4报警温度调整按键本系统设计三个按键, 采用查询方式, 一个用于选择切换设置报警温度和当前温度, 另外两个分别用于设置报警温度的加和减。均采用软件消抖。 图2.3.4 按键电路3 系统软件算法分析系统程序主要包括主程序, 读出温度子程序, 温度转换命令子程序, 计算温度子程序, 显示数据刷新子程序, 按键扫描处理子程序等。3.1主程序流程图主程序的主要功能是负责温度的实时显示、 读出并处理DS18B20 的测量的当前温度值, 温度测量每1s 进行一次。这样能够在一秒之内测量一次被测温度, 其程序流程见图3.1 所示。初始化读取温
15、度读出温度值温度 计算处理显示数据刷新发温度转换开始命令调用显示子程序SET键是否按下设置报警温度NY图3.1 主程序流程图3.2读出温度子程序读出温度子程序的主要功能是读出RAM 中的9 字节, 在读出时需进行CRC 校验, 校验有错时不进行温度数据的改写。其程序流程图如图3.2 示3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令, 当采用12 位分辨率时转换时间约750ms, 在本程序设计中采用1s 显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图, 图3.3 所示复位命令发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作, CRC校验读取操作,
16、CRC校验CRC校验 证? 9字节完? 结束发跳过ROM命令发温度转换命令结束图3.3 温度转换流程图YYNN图3.2度温度流程 3.4 计算温度子程序计算温度子程序将RAM 中读取值进行BCD 码的转换运算, 并进行温度值正负的判定, 其程序流程图如图3.4 所示。3.5 显示数据刷新子程序显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作, 当标志位位为1时将符号显示位移入第一位。程序流程图如图3.5。开始温度数据移入显示寄存器最高位显示分离出的数据温度零下? 温度值取补码置”1”标志计算小数位温度BCD值计算整数位温度BCD值结束置”0”标志分离显示温度标志位为1? 最高为显示”
17、-”结束NYYNY图3.5 显示数据刷新流程图图3.4 计算温度流程图3.6按键扫描处理子程序按键采用扫描查询方式, 设置标志位, 当标志位为1 时, 显示设置温度, 否则显示当前温度。如下图3.6 示。SET键按下调用显示子程序N报警温度加1报警温度减1ADD键是否按下显示切换标志位是否为”0”DEC键是否按下NNYYY图3.6 按键扫描处理子程序4 实验仿真进入protuse 后, 连接好电路, 并将程序下载进去。将DS18B20 的改为0.1, 数码管显示温度与传感器的温度相同。图41 温度显示仿真当按下SET 键一次时, 进入温度报警上线调节, 此时显示软件设置的温度报警上线, 按AD
18、D或DEC 分别对报警温度进行加一或减一。当再次按下SET 键时, 进入温度报警下线调节, 此时显示软件设置的温度报警下线, 按ADD或DEC 分别对报警温度进行加一或减一。图42 温度调试仿真当第三次按下SET 键时, 退出温度报警线设置。显示当前温度。5 总结与体会经过这次对数字温度计的设计与制作, 让我了解了设计电路的程序, 也让我了解了关于数字温度计的原理与设计理念, 要设计一个电路总要先用仿真仿真成功之后才实际接线的。经过这次学习, 让我对各种电路都有了大概的了解, 因此说, 坐而言不如立而行, 对于这些电路还是应该自己动手实际操作才会有深刻理解。从这次的课程设计中, 我真真正正的意
19、识到, 在以后的学习中, 要理论联系实际, 把我们所学的理论知识用到实际当中, 学习单机片机更是如此, 程序只有在经常的写与读的过程中才能提高, 这就是我在这次课程设计中的最大收获。查考文献【1】马忠梅, 张凯,等.单片机的C语言应用程序设计(第四版)北京航空航天大学出版社【2】薛庆军, 张秀娟, 等.单片机原理实验教程北京航天航空大学出版社【3】廖常初.现场总线概述J.电工技术, 1999.附1 源程序代码/DS18B20 的读写程序,数据脚P2.7 /温度传感器18B20 汇编程序,采用器件默认的12 位转化/最大转化时间750 微秒,显示温度-55 到+125 度,显示精度/为0.1 度
20、, 显示采用4 位LED 共阳显示测温值/P0 口为段码输入,P34P37 为位选/*/#include reg51.h#include intrins.h /_nop_();延时函数用#define dm P0 /段码输出口#define uchar unsigned char#define uint unsigned intsbit DQ=P27; /温度输入口sbit w0=P20; /数码管4sbit w1=P21; /数码管3sbit w2=P22; /数码管2sbit w3=P23; /数码管1sbit beep1=P17; /蜂鸣器1和指示灯1sbit beep2=P14; /蜂
21、鸣器2和指示灯2sbit set=P26; /温度设置切换键sbit add=P24; /温度加sbit dec=P25; /温度减int temp1=0; /显示当前温度和设置温度的标志位为0 时显示当前温度uint h;uint temp;uchar r;uchar high=25,low=20;uchar sign;uchar q=0;uchar tt=0;uchar scale;/*温度小数部分用查表法*/uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x
22、09,0x09;/小数断码表uchar code table_dm12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/共阴LED 段码表0 1 2 3 4 5 6 7 8 9 不亮 -uchar table_dm1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /个位带小数点的断码表uchar data temp_data2=0x00,0x00; /读出温度暂放uchar data display5=0x00,0x00,0x00,0x00,0x00; /显示单元数
23、据, 共4 个数据和一个运算暂用/*11us 延时函数*/void delay(uint t)for (;t0;t-);void scan()int j;for(j=0;j0;i-)DQ=1;_nop_();_nop_(); /从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); /5 usDQ=val&0x01; /最低位移出delay(6); /66 usval=val/2; /右移1 位DQ=1;delay(1);/*DS18B20 读1 字节函数*/从总线上取1 个字节uchar read_byte(void)uchar i;uchar value=0;
24、for(i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); /4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); /4 usif(DQ)value|=0x80;delay(6); /66 usDQ=1;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位delay(200);write_byte(0xcc); /发命令write_byte(0x44); /发转换命令ow_reset();delay(1);wri
25、te_byte(0xcc); /发命令write_byte(0xbe);temp_data0=read_byte(); /读温度值的第字节temp_data1=read_byte(); /读温度值的高字节temp=temp_data1;temp6348) / 温度值正负判断tem=65536-tem;n=1; / 负温度求补码,标志位置1display4=tem&0x0f; / 取小数部分的值display0=ditabdisplay4; / 存入小数部分显示值display4=tem4; / 取中间八位,即整数部分的值display3=display4/100; / 取百位数据暂存displ
26、ay1=display4%100; / 取后两位数据暂存display2=display1/10; / 取十位数据暂存display1=display1%10; /个位数据r=display1+display2*10+display3*100;/符号位显示判断/if(!display3)display3=0x0a; /最高位为0 时不显示if(!display2)display2=0x0a; /次高位为0 时不显示if(n)display3=0x0b; /负温度时最高位显示-void BEEP()if(r=high&r129)beep1=!beep1;elsebeep1=0;if(r128)h
27、orl=256-horl;n=1;display3=horl/100;display3=display3&0x0f;display2=horl%100/10;display1=horl%10;display0=0;if(!display3)display3=0x0a; /最高位为0 时不显示if(!display2)display2=0x0a; /次高位为0 时不显示if(n)display3=0x0b; /负温度时最高位显示-/*按键查询程序*/void keyscan()int temp1; /最高温度和最低温度标志位if(set=0)while(1)delay(500);/消抖if(se
28、t=0)temp1+;while(!set)scan();if(temp1=1)xianshi(high);scan();if(add=0)while(!add)scan();high+=1;if(dec=0)while(!dec)scan();high-=1;if(temp1=2)xianshi(low);if(add=0)while(!add)scan();low+=1;if(dec=0)while(!dec)scan();low-=1;scan();if(temp1=3)temp1=0;break;/*主函数*/void main()dm=0x00; /初始化端口w0=0;w1=0;w2=0;w3=0;for(h=0;h4;h+) /开机显示0000displayh=0;ow_reset(); /开机先转换一次write_byte(0xcc); /Skip ROMwrite_byte(0x44); /发转换命令for(h=0;h100;h+) /开机显示0000scan();while(1)if (temp1=0)work_temp(read_temp(); /处理温度数据BEEP();scan(); /显示温度值keyscan();elsekeyscan();/*结束*/