单片机应用系统设计课题:基于AT89C51单片机的多点温度测量系统设计姓名:班级:学号:指导老师:日期:引言在粮库测温系统、冷库测温系统、智能化建筑控制系统、中央空调系统等多种系统中都需要多点温度测量系统。因此,多点温度测量技术实现尤为重要。美国Dallas公司推出的数字温度传感器DSl8B20,电源供电范围3.0~5.5V;温度测量范围为-55~+125℃;具有独特的单总线接口,仅需要占用一个通用I/O端口即可完成与微处理器的通信;在-10~+85℃温度范围内具有±0.5℃精度;用户可编程设定9~12位的分辨率。以上特性使得DSl8B20非常适用于构建高精度、多点温度测量系统[1]。1DS18B20简介DSl8B20是美国Dallas半导体公司推出的一种智能数字温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过编程实现9~12位的数字值读数方式;可以分别在93.75ms和750ms内完成9位和12位的数字量;从DS18B20读出信息或写入DS18B20信息仅需要1根口线(单线接口);温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。使用DS18B20可使系统结构更趋简单,可靠性更高[2]。DSl8B20的内部结构如图所示,主要包括寄生电源电路、64位只读存储器(ROM)和单线接口、存储器和控制逻辑、存放中间数据的高速暂存存储器、温度传感器、报警上限寄存器TH、报警下限寄存器TL、配置寄存器和8位CRC(循环冗余校验码)发生器。DSl8B20的核心是其数字温度传感器,精度可以通过用户编程配置为9、10、11和12位,其分别对应于O.5℃、O.25℃、O.125℃和O.0625℃,可以满足各种不同的分辨率要求。开始一次温度转换时,微处理器需要向DSl8B20发出ConvertT指令。转换完成之后,该温度数据存放在高速暂存存储器的温度寄存器中,占用2字节,并且DSl8B20返回到空闲状态。当DSl8B20采用外部供电方式时,主机可以在发送温度转换指令后发起一次读时隙。若此时该DSl8820已经完成温度转换,它将会返回1,否则返回O。2系统硬件设计多点温度测量电路主要由以下几部分组成:两个温度传感器DS18B20及其选择开关电路,控制器单片机AT89C51、扫描驱动电路、数码管LED显示器、报警电路、报警温度控制电路及电源电路等。多点温度计组成方框图温度传感器从测试点采集温度,然后把温度转换成电压(或电流),温度传感器输出电压的大小随温度的高低变化而变化,电压值的变化范围从几个微伏到几个毫伏,不同的温度传感器,输出电压的范围也差别很大。单片机AT89C51是多点温度测量电路的控制核心,它将采集到的数字温度电压值,经过计算处理,得到相应的温度值,经扫描驱动送到LED显示器以数字形式显示测量的温度。LED显示器用于显示测量温度的结果。报警温度控制电路用于在不同应用中灵活设定报警温度,在超过设定范围时,报警电路进行报警。1212MHZP1.01P1.12P1.23P1.44P1.45P1.56P1.67P1.78RESET9RXD10TXD11INT012INT113T014T115ER16RD17X218X119GND20P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN29ALE/P30EA/VP31P0.732P0.633P0.534P0.435P0.336P0.237P0.138P0.039VCC40u110uFVCC30pF30pF6.8K223311DS18B20u31G2G244u24.7K90121234567abcdefg8dp9GNDabfcgdedpNC1234567abcdefg8dp9GNDabfcgdedpNC1234567abcdefg8dp9GNDabfcgdedpNC1234567abcdefg8dp9GNDabfcgdedpNC9012901290121K1K1K1KVCCP2.3P2.2P2.1P2.0VCC510x8VCC223311DS18B20u44.7KVCCSW-SPDTS1多点温度测量电路原理图3系统软件设计DS18B20DS18B20LED显示器扫描驱动报警电路单片机AT89C51温度控制电路电源3.1系统流程图温度计主程序流程图读出温度子程序流程图温度转换命令子程序流程图发跳过ROM命令发温度转换开始命令结束发DS18B20复位命令计算温度子程序流程图显示数据刷新子程序流程图3.2多点温度测量系统程序;常数定义TMELEQU0E0H;20ms,定时器0时间常数TMEHEQU0B1HTMEPHEADEQU36H;工作内存定义BITSTDATA20HTIMEISOKBITBITST.1TEMPONEOKBITITST.2TEMPLDATA26HTEMPHDATA27HTEMPHCDATA28HTEMPLCDATA29H;引脚定义TEMPDINBITP3.7;中断向量区ORG000HLJMPSTARTORG00BHLJMPT0IT;系统初始化ORG100HSTART:MOVSP,#60HCLSMEM:MOVR0,#20HMOVR1,#60HCLSMEM1:MOV@R0,#00HINCR0DJNZR1,CLSMEM1MOVTMOD,#00100001BMOVTH0,#TIMELMOVTL0,#TIMEHSJMPINITERROR:NOPLJMPSTARTNOPINIT:NOPSETBET0SETBTR0SETBEAMOVPSW,#00HCLRTEMPONEOKLJMPMAIN;定时器0中断服务程序T0IT:PUSHPSWMOVPSW,#10HMOVTH0,#TIMEHMOVTL0,#TIMELINCR7CJNER7,#32H,T0ITIMOVR7,#00HSETBTIMEISOKTOIT1:POPPSWRETI;主程序MAIN:LCALLDISP1JNBTIME1SOK,MAINCLRTIME1SOKJNBTEMPONEOK,MAIN2LCALLREADTEMP1LCALLCONVTEMPLCALLDISPBCDLCALLDISP1MAIN2:LCALLREADTEMPSETBTEMPONEOKLJMPMAIN;子程序区;RESETDS18B20INITDS1820:SETBTEMPDINNOPNOPCLRTEMPDINMOVR6,#0A0HDJNZR6,$MOVR6,#0A0HDJNZR6,$SETBTEMPDINMOVR6,#32HDJNZR6,$MOVR6,#3CHLOOP1820:MOVC,TEMPDINJCINITDS1820OUTDJNZR6,LOOP1820MOVR6,#064HDJNZR6,$SJMPINITDS1820RET;INITDS1820OUT:SETBTEMPDINRET;读DS18B20的程序,从DS18B20中读出一个字节的数据READDS1820:MOVR7,#08HSETBTEMPDINNOPNOPREADDS1820LOOP:CLRTEMPDINNOPNOPNOPSETBTEMPDINMOVR6,#07HDJNZR6,$MOVC,TEMPDINMOVR6,#3CHDJNZR6,$RRCASETBTEMPDINDJNZR7,READDS1820LOOPMOVR6,#3CHDJNZR6,$RET;写DS18B20的程序,从DS18B20中写一个字节的数据WRITEDS1820:MOVR7,#08HSETBTEMPDINNOPNOPWRITEDS1820LOP:CLRTEMPDINMOVR6,#07HDJNZR6,$RRCAMOVTEMPDIN,CMOVR6,#34HDJNZR6,$SETBTENPDINDJNZR7,WRITEDS1820LOPRET;READTEMPREADTEMP:LCALLINITEDS1820MOVA,#0CCHLCALLWRITEDS1820MOVR6,#34HDJNZR6,$MOVA,#44HLCALLWRITEDS1820MOVR6,#34HDJNZR6,$RETREADTEMP1:LCALLINITDS1820MOVA,#0CCHLCALLWRITEDS1820MOVR6,#34HDJNZR6,$MOVA,#0BEHLCALLWRITEDS1820MOVR6,#34HDJNZR6,$MOVR5,#09HMOVR0,#TEMPHEADMOVB,#00HREADTEMP2:LCALLREADDS1820MOV@R0,AINCR0READTEMP21:LCALLCRC8CALDJNZR5,READTEMP2MOVA,BJNZREADTEMPOUTMOVA,TEMPHEAD+0MOVTEMPL,AMOVA,TEMPHEAD+1MOVTEMPH,AREADTEMPOUT:RET;处理温度BCD码子程序CONVTEAMP:MOVA,TEMPHANLA,#80HJZTEMPC1CLRCMOVA,TEMPLCPLAADDA,#01HMOVTEMPL,AMOVA,TEMPHCPLAADDCA,#00HMOVTEMPH,AMOVTEMPHC,#0BHSJMPTEMPCHTEMPC1:MOVTEMPHC,#0AHTEMPC11:MOVA,TEMPHCSWAPAMOVTEMPHC,AMOVA,TEMPLANLA,#0FHMOVDPTR,#TEMPDOTTABMOVCA,@A+DPTRMOVTEMPLC,AMOVA,TEMPLANLA,#0F0HSWAPAMOVTEMPL,AMOVA,TEMPHANLA,#0FHSWAPAORLA,TEMPLLCALLHEX2BCD1MOVTEMPL,AANLA,#0F0HSWAPAORLA,TEMPHCMOVTEMPHC,AMOVA,TEMPLANLA,#0FHSWAPAORLA,TEMPLCMOVTEMPLC,AMOVA,R7JZTEMPC12ANLA,#0FHSWAPAMOVR7,AMOVA,TEMPHCANLA,#0FHORLA,R7MOVTEMPHC,ATEMPC12:RET;小数部分码表TEMPDOTTAB:DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06HDB06H,07H,08H,09H,09H;显示区BCD码温度值刷新子程序DISPBCD:MOVA,TEMPLCANLA,#0FHMOV70H,AMOVA,TEMPLCSWAPAANLA,#0FHMOV71H,AMOVA,TEMPHCANLA,#0FHMOV72H,AMOVA,TEMPHCSWAPAANLA,#0FHMOV73H,AMOVA,TEMPHCANLA,#0F0HCJNZA,#010H,DISPBCD0SJMPDISPBCD2DISPBCD0:MOVA,TEMPHCANLA,#0FHJNZDISPBCD2MOVA,TEMPHCSWAPAANLA,#0FHMOV73H,#0AHMOV72H,ADISPBCD2:RET;显示子程序;显示数据在70H—73H单元内,用4位LED共阳数码管显示,P1口输出段码数据,;P3口作扫描控制,每个LED数码管亮1ms时间再逐位循环。DISP1:MOVR1,#70HMOVR5,#0FEHPLAY:MOVP1,#0FFHMOVA,R5MOVP3,AMOVA,@R1MOVDPTR,#TABMOVCA,@A+DPTRMOVP1,AMOVA,R5JBACC.1,LOOP5CLRP1.7LOOP5:LCALLDLIMSINCR1MOVA,R5JNBACC.3,ENDOUTRLAMOVR5,AAJMPPLAYENDOUT:MOVP1,#0FEHMOVP3,#0FEHRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH;共阳段码表“0”“1”“2”“3”“4”“5”“6”“7”“8”“9