数字温度计.docx
- 文档编号:11582814
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:31
- 大小:359.26KB
数字温度计.docx
《数字温度计.docx》由会员分享,可在线阅读,更多相关《数字温度计.docx(31页珍藏版)》请在冰豆网上搜索。
数字温度计
第一章问题描述
设计一个数字温度计,满足以下要求:
(1)测试范围在-55——125℃;
(2)误差在0.5℃以内;
(3)采用LED数码管直读显示。
第二章设计思想
大多单片机接口输入的信号是数字信号,或有带A/D转换的高端单片机也可以输入模拟信号。
由单片机获取非电信号的温度信息,必须通过温度传感器。
传统的温度测量多以热敏电阻作为温度传感器。
但是,热敏电阻的可靠性较差、测量温度精度低,而且还需经A/D转换成数字信号后才能由单片机进行处理。
因此,使用数字温度传感器可简化硬件设计、方便单片机读取数据、节约成本。
所以可以采用一只温度传感器DS18B20。
本设计以检测温度并显示温度提供上下限报警为目的,按照系统设计功能的要求,确定系统由4个模块组成:
主控器、测温电路,报警电路,显示电路。
系统以DS18B20为传感器用以将温度模拟量转化为电压数字量以总线传入单片机,以AT89S52为主芯片,在主芯片对DS18B20传入的温度值进行处理,由单片机程序控制,将经处理后的温度由12864液晶屏显示出来。
第三章硬件设计
3.1方案总体设计
温度计电路设计总体设计方框图如图3.1所示,控制器采用单片机AT89C52,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
图3.1 总体设计方框图
(1)主控制器
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
(2)显示电路
显示电路采用共阴LED数码管,从P3口RXD,TXD串口输出段码。
(3)温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
3.2整体硬件电路
(1)主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,如图3.2所示。
图3.2中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。
图3.2中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
(2)显示电路
显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。
图3.2单片机主板电路
第四章软件设计
4.1模块划分
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.2主要程序描述
(1)主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图4.1所示。
图4.1主程序流程图图4.2读温度流程图
(2)读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图4.2所示。
(3)温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图4.3所示。
图4.3温度转换流程图
(4)计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4.4所示。
图4.4计算温度流程图
(5)显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图4.5所示。
图4.5 显示数据刷新流程图
4.3源程序清单
TEMP_ZHEQU24H;实测温度值存放单元
TEMPLEQU25H
TEMPHEQU26H
TEMP_THEQU27H;高温报警值存放单元
TEMP_TLEQU28H;低温报警值存放单元
TEMPHCEQU29H;正、负温度值标记
TEMPLCEQU2AH
TEMPFCEQU2BH
K1EQUP1.4;查询按键
K2EQUP1.5;设置/调整键
K3EQUP1.6;调整键
K4EQUP1.7;确定键
BEEPEQUP3.7;蜂鸣器
RELAYEQUP1.3;指示灯
LCD_XEQU2FH;LCD字符显示位置
LCD_RSEQUP2.0;LCD寄存器选择信号
LCD_RWEQUP2.1;LCD读写信号
LCD_ENEQUP2.2;LCD允许信号
FLAG1EQU20H.0;DS18B20是否存在标志
KEY_UDEQU20H.1;设定按键的增、减标志
DQEQUP3.3;DS18B20数据信号
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H;将20H~2FH单元清零
MOVR1,#10H
CLEAR:
MOV@R0,A
INCR0
DJNZR1,CLEAR
LCALLSET_LCD
LCALLRE_18B20
START:
LCALLRST;调用18B20复位子程序
JNBFLAG1,START1;DS1820不存在
LCALLMENU_OK;DS1820存在,调用显示正确信息子程序
MOVTEMP_TH,#055H;设置TH初值85度
MOVTEMP_TL,#019H;设置TL初值25度
LCALLRE_18B20A;调用暂存器操作子程序
LCALLWRITE_E2;写入DS18B20
LCALLTEMP_BJ;显示温度标记
JMPSTART2
START1:
LCALLMENU_ERROR;调用显示出错信息子程序
LCALLTEMP_BJ;显示温度标记
SJMP$
START2:
LCALLRST;调用DS18B20复位子程序
JNBFLAG1,START1;DS18B20不存在
MOVA,#0CCH;跳过ROM匹配命令
LCALLWRITE
MOVA,#44H;温度转换命令
LCALLWRITE
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0BEH;读温度命令
LCALLWRITE
LCALLREAD;调用DS18B20数据读取操作子程序
LCALLCONVTEMP;调用温度数据BCD码处理子程序
LCALLDISPBCD;调用温度数据显示子程序
LCALLCONV;调用LCD显示处理子程序
LCALLTEMP_COMP;调用实测温度值与设定温度值比较子程序
LCALLPROC_KEY;调用键扫描子程序
SJMPSTART2;循环
;***************************键扫描子程序*****************************
PROC_KEY:
JBK1,PROC_K1
LCALLBEEP_BL
JNBK1,$
MOVDPTR,#M_ALAX1
MOVA,#1
LCALLLCD_PRINT
LCALLLOOK_ALARM
JBK3,$
LCALLBEEP_BL
JMPPROC_K2
PROC_K1:
JBK2,PROC_END
LCALLBEEP_BL
JNBK2,$
MOVDPTR,#RST_A1
MOVA,#1
LCALLLCD_PRINT
LCALLSET_ALARM
LCALLRE_18B20;将设定的TH,TL值写入DS18B20
LCALLWRITE_E2
PROC_K2:
LCALLMENU_OK
LCALLTEMP_BJ
PROC_END:
RET
;***************************设定温度报警值TH、TL***************************
SET_ALARM:
LCALLLOOK_ALARM
AS0:
JBK1,AS00
LCALLBEEP_BL
JNBK1,$
CPL20H.1;UP/DOWN标记
AS00:
JB20H.1,ASZ01;20H.1=1,增加
JMPASJ01;20H.1=0,减小
ASZ01:
JBK2,ASZ02;TH值调整(增加)
LCALLBEEP_BL
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,ASZ011
MOVTEMP_TH,#0
ASZ011:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPASZ01
ASZ02:
JBK3,ASZ03;TL值调整(增加)
LCALLBEEP_BL
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#99,ASZ021
MOVTEMP_TL,#00H
ASZ021:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPASZ02
ASZ03:
JBK4,AS0;确定调整
LCALLBEEP_BL
JNBK4,$
RET
ASJ01:
JBK2,ASJ02;TH值调整(减少)
LCALLBEEP_BL
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,ASJ011
JMPASJ022
ASJ011:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPAS0
ASJ02:
JBK3,ASJ03;TL值调整(减少)
LCALLBEEP_BL
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#0FFH,ASJ021
JMPASJ022
ASJ021:
LCALLLOOK_ALARM;
MOVR5,#10
LCALLDELAY
JMPAS0
ASJ022:
CPL20H.1
JMPASZ01
ASJ03:
JMPASZ03
RET
RST_A1:
DB"SETALERTCODE",0
;***********************实测温度值与设定温度值比较子程序**********************
TEMP_COMP:
MOVA,TEMP_TH
SUBBA,TEMP_ZH;减数>被减数,则
JCCHULI1;借位标志位C=1,转
MOVA,TEMPFC
CJNEA,#0BH,COMP
SJMPCHULI2
COMP:
MOVA,TEMP_ZH
SUBBA,TEMP_TL;减数>被减数,则
JCCHULI2;借位标志位C=1,转
MOVDPTR,#BJ5
LCALLTEMP_BJ3
CLRRELAY;点亮指示灯
RET
CHULI1:
MOVDPTR,#BJ3
LCALLTEMP_BJ3
SETBRELAY;熄灭指示灯
LCALLBEEP_BL;蜂鸣器响
RET
CHULI2:
MOVDPTR,#BJ4
LCALLTEMP_BJ3
SETBRELAY;熄灭指示灯
LCALLBEEP_BL;蜂鸣器响
RET
;-----------------------------------------
TEMP_BJ3:
MOVA,#0CEH
LCALLWCOM
MOVR1,#0
MOVR0,#2
BBJJ3:
MOVA,R1
MOVCA,@A+DPTR
LCALLWDATA
INCR1
DJNZR0,BBJJ3
RET
BJ3:
DB">H"
BJ4:
DB" BJ5: DB"! " ; ;****************************显示温度标记子程序*************************** TEMP_BJ: MOVA,#0CBH LCALLWCOM MOVDPTR,#BJ1;指针指到显示消息 MOVR1,#0 MOVR0,#2 BBJJ1: MOVA,R1 MOVCA,@A+DPTR LCALLWDATA INCR1 DJNZR0,BBJJ1 RET BJ1: DB00H,"C" ;********************************显示正确信息子程序*************************** MENU_OK: MOVDPTR,#M_OK1;指针指到显示消息 MOVA,#1;显示在第一行 LCALLLCD_PRINT MOVDPTR,#M_OK2;指针指到显示消息 MOVA,#2;显示在第一行 LCALLLCD_PRINT RET M_OK1: DB"DS18B20OK",0 M_OK2: DB"TEMP: ",0 ;********************************显示出错信息子程序*************************** MENU_ERROR: MOVDPTR,#M_ERROR1;指针指到显示消息 MOVA,#1;显示在第一行 LCALLLCD_PRINT MOVDPTR,#M_ERROR2;指针指到显示消息1 MOVA,#2;显示在第一行 LCALLLCD_PRINT RET M_ERROR1: DB"DS18B20ERROR",0 M_ERROR2: DB"TEMP: ----",0 ;****************************DS18B20复位子程序***************************** RST: SETBDQ NOP CLRDQ MOVR0,#6BH;主机发出延时复位低脉冲 MOVR1,#04H TSR1: DJNZR0,$ MOVR0,#6BH DJNZR1,TSR1 SETBDQ;拉高数据线 NOP NOP NOP MOVR0,#32H TSR2: JNBDQ,TSR3;等待DS18B20回应 DJNZR0,TSR2 JMPTSR4;延时 TSR3: SETBFLAG1;置1标志位,表示DS1820存在 JMPTSR5 TSR4: CLRFLAG1;清0标志位,表示DS1820不存在 JMPTSR7 TSR5: MOVR0,#06BH TSR6: DJNZR0,$;时序要求延时一段时间 TSR7: SETBDQ RET ;************************DS18B20暂存器操作子程序*************************** RE_18B20: JBFLAG1,RE_18B20A RET RE_18B20A: LCALLRST MOVA,#0CCH;跳过ROM匹配 LCALLWRITE WR_SCRAPD: MOVA,#4EH;写暂器 LCALLWRITE MOVA,TEMP_TH;TH(报警上限) LCALLWRITE MOVA,TEMP_TL;TL(报警下限) LCALLWRITE MOVA,#7FH;12位精度 LCALLWRITE RET ;************************复制暂存器子程序******************************* WRITE_E2: LCALLRST MOVA,#0CCH;跳过ROM匹配 LCALLWRITE MOVA,#48H;把暂存器里的温度报警值拷贝到EEROM LCALLWRITE RET ;***********************重读EEROM子程序******************************** READ_E2: LCALLRST MOVA,#0CCH;跳过ROM匹配 LCALLWRITE MOVA,#0B8H;把EEROM里的温度报警值拷贝回暂存器 LCALLWRITE RET ;************************将自定义字符写入LCD的CGRAM中********************* STORE_DATA: MOVA,#40H LCALLWCOM MOVR2,#08H MOVDPTR,#D_DATA MOVR3,#00H S_DATA: MOVA,R3 MOVCA,@A+DPTR LCALLWDATA;写入数据 INCR3 DJNZR2,S_DATA RET D_DATA: DB0CH,12H,12H,0CH,00H,00H,00H,00H ;***********************DS18B20数据写入操作子程序************************ WRITE: MOVR2,#8;一共8位数据 CLRC WR1: CLRDQ;开始写入DS18B20总线要处于复位(低)状态 MOVR3,#07 DJNZR3,$;总线复位保持16微妙以上 RRCA;把一个字节DATA分成8个BIT环移给C MOVDQ,C;写入一位 MOVR3,#3CH DJNZR3,$;等待100微妙 SETBDQ;重新释放总线 NOP DJNZR2,WR1;写入下一位 SETBDQ RET ;**********************DS18B20数据读取操作子程序************************** READ: MOVR4,#4;将温度低位、高位、TH、TL从DS18B20中读出 MOVR1,#TEMPL;存入25H、26H、27H、28H单元 RE00: MOVR2,#8 RE01: CLRCY SETBDQ NOP NOP CLRDQ;读前总线保持为低 NOP NOP NOP SETBDQ;开始读总线释放 MOVR3,#09;延时18微妙 DJNZR3,$ MOVC,DQ;从DS18B20总线读得一位 MOVR3,#3CH DJNZR3,$;等待100微妙 RRCA;把读得的位值环移给A DJNZR2,RE01;读下一位 MOV@R1,A INCR1 DJNZR4,RE00 RET ;************************温度值BCD码处理子程序************************* CONVTEMP: MOVA,TEMPH;判温度是否零下 ANLA,#08H JZTEMPC1;温度零上转 CLRC MOVA,TEMPL;二进制数求补(双字节) CPLA;取反加1 ADDA,#01H MOVTEMPL,A MOVA,TEMPH CPLA ADDCA,#00H MOVTEMPH,A MOVTEMPHC,#0BH;负温度标志 MOVTEMPFC,#0BH SJMPTEMPC11 TEMPC1: MOVTEMPHC,#0AH;正温度标志 MOVTEMPFC,#0AH TEMPC11: MOVA,TEMPHC SWAPA MOVTEMPHC,A MOVA,TEMPL ANLA,#0FH;乘0.0625 MOVDPTR,#TEMPDOTTAB MOVCA,@A+DPTR MOVTEMPLC,A;TEMPLCLOW=小数部分BCD MOVA,TEMPL;整数部分 ANLA,#0F0H;取出高四位 SWAPA MOVTEMPL,A MOVA,TEMPH;取出低四位 ANLA,#0FH SWAPA ORLA,TEMPL;重新组合 MOVTEMP_ZH,A LCALLHEX2BCD1 MOVTEMPL,A ANLA,#0F0H SWAPA ORLA,TEMPHC;TEMPHCLOW=十位数BCD MOVTEMPHC,A MOVA,TEMPL ANLA,#0FH SWAPA;TEMPLCHI=个位数BCD ORLA,TEMPLC MOVTEMPLC,A MOVA,R4 JZTEMPC12 ANLA,#0FH SWAPA MOVR4,A MOVA,TEMPHC;TEMPHCHI=百位数BCD ANLA,#0FH ORLA,R4 MOVTEMPHC,A TEMPC12: RET ;************************二-十进制转换子程序**
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度计