还剩40页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第1章概述
1.1概述温度是工业生产中主要的被控参数之一,与之相关的各种温度控制系统广泛应用于冶金、化工、机械、食品等领域温度控制是工业生产过程中经常遇到的过程控制有些工艺过程对其温度的控制效果直接影响着产品的质量因而设计一种较为理想的温度控制系统是非常有价值的温度控制系统广泛应用于社会生活的各个领域,在冶金工业、化工生产、电力工程、造纸行业、机械制造和食品加工等诸多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制常用的控制电路根据应用场合和所要求的性能指标有所不同在工业企业中如何提高温度控制对象的运行性能一直以来都是控制人员和现场技术人员努力解决的问题这类控制对象惯性大滞后现象严重存在很多不确定的因素难以建立精确的数学模型从而导致控制系统性能不佳甚至出现控制不稳定、失控现象采用数字温度传感器DS18B20,因其内部集成了A/D转换器,使得电路结构更加简单,而且减少了温度测量转换时的精度损失,使得测量温度更加精确数字温度传感器DS18B20只用一个引脚即可与单片机进行通信,大大减少了接线的麻烦,使得单片机更加具有扩展性由于DS18B20芯片的小型化,更加可以通过单跳数据线就可以和主电路连接,故可以把数字温度传感器DS18B20做成探头,探入到狭小的地方,增加了实用性更能串接多个数字温度传感器DS18B20进行范围的温度检测采用单片机来对他们控制不仅具有控制方便,简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量第2章设计思路及框图
2.1设计思路先说测温部分考虑到测温方案有很多种,包括电阻式测温、热电偶测温等等而由于外界诸多因素的变化,由分立元件所搭建的电路会受到各种各样的干扰而导致测量结果的偏差,比如电阻会因温度升高而阻值降低,三极管在发热状态下基极电流会升高等等这会带来测量误差,从而导致一系列负面响应考虑到这些问题,方案最终被定在了集成温度测量传感器DS18B20上DS18B20是美国DALLAS公司生产的集成温度传感器它将测温、处理及输入输出等模拟+数字电路集成在一块形似三极管的三端芯片上,体积小巧、功能强大,且数据的输入输出只需要一跟端口线,并且可在一根总线上并联多个芯片以实现多点测温用之与单片机结合简直是温度检测的不二选择而显示部分也有许多方案可供选择,但考虑到其价格及普遍使用程度,最后用了LCD1602采用字符型液晶显示器1602,液晶显示器以其微功耗、体积小、显示内丰富、使用方便等诸多优点,在通信、仪器仪表、电子设备等低功耗应用系统中得到越来越广泛的应用控制器方面,自然是使用STC89C52了,实惠够用
2.2总体设计框图温度计电路设计总体设计方框图如图1-1所示,控制器采用单片机STC89C52,温度传感器采用DS18B20,用LCD以串口传送数据实现温度显示STC89C52单片机控制器复位电路晶振电路LCD1602液晶显示DS18B20温度传感器图2-1总体设计框图第3章各元器件介绍
3.1STC89C52RC简介图3-1STC89C52RC AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等主要管脚有XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能P0口P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻P1口 P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流IIL与AT89C51不同之处是,P
1.0和P
1.1还可分别作为定时/计数器2的外部计数输入(P
1.0/T2)和输入(P
1.1/T2EX)P2口 P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流IIL在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容Flash编程或校验时,P2亦接收高位地址和一些控制信号P3口 P3口是一组带有内部上拉电阻的8位双向I/O口P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口此时,被外部拉低的P3口将用上拉电阻输出电流(IIL) P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号RST 复位输入当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位ALE/PROG 当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的要注意的是每当访问外部数据存储器时将跳过一个ALE脉冲对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作该位置位后,只有一条MOVX和MOVC指令才能将ALE激活此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效PSEN 程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲在此期间,当访问外部数据存储器,将跳过两次PSEN信号EA/VPP 外部访问允许欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)需注意的是如果加密位LB1被编程,复位时内部会锁存EA端状态如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令 Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压VppXTAL1 振荡器反相放大器的及内部时钟发生器的输入端XTAL2 振荡器反相放大器的输出端P3口引脚第二功能定义
3.2DS18B20单总线数字温度计温度器简介温度作为一种最基本的环境条件参数,与工业、农业、养殖业的生产以及医学乃至人们的日常生活都是紧密相关的因此,对于温度的测量方法与测温装置的研究就凸显得非常重要由单片机与温度传感器构成的测温系统可广泛应用于很多领域本文通过对单总线数字集成温度传感器DS18B20的特点、工作原理和使用方法的讨论,结合对单片机AT89S52的编程实现温度的采集大多单片机接口输入的信号是数字信号,或带有A/D转换的高端单片机也可输入模拟信号由单片机获取非电信号的温度信息,必须通过温度传感器传统的温度测量多以热敏电阻作为温度传感器但是,热敏电阻的可靠性较差、测量温度精度低,而且还需经A/D转换成数字信号后才能由单片机进行处理因此,使用数字温度传感器可简化硬件设计、方便单片机读取数据、节约成本设计单片机数字温度计需要考虑以下3个方面1温度传感器芯片的选择;2单片机和温度传感器的接口电路设计;3控制温度传感器实现温度信息采集以及数据传输的软件DS18B20是美国达拉斯Dallas公司的单线数字温度传感器芯片,与传统的热敏电阻不同,DSl8B20可直接将被测温度转换为串行数字信号供单片机处理通过对DSl8B20编程可以实现9~12位的温度读数,并可分别在
93.75ms和750ms内完成9位和12位的数字量其测温范围-55℃~+125℃,最大分辨率为
0.0625℃,在-10℃~+85℃范围内其测温准确度为±
0.5℃DS18B20具有体积小、功耗低、抗干扰能力强、易与微处理器连结等特点,而且它无需任何外围硬件即可方便地进行温度测量,与单片机交换信息仅需要一根I/O口线,其读写及温度转换的功率也可来源于数据总线,而无需额外电源另外,每片DSl8B20都设有唯一的产品序列号,存放在它的内部ROM中,单片机通过简单的协议就能识别这个序列号因此,多个DSl8B20可以挂接于同一条单线总线上,特别适合构成多点温度测控系统DS18B20性能特点1独特的单线接口,仅需1个I/O口引脚即可通信,无需变换其它电路,直接输出被测温度值的数字信号;2多点multidrop能力使分布式温度检测应用得以简化;3不需要外部元件;4既可用数据线供电,也可采用外部电源供电;5零待机功耗,不需备份电源;6测量范围为-55~+125℃,固有测温分辨率为
0.5℃;7通过编程可实现9~12位的数字读数方式;8温度数字量转换时间200ms典型值;9用户可定义非易失性的温度告警设置;10警告搜索命令能识别和寻址温度在编定的极限之外的器件温度警告情况;11应用范围包括恒温控制、工业系统、消费类产品、温度计或任何热敏系统
[2]预处理DS18B20采用3脚TO-92封装或8脚SOIC封装,其外部形状及管脚如图.其中GND为地,DQ为数据输入/输出端,该脚为漏极开路输出,常态下呈高电平,可选用的VDD引脚,不用时应接地SOIC封装的NC为空引脚DS18B20测温原理DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750msDS18B20测温原理如图3所示图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入计数器1和温度寄存器被预置在-55℃所对应的一个基数值计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值图3DS18B20测温原理框图
3.3液晶显示模块
3.
3.1概述显示模块采用了型号为1602的LCD它体积小、功耗低、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用它分为带背光和不带背光两种,基控制器大部分为HD
44780.本设计中应用的是带背光的1602,带背光的比不带背光的厚,但两者在应用中并无差别1602LCD主要技术参数显示容量:16×2个字符;芯片工作电压:
4.5—
5.5V;工作电流:
2.0mA
5.0V;模块最佳工作电压:
5.0V;字符尺寸:
2.95×
4.35W×Hmm内含复位电路,提供各种控制命令如清屏、字符闪烁、光标闪烁、显示移位等多种功能,有80字节显示数据存储器DDRAM,内建有160个5X7点阵的字型的字符发生器CGROM,8个可由用户自定义的5X7的字符发生器CGRAM
3.
3.2模块引脚说明图2-2液晶接口
3.
3.3功能设定指令功能设定数据总线位数、显示的行数及字型参数设定的情况如下位名 设置DL 0=数据总线为4位1=数据总线为8位N 0=显示1行1=显示2行F 0=5×7点阵/每字符 1=5×10点阵/每字符1602采用标准的16脚接口,其中:第1脚VSS为地电源第2脚VDD接5V正电源第3脚V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器第5脚R/W为读写信号线,高电平时进行读操作,低电平时进行写操作当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据第6脚E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令第7~14脚D0~D7为8位双向数据线第15脚背光电源正极第16脚背光电源负极第4章各模块电路设计及分析
4.1电源电路本设计以STC89C52RC单片机为中心,分别设计了晶振电路、LCD液晶显示电路和复位电路图3-2lm78稳压器在实际应用中,应在三端集成稳压电路上安装足够大的散热器(当然小功率的条件下不用)当稳压管温度过高时,稳压性能将变差,甚至损坏当制作中需要一个能输出
1.5A以上电流的稳压电源,通常采用几块三端稳压电路并联起来,使其最大输出电流为N个
1.5A,但应用时需注意并联使用的集成稳压电路应采用同一厂家、同一批号的产品,以保证参数的一致另外在输出电流上留有一定的余量,避免个别集成稳压电路失效时导致其他电路的连锁烧毁在lm78**、lm79**系列三端稳压器中最常应用的是TO-220和TO-202两种封装这两种封装的图形以及引脚序号、引脚功能如附图所示图中的引脚号标注方法是按照引脚电位从高到底的顺序标注的这样标注便于记忆引脚
①为最高电位,
③脚为最低电位,
②脚居中从图中可以看出,不论正压还是负压,
②脚均为输出端对于lm78**正压系列,输入是最高电位,自然是
①脚,地端为最低电位,即
③脚,如附图所示对与lm79**负压系列,输入为最低电位,自然是
③脚,而地端为最高电位,即
①脚
4.2系统整体硬件电路设计
4.
2.1复位电路的工作原理52单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位所以可以通过按键的断开和闭合在运行的系统中控制其复位在电路图中,电容的的大小是10uF,电阻的大小是10k所以根据公式,可以算出电容充电到电源电压的
0.7倍(单片机的电源是5V,所以充电到
0.7倍即为
3.5V),需要的时间是10K*10UF=
0.1S也就是说在电脑启动的
0.1S内,电容两端的电压时在0~
3.5V增加这个时候10K电阻两端的电压为从5~
1.5V减少(串联电路各处电压之和为总电压)所以在
0.1S内,RST引脚所接收到的电压是5V~
1.5V在5V正常工作的51单片机中小于
1.5V的电压信号为低电平信号,而大于
1.5V的电压信号为高电平信号所以在开机
0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为
0.1S左右)在单片机启动
0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量随着时间的推移,电容的电压在
0.1S内,从5V释放到变为了
1.5V,甚至更小根据串联电路电压为各处之和,这个时候10K电阻两端的电压为
3.5V,甚至更大,所以RST引脚又接收到高电平单片机系统自动复位复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的
4.
2.2晶振电路STC89C52虽然内部有震荡电路,但要形成时钟,必须外部附加电路STC89C52单片机的时钟产生方法有两种内部时钟方式和外部时钟方式本设计采用内部时钟方式,利用芯片内部的震荡电路,在X
1、X2引脚上外接定时元件,内部的震荡电路变会产生自激震荡本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路震荡晶体选择可在
1.2MHZ到12MHZ之间选择电容值无严格要求,但电容取值对震荡频率输出的稳定性、大小、震荡电路起震速度有少许影响,C
1、C2可在20pF到100pF之间取值,但在60pF到70pF时震荡器会有较高的频率稳定性所以在本设计中,震荡晶体选择
11.0592MHZ,电容选择30pF
4.3显示电路的设计液晶显示器是一种将液晶显示器件连接器件集成电路PCB线路板背光源结构器件装配在一起的组件LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作时电流仅
2.0mA/
5.0V通过编程实现自动关闭屏幕能够更有效的降低功耗LCD1602分两行显示,每行可显示多达16个字符LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制,并且还能利用空余的空间自定义字符其接线如下图所示图3-3液晶显示电路第5章系统软件设计
5.1软件总体模块本设计单片机需要处理的信息有温度采集、湿度采集、液晶显示、控制策略所以程序就包括温度采集子程序、湿度采集子程序、显示子程序、控制策略等图5-1程序模块组成图
5.2DS18B20数据采集及转化算法
5.
2.1初始化程序系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等初始化程序如下;-------------------DS18B20复位初始化子程序----------------------RESET_1820:;复位(有具体的时序要求)SETBDQNOPCLRDQ;――――――――――――;主机发出延时537微秒的复位低脉冲MOVR1#3DLY:MOVR0#107DJNZR0$DJNZR1DLY;――――――――――――;然后拉高数据线SETBDQNOPNOPNOP;――――――――――――MOVR0#25HT2:JNBDQT3;等待DS18B20回应DJNZR0T2JMPT4;――――――――――――T3:SETBFLAG;置标志位,表示DS1820存在JMPT5;――――――――――――T4:CLRFLAG;清标志位,表示DS1820不存在JMPT7;――――――――――――T5:MOVR0#117T6:DJNZR0T6;时序要求延时一段时间;――――――――――――T7:SETBDQRET;复位子程序
5.
2.2数据采集及算法转化由于DS18B20单线通信功能是分时完成的它有严格的时隙概念因此读写时序很重要.系统对DS18B20的各种操作必须按协议进行.操作协议为初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据.主机控制DS18B20完成温度转换的程序必须经过3个步骤初始化、ROM操作指令、存储器操作指令.假设单片机系统所用的晶振频率为12MHz根据DS18B20的初始化时序、写时序和读时序分别编写3个子程序INIT为初始化子程序WRITE为写(命令或数据)子程序READ为读数据子程序所有的数据读写均由最低位开始.主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值温度测量每1s进行一次写入读出程序如下;-------------------写入DS18B20子程序-----------------------WRITE_1820:;写入DS18B20(有具体的时序要求)MOVR2#8;一共8位数据CLRCWR1:CLRDQ;总线低位,开始写入MOVR3#6DJNZR3$;保持16微秒以上RRCA;把字节DATA分成8个BIT环移给CMOVDQC;写入一个BITMOVR3#23DJNZR3$;等待SETBDQ;重新释放总线NOPDJNZR2WR1;写入下一个BITSETBDQRET;写入子程序;---------------------读出DS18B20子程序--------------------READ_1820:;;将温度低位、高位、TH、TL从DS18B20中读出MOVR4#4;movr4#4MOVR1#TEMPL;存入25H、26H、27H、28HRE0:MOVR2#8;数据一共有8位RE1:CLRCSETBDQNOPNOPCLRDQ;读前总线保持为低NOPNOPNOPSETBDQ;开始读总线释放MOVR3#9DJNZR3$;延时18微妙MOVCDQ;从总线读到一个BITMOVR3#23;DJNZR3$;等待50微秒RRCA;把读得的位价值环移给ADJNZR2RE1;读下一个BITMOV@R1AINCR1;R1内数据递增DJNZR4RE0RET;读出子程序分析DSl8B20可直接将被测温度转换为串行数字信号供单片机处理通过对DSl8B20编程可以实现9~12位的温度读数,并可分别在
93.75ms和750ms内完成9位和12位的数字量其测温范围-55℃~+125℃,最大分辨率为
0.0625℃,在-10℃~+85℃范围内其测温准确度为±
0.5℃DS18B20采用一线总线传输的形式可以直接把数字量和STC89C52单片机进行通信译码程序开始初始化,再经DS18B
20、ROM操作指令识别判断,再进行存储操作指令,转化处理,读取当前温度值
5.
2.3读出温度子程序读出温度子程序的主要功能是读出RAM中的2字节,读出温度的低八位和高八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写其程序流程图如下5-2读温度程序流程图
5.3读、写时序子程序读写的程序是本次设计中的重点和难点,通过我们对其时序的分析,从而写出高效的程序图5-3写1,0时序图5-4读0,1时序图5-5写时序子程序流程图
5.4显示程序此函数实现的对数码管显示的处理,其亮点在于可以直接对数码管进行操作,其本身是个两变量函数,第一个变量是要开通的位选,第二个变量是要显示的数据,这样我们可以直接方便而又简单直观的对数码管进行操作程序流程图如下图5-6 显示数据刷新流程图设计总结在本次设计的过程中,我发现很多的问题,这次设计让我成长了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,我们都知道在编写程序之前,最重要的画程序流程图流程图反应了程序的思想,结构,步骤而画流程图必须要了解硬件设计者的想法以及设计方案先把初步的流程图绘制出来接下来就是构思详细的流程图由于使用的52系列单片机,是学习中经常使用的芯片,比较熟悉因此结合设计好的Protel图,将使用到的引脚摘出来,结果了解分析,清楚了本次编写程序时主要用到的单片机的I/O口,定时器/计数器等功能此时主程序的流程图就很容易绘制出来了本次设计使用了传感器——DS18B20DS18B20内置ROM区,在工作之前要求单片机写数据,而且时序要求严格,才能读出数据第一次接触这个传感器,认真学习搜集来的资料,结合本次设计的需要,在已有的程序基础进行修改从这次的设计中,我真真正正的意识到,在学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获第7章参考文献
[1]邱关源.电路第五版.高等教育出版社.
[2]田立,代方震.
2007.51单片机C语言程序设计快速入门.北京.人民邮电出版社
[3]李朝青.
2005.单片机原理及接口技术第3版.北京.北京航天航空大学出版社.
[4]康华光.陈大钦.1999.电子技术基础模拟部分第4版.北京.高等教育出版社.
[5]康华光.邹寿彬.2000电子技术基础数字部分第4版.北京.高等教育出版社.
[6]郭天祥.编著.51单片机C语言教程——入门,提高,开发.拓展全攻略
[7]李忠国.陈刚.编著.单片机应用技能实训
[8]刘南平.主编.朱凤芝.欧触灵.副主编.现代电子设计与制作技术
[9]胡宴如.主编.高频电子线路
[10]杨翠南.杨碧石.主编.数字电子技术与逻辑设计教程
[11]DS18b20数据手册
[12]余发山,王福忠.单片机原理及应用技术.徐州中国矿业大学出版社,2003
[13]陈权昌李兴富单片机原理及应用.广东华南理工大学出版社,2007
[14]黄智伟.凌阳单片机课程设计指导.北京北京航空航天大学出版社,2006年
[15]李光飞.单片机课程设计实例指导.北京北京航空航天大学出版,2004
[17]张友德.单片微型机原理、应用与实践[M].上海复旦大学出版社,1992
[18]李华.MCS-51系列单片机实用接口技术[M],北京北京航空航天大学出版社
[19]求是科技.单片机典型模块设计实例导航.北京人民邮电出版社.
2005.8
[20]徐淑华程退安等.单片微型机原理及应用.哈尔滨哈尔滨工业大学出版社.
[21]孙余凯.精选实用电子电路260例.北京电子工业出版社.
2007.6
[22]殷春浩崔亦飞.电磁测量原理及应用.徐州中国矿业大学出版社.
2003.7
[23]《LCD1602A数据手册》附录A系统原理框图附录B流程图附录C实物图附录D汇编程序;--------------------------------TEMP_ZHEQU24H;实时温度值存放单元TEMPLEQU25H;低温度值存放单元TEMPHEQU26H;高温度值存放单元TEMP_THEQU27H;高温报警值存放单元TEMP_TLEQU28H;低温报警值存放单元TEMPHCEQU29H;存十位数BCD码TEMPLCEQU2AH;存个位数BCD码;--------------------------------K1EQUP
2.1K2EQUP
2.2K3EQUP
2.3K4EQUP
2.4;--------------------------------SPKEQUP
3.4RELAYEQUP
2.0XEQU2FH;LCD地址变量;--------------------------------RSEQUP
3.5RWEQUP
3.6EEQUP
3.7;--------------------------------FLAGEQU20H.0;DS18B20是否存在标记KEY_UDEQU20H.1;设定KEY的UP与DOWN标记DQEQUP
2.5;========================主程序==========================MAIN:ACALLSET_LCD;LCD初始化设置子程序ACALLWR_THL;将报警上下线写入暂存寄存器TOOP:ACALLRESET_1820;18B20复位子程序JNBFLAGTOOP1;DS1820不存在ACALLMEU_OK;显示OK菜单ACALLRE_THL;把EEROM里温度报警值拷贝回暂存器ACALLTEMP_BJ;显示温度标记CJMPTOOP2TOOP1:ACALLMEU_ERROR;显示ERROR菜单ACALLTEMP_BJ;显示温度标记JMP$;--------------------------TOOP2:ACALLRE_TEMPACALLSET_DATAACALLTEMP_COMP;实际温度值与标记温度值比较子程序ACALLP_KEY;键扫描子程序SJMPTOOP2;---------读取温度数据子程序---------RE_TEMP:ACALLRESET_1820;18B20复位子程序JNBFLAGTOOP1;DS1820不存在MOVA#0CCH;跳过ROM匹配ACALLWRITE_1820;写入子程序MOVA#44H;发出温度转换命令ACALLWRITE_1820;调写入子程序ACALLRESET_1820;调复位子程序MOVA#0CCH;跳过ROM匹配ACALLWRITE_1820;写入子程序MOVA#0BEH;发出读温度命令ACALLWRITE_1820;写入子程序ACALLREAD_1820;调用读入子程序RET;--------温度数据处理显示子程序----------SET_DATA:ACALLCONV_TEMP;处理温度BCD码子程序ACALLDISP_BCD;显示区BCD码温度值刷新子程序ACALLCONV;数据转换子程序RET;-----------按键键扫描子程序----------P_KEY:;按键K1处理JBK1PK1;K1键未按,转到PK1处ACALLSPK_BZ;K1键按下,一声鸣响JNBK1$;等按键放开MOVDPTR#M_ALAX1;存M_ALAX1表MOVA#1ACALLLCD_PRINT;显示字符ACALLLOOK_ALARM;显示信息区JBK3$;等待K3按下ACALLSPK_BZ;一声鸣响JMPPK2;转到标号PK2处PK1:;按键K2处理JBK2PK3;K2键未按,转到PK3处ACALLSPK_BZ;K2键按下,一声鸣响JNBK2$;等按键放开MOVDPTR#TA1;存#TA1表MOVA#1ACALLLCD_PRINT;显示字符ACALLSET_ALARM;设定报警值TH、TLACALLWR_THL;将设定的THTL值写入DS18B20内ACALLWRITE_E2;PK2:ACALLMEU_OK;显示OK菜单ACALLTEMP_BJ;显示温度标记PK3:RET;-----------------------------------TA1:DBRESETALERTCODE;-----------------------------------;----------设定报警值TH、TL子程序---------;设定报警值TH、TLSET_ALARM:ACALLLOOK_ALARMA0:JBK1A2ACALLSPK_BZJNBK1$CPL20H.1;UP/DOWN标记A2:JB20H.1A3;20H.1=1,UPJMPA8;20H.1=0,DOWNA3:JBK2A5;TH值调整(增加)ACALLSPK_BZINCTEMP_THMOVATEMP_THCJNEA#120A4MOVTEMP_TH#0A4:ACALLLOOK_ALARMMOVR5#10ACALLDELAYJMPA3A5:JBK3A7;TL值调整(增加)ACALLSPK_BZINCTEMP_TLMOVATEMP_TLCJNEA#99A6MOVTEMP_TL#00HA6:ACALLLOOK_ALARM;MOVR5#10ACALLDELAYJMPA5A7:JBK4A0;确定调整OKACALLSPK_BZJNBK4$RETA8:JBK2A10;TH值调整(减少)ACALLSPK_BZDECTEMP_THMOVATEMP_THCJNEA#0FFHA9JMPA12A9:ACALLLOOK_ALARMMOVR5#10ACALLDELAYJMPA0A10:JBK3A13;TL值调整(减少)ACALLSPK_BZDECTEMP_TLMOVATEMP_TLCJNEA#0FFHA11JMPA12A11:ACALLLOOK_ALARM;MOVR5#10ACALLDELAYJMPA0A12:CPL20H.1JMPA3A13:JMPA7RET;----------显示信息区子程序-----------LOOK_ALARM:MOVDPTR#M_ALAX2;指针指到显示信息区MOVA#2;显示在第二行ACALLLCD_PRINTMOVA#0C6HACALLTEMP_BJ1MOVATEMP_TH;加载TH数据MOVX#3;设置位置ACALLSHOW_LINE2H;显示数据MOVA#0CEHACALLTEMP_BJ1MOVATEMP_TL;加载TL数据MOVX#12;设置位置ACALLSHOW_LINE2L;显示数据RET;-------------------------------M_ALAX1:DBLOOKALERTCODE0M_ALAX2:DBTH:TL:0;-------------------------------TEMP_BJ1:ACALLWR_COMMMOVDPTR#BJ2;指针指到显示信息区MOVR1#0MOVR0#2B0:MOVAR1MOVCA@A+DPTRACALLWR_DATAINCR1DJNZR0B0RETBJ2:DB00HC;----------------------------------SHOW_LINE2H:;在LCD的第二行显示数字MOVB#100DIVABADDA#30HPUSHBMOVBXACALLLCDP2POPBMOVA#0AHXCHABDIVABADDA#30HINCXPUSHBMOVBXACALLLCDP2POPBINCXMOVABMOVBXADDA#30HACALLLCDP2RET;-----------------------------SHOW_LINE2L:;在LCD的第二行显示数字MOVB#100DIVABMOVA#0AHXCHABDIVABADDA#30HPUSHBMOVBXCALLLCDP2POPBINCXMOVABMOVBXADDA#30HACALLLCDP2RET;-------------------------------;-----------温度值比较子程序------------;实际温度值与标记温度值比较子程序TEMP_COMP:MOVATEMP_THSUBBATEMP_ZH;减数被减数,则JCTCL1;借位标志位C=1,转MOVATEMP_ZHSUBBATEMP_TL;减数被减数,则JCTCL2;借位标志位C=1,转MOVDPTR#BJ5ACALLTEMP_BJ3CLRRELAY;继电器吸合RETTCL1:MOVDPTR#BJ3;存入#BJ3表ACALLTEMP_BJ3;调用显示高、低温度及加热标记子程序SETBRELAY;继电器关闭ACALLSPK_BZRETTCL2:MOVDPTR#BJ4;存入#BJ4表ACALLTEMP_BJ3;调用显示高、低温度及加标记子程序ACALLSPK_BZ;调用鸣响子程序RET;---显示高、低温度及加热标记程序----TEMP_BJ3:MOVA#0CEHACALLWR_COMMMOVR1#0MOVR0#2BJJ:MOVAR1MOVCA@A+DPTRACALLWR_DATAINCR1DJNZR0BJJRETBJ3:DBHBJ4:DBLBJ5:DB!;---------报警上下线写入暂存器子程序----------WR_THL:JBFLAGWR_T;RETWR_T:ACALLRESET_1820MOVA#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA#4EH;写暂存寄存器LCALLWRITE_1820MOVATEMP_TH;TH报警上限)LCALLWRITE_1820MOVATEMP_TL;TL报警下限)LCALLWRITE_1820MOVA#7FH;12位精确度LCALLWRITE_1820RET;---------报警值拷贝到EEROM子程序-----------WRITE_E2:ACALLRESET_1820MOVA#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA#48H;[48H]为拷贝到EEROM的指令代码LCALLWRITE_1820RET;----------报警值拷贝回暂存器子程序----------RE_THL:ACALLRESET_1820MOVA#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA#0B8H;把EEROM里的温度报警值拷贝回暂存器ACALLWRITE_1820RET;----------处理温度BCD码子程序-----------;处理温度BCD码子程序CONV_TEMP:MOVATEMPH;判温度是否零下ANLA#80HJZTC1;温度零上转CLRCMOVATEMPL;二进制数求补(双字节)CPLA;取反加1ADDA#01HMOVTEMPLAMOVATEMPHCPLAADDCA#00HMOVTEMPHASJMPTC2TC1:MOVTEMPHC#0AHTC2:MOVATEMPHCSWAPAMOVTEMPHCAMOVATEMPLANLA#0FH;乘
0.0625MOVDPTR#DOTTABMOVCA@A+DPTRMOVTEMPLCA;TEMPLCLOW=小数部分BCDMOVATEMPL;整数部分ANLA#0F0H;取出高四位SWAPAMOVTEMPLAMOVATEMPH;取出低四位ANLA#0FHSWAPAORLATEMPL;重新组合MOVTEMP_ZHALCALLHEX2BCD1MOVTEMPLAANLA#0F0HSWAPAORLATEMPHC;TEMPHCLOW=十位数BCDMOVTEMPHCAMOVATEMPLANLA#0FHSWAPA;TEMPLCHI=个位数BCDORLATEMPLCMOVTEMPLCAMOVAR4JZTC3ANLA#0FHSWAPAMOVR4AMOVATEMPHC;TEMPHCHI=百位数BCDANLA#0FHORLAR4MOVTEMPHCATC3:RET;--------------------------HEX2BCD1:MOVB#064H;十六进制-BCDDIVAB;B=A%100MOVR4A;R7=百位数MOVA#0AHXCHABDIVAB;B=A%BSWAPAORLABRET;-------------------------;小数部分码表DOTTAB:DB00H00H01H01H02H03H03H04HDB05H05H06H06H07H08H08H09H;-------------------------;---------显示区BCD码温度值刷新子程序----------;显示区BCD码温度值刷新DISP_BCD:MOVATEMPLCANLA#0FHMOV70HA;小数位MOVATEMPLCSWAPAANLA#0FHMOV71HA;个位MOVATEMPHCANLA#0FHMOV72HA;十位MOVATEMPHCSWAPAANLA#0FHMOV73HA;百位MOVATEMPHCANLA#0F0HCJNEA#010HDI0SJMPDI2DI0:MOVATEMPHCANLA#0FHJNZDI2;十位数是0MOVATEMPHCSWAPAANLA#0FHMOV73H#0AH;符号位不显示MOV72HA;十位数显示符号DI2:RET;-------------------DS18B20复位初始化子程序----------------------RESET_1820:;复位(有具体的时序要求)SETBDQNOPCLRDQ;――――――――――――;主机发出延时537微秒的复位低脉冲MOVR1#3DLY:MOVR0#107DJNZR0$DJNZR1DLY;――――――――――――;然后拉高数据线SETBDQNOPNOPNOP;――――――――――――MOVR0#25HT2:JNBDQT3;等待DS18B20回应DJNZR0T2JMPT4;――――――――――――T3:SETBFLAG;置标志位,表示DS1820存在JMPT5;――――――――――――T4:CLRFLAG;清标志位,表示DS1820不存在JMPT7;――――――――――――T5:MOVR0#117T6:DJNZR0T6;时序要求延时一段时间;――――――――――――T7:SETBDQRET;复位子程序;-------------------写入DS18B20子程序-----------------------WRITE_1820:;写入DS18B20(有具体的时序要求)MOVR2#8;一共8位数据CLRCWR1:CLRDQ;总线低位,开始写入MOVR3#6DJNZR3$;保持16微秒以上RRCA;把字节DATA分成8个BIT环移给CMOVDQC;写入一个BITMOVR3#23DJNZR3$;等待SETBDQ;重新释放总线NOPDJNZR2WR1;写入下一个BITSETBDQRET;写入子程序;---------------------读出DS18B20子程序--------------------READ_1820:;;将温度低位、高位、TH、TL从DS18B20中读出MOVR4#4;movr4#4MOVR1#TEMPL;存入25H、26H、27H、28HRE0:MOVR2#8;数据一共有8位RE1:CLRCSETBDQNOPNOPCLRDQ;读前总线保持为低NOPNOPNOPSETBDQ;开始读总线释放MOVR3#9DJNZR3$;延时18微妙MOVCDQ;从总线读到一个BITMOVR3#23;DJNZR3$;等待50微秒RRCA;把读得的位价值环移给ADJNZR2RE1;读下一个BITMOV@R1AINCR1;R1内数据递增DJNZR4RE0RET;读出子程序;===================LCD1602显示程序======================;初始化设置SET_LCD:;对LCD做初始化设置及测试CLRECALLINIT_LCD;初始化LCDCALLSTORE_DATA;将自定义字符存入LCD的CGRAMRET;-----------LCD初始化子程序-----------INIT_LCD:;8位I/O控制LCD接口初始化MOVA#38HCALLWR_COMMcalldelay1MOVA#0CH;开显示,显示光标,光标不闪烁CALLWR_COMMcalldelay1MOVA#01H;清除LCD显示屏CALLWR_COMMcalldelay1RET;-----------显示温度标记子程序------------;显示温度标记子程序TEMP_BJ:MOVA#0CBHACALLWR_COMMMOVDPTR#BJ;指针指到显示消息MOVR1#0MOVR0#2TP1:MOVAR1MOVCA@A+DPTRACALLWR_DATAINCR1DJNZR0TP1RETBJ:DB00HC;-----------自定义字符子程序------------;将自定义字符写入LCD1602的CGRAM中STORE_DATA:MOVA#40HACALLWR_COMMMOVR2#08HMOVDPTR#D_DATAMOVR3#00HS_DATA:MOVAR3MOVCA@A+DPTRACALLWR_DATA;写入数据INCR3DJNZR2S_DATARET;---------------------------D_DATA:DB0CH12H12H0CH00H00H00H00H;--------------;-----------显示“OK”信息子程序---------MEU_OK:MOVDPTR#M_OK1;指针指到显示消息MOVA#1;显示在第一行CALLLCD_PRINTMOVDPTR#M_OK2;指针指到显示消息MOVA#2;显示在第一行CALLLCD_PRINTRETM_OK1:DBDS18B20OK0M_OK2:DBTEMP:0;----------显示“ERROR”信息子程序-------MEU_ERROR:MOVDPTR#M_ERROR1;指针指到显示消息1MOVA#1;显示在第一行ACALLLCD_PRINTMOVDPTR#M_ERROR2;指针指到显示消息1MOVA#2;显示在第一行ACALLLCD_PRINTRET;---------------M_ERROR1:DBDS18B20ERROR0M_ERROR2:DBTEMP:----0;---------------;-------显示菜单------LCD_PRINT:;在LCD的第一行或第二行显示字符CJNEA#1LINE2;判断是否为第一行LINE1:ACALLCLR_LINE;清除该行字符数据MOVA#80H;设置LCD的第一行地址ACALLWR_COMM;写入命令JMPFILLLINE2:ACALLCLR_LINE;清除该行字符数据MOVA#0C0H;设置LCD的第二行地址ACALLWR_COMMFILL:CLRA;填入字符MOVCA@A+DPTR;由消息区取出字符CJNEA#0LC1;判断是否为结束码RETLC1:ACALLWR_DATA;写入数据INCDPTR;指针加1JMPFILL;继续填入字符RET;----------数据转换--------------CONV:MOVA73H;加载百位数据MOVX#6;设置位置CJNEA#1CO1JMPCO2CO1:MOVA#MOVBXACALLLCDP2JMPCO3CO2:ACALLSHOW_LINE2;显示数据CO3:INCX;MOVA72H;mova72h;十位ACALLSHOW_LINE2INCX;incXMOVA71H;mova71h;个位ACALLSHOW_LINE2INCX;incXMOVA#.MOVBXACALLLCDP2MOVA70H;h;加载小数点位INCX;设置位置ACALLSHOW_LINE2;显示数据RET;------显示第二行------SHOW_LINE2:;在LCD的第二行显示数字ADDA#30HMOVBXACALLLCDP2RET;-----------------------LCDP2:;在LCD的第二行显示字符PUSHACC;MOVAB;设置显示地址ADDA#0C0H;设置LCD的第二行地址ACALLWR_COMM;写入命令POPACC;由堆栈取出AACALLWR_DATA;写入数据RET;------写指令程序-----WR_COMM:;以8位控制方式将命令写至LCDMOVP1A;写入命令CLRRS;RS=LRW=LD0-D7=指令码,E=高脉冲CLRRWSETBEACALLDELAY1CLRERET;----------写数据程序--------------WR_DATA:;以8位控制方式将数据写至LCDMOVP1A;写入数据SETBRSCLRRWSETBECALLDECLRECALLDERET;----------清除LCD的字符-------------CLR_LINE:;清除该行LCD的字符MOVR0#24CL1:MOVA#ACALLWR_DATADJNZR0CL1RET;--------------CLR_LINE1:;清除LCD的第一行字符MOVA#80H;设置LCD的第一行地址ACALLWR_COMM;MOVR0#24;设置计数值C1:MOVA#;载入空格符至LCDCALLWR_DATA;输出字符至LCDDJNZR0C1;计数结束RET;-------------鸣响子程序------------SPK_BZ:MOVR6#100BZ2:ACALLDEX1CPLSPKDJNZR6BZ2MOVR5#10ACALLDELAYRETDEX1:MOVR7#180DE2:NOPDJNZR7DE2RET;-------------延时子程序-------------DELAY:;R5*延时10MSMOVR6#50DL1:MOVR7#100DJNZR7$DJNZR6DL1DJNZR5DELAYRETDELAY1:;延时5MSMOVR6#25DL2:MOVR7#100DJNZR7$DJNZR6DL2RETDE:MOVR7#250DJNZR7$RET;---------------------------END标号引脚第二功能说明P
3.010RXD串行输入口P
3.111TXD串行输出口P
3.212/INTO外部中断0P
3.313/INT1外部中断1P
3.414T0定时器/计数器0外部输入口P
3.515T1定时器/计数器1外部输入口P
3.616/WE外部数据存储器写脉冲P
3.717/RD外部数据存储器读脉冲。