1、摘 要伴随时代进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一个比较成熟技术, 本文关键介绍了一个基于 89S51 单片机测温系统,具体描述了利用数字温度 传 感 器 DS18B20 开发测温系统过程,关键对传感器在单片机下硬件连接,软件编程和各模块系统步骤进行了详尽分析,尤其是数字温度传感器 DS18B20 数据采集过程。对各部分电路也一一进行了介绍,该系统能够方便实现实现温度采集和显示,并可依据需要任意设定上下限报警温度,它使用起来相当方便,含有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中温度测量,也能够看成温度处理模块嵌入其
2、它系统中,作为其它主系统辅助扩展。DS18B20 和AT89C51 结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛应用前景。关键词: 单片机 报警系统DS18B20 温度传感器 数字温度计 AT89S52目 录1、概述.1 1.1 课程设计意义 .1 1.2 设计任务和要求 .12、系统总体方案及硬件设计 .2 2.1 数字温度计设计方案论证 .2 2.1.1 方案一.2 2.1.2 方案二.2 2.2 系统总体设计.3 2.3 系统模块.4 2.3.1 主控制器.4 2.3.2 显示电路.5 2.3.3 温度传感器.5 2.3.4 报警温度调
3、整按键.63、系统软件算法分析 .7 3.1 主程序步骤图.7 3.2 读出温度子程序.7 3.3 温度转换命令子程序.8 3.4 计算温度子程序 .8 3.5 显示数据刷新子程序.8 3.6 按键扫描处理子程序.94、试验仿真.105、总结和体会.11查考文件 .12附 1 源程序代码 .13 2 实物图.20 1 概述1.1 课程设计意义此次课程设计是对于我们所学传感器原理知识所进行一次实际利用,经过自主课程设计和实际操作,可增加我们本身动手能力。尤其是对温度传感这方面知识有了实质性了解,对深入学习传感器课程起到很大作用。本课程设计经过查阅相关资料,在老师和同学帮助下完成,在锻炼了自我同时
4、也增强了自己团体意识和团体协作精神。1.2 设计任务和要求1、基础范围-50-1102、精度误差小于 0.53、LED 数码直读显示4、能够任意设定温度上下限报警功效2 系统总体方案及硬件设计2.1 数字温度计设计方案论证2.1.1 方案一2.1.1因为本设计是测温电路,能够使用热敏电阻之类器件利用其感温效应,在将随被测温度改变电压或电流采集过来,进行 A/D 转换后,就能够用单片机进行数据处理,在显示电路上,就能够将被测温度显示出来,这种设计需要用到 A/D 转换电路,其中还包含到电阻和温度对应值计算,感温电路比较麻烦。而且在对采集信号进行放大时轻易受温度影响出现较大偏差。2.1.2 方案二
5、进而考虑到用温度传感器,在单片机电路设计中,大多全部是使用传感器,所以这是很轻易想到,所以能够采取一只温度传感器 DS18B20,此传感器,能够很轻易直接读取被测温度值,进行转换,电路简单,精度高,软硬件全部以实现,而且使用单片机接口便于系统再扩展,满足设计要求。从以上两种方案,很轻易看出,采取方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采取了方案二。2.2 系统总体设计温度计电路设计总体设计方框图图 1 所表示,控制器采取单片机AT89S51,温度传感器采取 DS18B20,用 3 位 LED 数码管以串口传送数据实现温度显示。LED 显示单片机复位蜂鸣器,指示灯AT89
6、S51报警温度调整键DS18B20时钟振荡温度传感器图 2.21总体设计方框图图 2.22 系统仿真图2.3 系统模块系统由单片机最小系统、显示电路、按键、温度传感器等组成。2.3.1 主控制器2.3.1单片机 AT89S51 含有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统设计需要,很适合便携手持式产品设计使用系统可用二节电池供电。晶振采取 12MHZ。复位电路采取上电加按钮复位。图 2.3.11 晶振电路图 2.3.12 复位电路2.3.2 显示电路2.3.2显示电路采取 4 位共阴极 LED 数码管,P0 口由上拉电阻提升驱动能力,作为段码输出并作为数码管驱动。P2 口
7、低四位作为数码管位选端。采取动态扫描方法显示。图 2.3.2 数码管显示电路2.3.3 温度传感器2.3.3DS18B20 温度传感器是美国 DALLAS 半导体企业最新推出一个改善型智能温度传感器,和传统热敏电阻等测温元件相比,它能直接读出被测温度,而且可依据实际要求经过简单编程实现位数字值读数方法。DS18B20 性能特点以下:1、独特单线接口仅需要一个端口引脚进行通信;2、多个 DS18B20 能够并联在惟一三线上,实现多点组网功效;3、无须外部器件;4、可经过数据线供电,电压范围为 3.05.5;5、零待机功耗;6、温度以或位数字;7、用户可定义报警设置;8、报警搜索命令识别并标志超出
8、程序限定温度(温度报警条件)器件;9、负电压特征,电源极性接反时,温度计不会因发烧而烧毁,但不能正常工作;DS18B20 能够采取两种方法供电,一个是采取电源供电方法,此时 DS18B20 1 脚接地,2 脚作为信号线,3 脚接电源。另一个是寄生电源供电方法,图 4 所表示单片机端口接单线总线,为确保在有效 DS18B20 时钟周期内提供足够电流,可用一个 MOSFET 管来完成对总线上拉。当 DS18B20 处于写存放器操作和温度 A/D 转换操作时,总线上必需有强上拉,上拉开启时间最大为 10us。采取寄生电源供电方法时 VDD 端接地。因为单线制只有一根线,所以发送接口必需是三态。图 2
9、.3.3 温度传感器和单片机连接2.3.4 报警温度调整按键本系统设计三个按键,采取查询方法,一个用于选择切换设置报警温度和目前温度,另外两个分别用于设置报警温度加和减。均采取软件消抖 3 系统软件算法分析系统程序关键包含主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。3.1 主程序步骤图主程序关键功效是负责温度实时显示、读出并处理 DS18B20 测量目前温度值,温度测量每 1s 进行一次。这么能够在一秒之内测量一次被测温度,其程序步骤见图 3.1 所表示。初始化读取温度读出温度值温度计算处理显示数据刷新发温度转换开始命令调用显示子程序N
10、SET 键是否按下Y设置报警温度图 3.1 主程序步骤图3.2 读出温度子程序读出温度子程序关键功效是读出 RAM 中 9 字节,在读出时需进行 CRC 校验,校验有错时不进行温度数据改写。其程序步骤图图 3.2 示3.3 温度转换命令子程序温度转换命令子程序关键是发温度转换开始命令,当采取 12 位分辨率时转换时间约为750ms,在本程序设计中采取 1s 显示程序延时法等候转换完成。温度转换命令子程序步骤图如上图,图 3.3 所表示发 DS18B20 复位命令发 DS18B20 复位命令发跳过 ROM 命令发跳过 ROM 命令发温度转换开始命令发读取温度命令结束读取操作,CRC 校验图 3.
11、3 温度转换步骤图YN9 字节完?YCRC 校验正?N移入温度暂存器结束图 3.2 读温度步骤图3.4 计算温度子程序计算温度子程序将 RAM 中读取值进行 BCD 码转换运算,并进行温度值正负判定,其程序步骤图图 3.4 所表示。3.5 显示数据刷新子程序显示数据刷新子程序关键是对分离后温度显示数据进行刷新操作,当标志位位为 1时将符号显示位移入第一位。程序步骤图图 3.5。开始N温度零下?Y温度值取补码置“1”标志置“0”标志温度数据移入显示寄存器分离显示温度Y标志位为 1?NY计算小数位温度 BCD 值最高位显示“”计算整数位温度 BCD 值最高为显示分理出数据结束结束图 3.4计算温度
12、步骤图图 3.5显示数据刷新步骤图3.6 按键扫描处理子程序按键采取扫描查询方法,设置标志位,当标志位为 1 时,显示设置温度,不然显示目前温度。以下图 3.6 示。SET 键按下ADD 键是 否按下NDEC 键是 否按下NY报警温度加 1Y报警温度减 1N显示切换标志位是否为“0”Y调用显示子程序图 3.6 按键扫描处理子程序4 试验仿真进入 protuse 后,连接好电路,并将程序下载进去。将 DS18B20 改为 0.1,数码管显示温度和传感器温度相同。图 41 温度显示仿真当按下 SET 键一次时,进入温度报警上线调整,此时显示软件设置温度报警上线, ADD按或 DEC 分别对报警温度
13、进行加一或减一。当再次按下 SET 键时,进入温度报警下线调整,此时显示软件设置温度报警下线, ADD按或 DEC 分别对报警温度进行加一或减一。图 42 温度调试仿真当第三次按下 SET 键时,退出温度报警线设置。显示目前温度。5 总结和体会此次基于“ds18b20数字温度报警器”传感器课程设计大致能够分为:资料搜集程序编辑电路设计模拟仿真电板焊接。每个过程相辅相成,却又相互独立。经过这次对数字温度计设计和制作,让我了解了设计电旅程序,也让我了解了相关数字温度计原理和设计理念,要设计一个电路总要先用仿真仿真成功以后才实际接线。不过最终成品却不一定和仿真时完全一样,因为,再实际接线中有着多种多
14、样条件制约着。而且,在仿真中无法成功电路接法,在实际中因为芯片本身特征而能够成功。所以,在设计时应考虑二者差异,从中找出最适合设计方法。经过一个一个步骤跟进,让我对很多电子元器件结构和基础特征有了一定了解,对电路实际操作让我对电路有了深刻了解。焊接过程是一个很有趣过程,经过小心翼翼一个个引脚焊接,最终成就我们温度传感器,每一步全部那么谨慎以防和相邻电路短接。在很大程度上锻炼了我耐心,同时也能够对整个电路设计及走向有一个深刻了解、了解。当然,因为种种原因:元器件缺失、系统本身及电路影响等造成所得结果不够正确,无法达成预想理想状态,让人很是遗憾。从这次课程设计中,我真真正正意识到,在以后学习中,要
15、理论联络实际,把我们所学理论知识用到实际当中,学习传感器更是如此,任何元件、程序等只有在反复学习和使用过程中才能在利用过程中得心应手,这就是我在这次课程设计中最大收获。人民邮电出版社 【6】杨恢先 黄辉先单片机原理及应用 参考文件【5】赵云 曹经稳 赵春强常见电子元器件及应用电路 电子工业出版社 【4】刘迎春 叶湘滨传感器原理 设计和应用 国防科技大学出版社 1998【3】廖常初.现场总线概述J.电工技术,北京航天航空大学出版社 【2】薛庆军,张秀娟,单片机原理试验教程北京航空航天大学出版社 1999【1】马忠梅,张凯 单片机 C 语言应用程序设计(第四版) 人民出版社附 1 源程序代码/DS
16、18B20 读写程序,数据脚 P2.7/温度传感器 18B20 汇编程序,采取器件默认 12 位转化/为 0.1 度,显示采取 4 位 LED 共阳显示测温值/P0 口为段码输入,P34P37 为位选/最大转化时间 750 微秒,显示温度-55 到+125 度,显示精度 /*/#include reg51.h#include intrins.h#define dm P0#define uchar unsigned char#define uintsbit DQ=P27;sbit w0=P20;sbit w1=P21;sbit w2=P22;sbit w3=P23;sbit beep=P17;s
17、bit set=P26;sbit add=P24;sbit dec=P25;int temp1=0;uint h;uint temp;uchar r;uchar high=35,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,0x09,0x09;/小数断码表uchar code table_dm12=0x3f,0x06,0x5b,0x4f
18、,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/共阴 LED 段码表0123456789 不亮 -unsigned int/温度输入口/数码管 4/数码管 3/数码管 2/数码管 1/蜂鸣器和指示灯/温度设置切换键/温度加/温度减/显示目前温度和设置温度标志位为 0 时显示目前温度/_nop_();延时函数用/段码输出口uchar table_dm1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/个位带小数点断码表uchar data temp_data2=0x00,0x00;uchar data di
19、splay5=0x00,0x00,0x00,0x00,0x00;/读出温度暂放/显示单元数据,共 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_();DQ=val&0x01;delay(6);val=val/2;DQ=1;delay(1);/*DS18B20 读 1 字节函数*/从总线上取 1 个字节uchar read_byte(void)uchar i;u
20、char value=0;for(i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80;delay(6);DQ=1;return(value);/*读出温度函数*/read_temp()ow_reset();delay(200);write_byte(0xcc);write_byte(0x44);ow_reset();delay(1);write_byte(0xcc);write_byte
21、(0xbe);/发命令/发命令/发转换命令/总线复位/66 us/4 us/4 us/从高拉倒低/5 us/最低位移出/66 us/右移 1 位temp_data0=read_byte();temp_data1=read_byte();temp=temp_data1;temp6348)tem=65536-tem;n=1;display4=tem&0x0f;display0=ditabdisplay4;display4=tem4;display3=display4/100;display1=display4%100;display2=display1/10;display1=display1%1
22、0;/ 温度值正负判定/ 负温度求补码,标志位置 1/ 取小数部分值/ 存入小数部分显示值/ 取中间八位,即整数部分值/ 取百位数据暂存/ 取后两位数据暂存/ 取十位数据暂存/个位数据r=display1+display2*10+display3*100;/符号位显示判定/if(!display3)display3=0x0a;if(!display2)display2=0x0a;if(n)display3=0x0b;/负温度时最高位显示-/次高位为 0 时不显示/最高位为 0 时不显示void BEEP()if(r=high&r129)|r128)horl=256-horl;n=1;displ
23、ay3=horl/100;display3=display3&0x0f;display2=horl%100/10;display1=horl%10;display0=0;if(!display3)display3=0x0a;if(!display2)display2=0x0a;if(n)display3=0x0b; /负温度时最高位显示-/次高位为 0 时不显示/最高位为 0 时不显示/*按键查询程序*/void keyscan()int temp1;if(set=0)while(1)delay(500);/消抖if(set=0)temp1+;/最高温度和最低温度标志位while(!set)s
24、can();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+)displayh=0;ow_reset();write_byte(0xcc);write_byte(0x44);for(h=0;h100;h+)scan();while(1)if (temp1=0)/初始化端口/开机显示0000/开机先转换一次/Skip ROM/发转换命令/开机显示0000work_temp(read_temp();BEEP();scan();keyscan();elsekeyscan();/处理温度数据/显示温度值/*结束*/