DS18B20水温控制系统.doc_第1页
DS18B20水温控制系统.doc_第2页
DS18B20水温控制系统.doc_第3页
DS18B20水温控制系统.doc_第4页
DS18B20水温控制系统.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DS18B20 水温控制系统(全)上个月参加的学校的电子设计大赛,说真的,参加完除了没有感受之外,剩下的感受就是很累。我是计算机科学与技术学院的,按道理说电子大赛和我的专业根本就不怎么挂钩,不过我还是在同学的督促下“上当”了。学校的那个信息工程的老师很奇怪,对我们专业好像及其有偏见,也怪不得他被扯下来,不让他教书了。对我们也是非常有意见,讲说的那天,也是专门和我们做对。这个温度控制,是用最小系统板做的。因为我们不会硬件电路一些焊接等。所以就找了个系统板来做.代码用了36个小时,文档用了18个小时完成。差不多90%都是自己做的,所以我才说累。由于代码是汇编做的,我是用Keil来调试代码的,还好最小系统板ME300B有在线仿真功能。不过也调试了几乎100多次。做完这个,学校还算给面子,应付我们一个三等奖。然后他们大赛选一批人去北京培训,然后回来参加广东省的电子大赛,呵呵,当然我是被选上了,但是我从一开始不怎么想做这个,所以我不怎么想去,后来金山公司的暑假实习培训,录取了我,所以我就爽快的拒绝了去北京的那件事。现在我觉得自己的决定还是很明智的。呵呵,我只想做自己喜欢做的。单片机是今年刚刚学的,然后就可以作出这么一个东西来,我觉得自己的脑子还好,至少吸收掌握的比较快,估计和我的基础有关系吧。但是我的兴趣仍然是高级编程,Windows编程,毕竟自己学了很久了。不想就这么放弃。好废话不多说了,这个文档是我花了一个小时整理到博客上的,我觉得这个博客还是非常的COOL的,竟然没有字数限制。呵呵喜欢。以后就用你了。这是我第一篇发表的文章,还希望大家多多留言,提出宝贵的意见。目录一引言. 二设计目的. 三系统功能. 四系统设备. 五温度控制总体方案与原理. 1系统模块图. 2系统模块总关系图. 六温度转换核心及其算法. 1.温度传感器DS18B20原理与特性. DSl8B20的管脚及特点. DS18B20的内部结构. DS18B20的内存结构. DS18B20的测温功能. DSl820工作过程中的协议. 温度传感器与单片机通讯时序. 2.温度转换算法及分析. 七硬件设计说明. 1系统总体电路图. 2各个模块电路图. 输入系统. 输出系统. 芯片系统. 八软件设计说明. 1总模块的流程图. 2各个模块的流程图. 读取温度DS18B20模块的流程. 键盘扫描处理流程. 九操作指引. 按键功能. 显示温度. 设定温度. 十参考文献. 程序源代码.一引言在一些温控系统中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成AD转换器能接收的模拟量,再经过采样保持电路进行AD转换,最终送入单片机及其相应的外围电路,完成监控。但是由于传统的信号调理电路实现复杂、易受干扰、不易控制且精度不高。因此,本系统用一种新型的可编程温度传感器(DS18B20),不需复杂的信号调理电路和AD转换电路能直接与单片机完成数据采集和处理,实现方便、精度高,可根据不同需要用于各种场合。二设计目的设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。利用单片机AT89S52实现水温的智能控制,使水温能够在40-90 度之间实现控制温度调节。利用仪器读出水温,并在此基础上将水温调节到我们通过键盘输入的温度(其方式是加热或降温),而且能够将温度显示在我们的七段发光二极管板上。三系统功能1. 可以对温度进行自由设定,到那时必须在0100摄氏度单位内,设定时可以适时的显示说设定的温度值,温度是可以自由设置的,传感器的检测值与设定的温度比较,可以显示在七段发光二极管上。2. 温度由1台1000w电炉来实现,如果温度不在4090度之间,则在LED上显示“8888”,表示错误。3. 能够保持不间断显示水温,显示位数4位,分别为百位,个位,十位,和小数位。(但由于规定不超过90度,所以百位也就没有实现,默认的百位是不显示的)四系统设备ME300B 最小系统板DS18B20 数字温度传感器(集成了A/D转换功能)1000W 电炉温度计继电器风扇盛水器皿五温度控制总体方案与原理1系统模块图系统模块分为:DS18B20模块,显示模块,继电器模块,键盘输入模块,DS18B20可以被编程,所以箭头是双向的,CPU(89S52)首先写入命令给DS18B20,然后DS18B20开始转换数据,转换后通过89S52来处理数据。数据处理后的结果就显示到数码管上。1系统模块总关系图本系统的执行方法是循环查询执行的,键盘扫描也是用循环查询的办法,由于本系统对实时性要求不是很高,所以没有用到中断方式来处理。六温度转换核心及其算法1.温度传感器DS18B20原理与特性本系统采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,大大简化了电路的复杂度,以及算法的要求。首先先来介绍一下DS18B20这块传感器的特性及其功能:DSl8B20的管脚及特点DS18B20可编程温度传感器有3个管脚。(如图:1) GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3O55 V。本文使用外部电源供电。主要特点有:1. 用户可自设定报警上下限温度值。2. 不需要外部组件,能测量55+125 范围内的温度。3. 10 +85 范围内的测温准确度为05 。4. 通过编程可实现9l2位的数字读数方式,可在至多750 ms内将温度转换成12 位的数字,测温分辨率可达00625 。5. 独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。DS18B20的内部结构DS18B20内部功能模块如图2所示,主要由4部分组成:64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对 TH,TL或配置寄存器写入。配置寄存器中R1,R0决定温度转换的精度位数:R1R000,9位精度,最大转换时间为93.75 ms;R1R0 = 01,10位精度,最大转换时间为187.5 ms;R1R0 = 10,11位精度,最大转换时间为375 ms;R1R0 =11,12位精度,最大转换时间为750 ms;未编程时默认为12位精度。本系统采用的也是12位的精度。DS18B20的内存结构DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。便笺存储器包含了9个连续字节(08),前两个字节是测得的温度信息(图4),字节0的内容是温度的低8位,字节1是温度的高8位,字节2是TH(温度上限报警),字节3是TL(温度下限报警),字节4是配置寄存器(图5),用于确定输出分辨率9到12位。第5、6、7个字节是预留寄存器,用于内部计算。字节8是冗余检验字节,校验前面所有8个字节的CRC码,可用来保证通信正确。DS18B20的测温功能当DSI8B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0062 5LSB形式表示。温度值格式如图4所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。图4下面的表是对应的一部分温度值。DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若TTH或T RoM操作命令 - 存储器操作命令- 处理数据1 初始化单总线上的所有处理均从初始化开始2 ROM操作品令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如指令代码Read ROM(读ROM) 33HMatch ROM(匹配ROM) 55HSkip ROM(跳过ROMCCHSearch ROM(搜索ROM) F0HAlarm search(告警搜索)ECH3 存储器操作命令指令 代码Write Scratchpad(写暂存存储器) 4EHRead Scratchpad(读暂存存储器) BEHCopy Scratchpad(复制暂存存储器) 48HConvert Temperature(温度变换) 44HRecall EPROM(重新调出)B8HRead Power supply(读电源) B4H温度传感器与单片机通讯时序2.温度转换算法及分析由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 bit10)。其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 bit 3)。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。也就说,本系统的温度精确到了0.1度。算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位,百位的BCD码存入RAM中。由于百位没有用,默认情况是置为0A,在显示屏上没有任何显示。温度算法核心代码DATA_DEAL:MOVA,TEMPERATURE_H ;TEMPERATURE_H存放的是DS18B20转换后的高8位的值(上图的MS Byte)ANLA,#80H ;判温度是否零下JZTEMPC1 ;A为0,说明是正数,跳往TEMPC1,如果是负数,则对低8为进行补码处理CLRCMOVA,TEMPERATURE_L;为负数,对低8 位(上图的LS Byte)求补CPLA ;取反加1ADDA,#01HMOVTEMPERATURE_L,A;取补码后存回TEMPERATURE_L,此时TEMPERATURE_L里面的值就可以表示温度了 MOVA,TEMPERATURE_HCPLAADDCA,#00H ;高位TEMPERATURE_H取反,加上从低位TEMPERATURE_L进来的位MOVTEMPERATURE_H,A ;写回TEMPERATURE_HMOVTEMPERATURE_HC,#0BHSJMPTEMPC11TEMPC1: MOVTEMPERATURE_HC,#0AH TEMPC11:MOVA,TEMPERATURE_HCSWAPAMOVTEMPERATURE_HC,AMOVA,TEMPERATURE_LANLA,#0FH ;取A低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值MOVDPTR,#TEMPDOTTABMOVCA,A+DPTR ;查表MOVTEMPERATURE_LC,A ;TEMPERATURE_LC的低四位保存 小数部分 BCDMOVDIS_BUF_X,A ;小数位的BCD码送入显示buffer中MOVA,TEMPERATURE_L;整数部分ANLA,#0F0H ;得到个位单个数值SWAPA ;SWAP后就得到个位真正的个位MOVTEMPERATURE_L,A MOVA,TEMPERATURE_HANLA,#0FHSWAPAORLA,TEMPERATURE_LMOVTEMPERATURE_ZH,A ;组合后的值存入TEMPERATURE_ZHLCALLHtoB ;转换HEx值成为BCD码MOVTEMPERATURE_L,A ;TEMPERATURE_L目前存入的是十位和个位的BCD编码ANLA,#0F0HSWAPAORLA,TEMPERATURE_HC ;TEMPERATURE_HC 低4位 存放 十位数 BCDMOVTEMPERATURE_HC,AMOVA,TEMPERATURE_LANLA,#0FHSWAPA ;TEMPERATURE_LC高4位 存放 个位数 BCDORLA,TEMPERATURE_LCMOVTEMPERATURE_LC,AMOVA,R7JZTEMPC12ANLA,#0FHSWAPAMOVR7,AMOVA,TEMPERATURE_HC ;TEMPERATURE_HC高4位 存放 百位数 BCDANLA,#0FHORLA,R7MOVTEMPERATURE_HC,ATEMPC12:RET;小数部分码表TEMPDOTTAB:DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H结果温度值的BCD码存放到TEMPERATURE_HC(百位和十位),TEMPERATURE_LC(个位和小数位)中七硬件设计说明1系统总体电路图2各个模块电路图输入系统1键盘模块我们用的下面四个独立键盘中的三个,分别是:K2,K3,K4。1温度测量模块DS18B20通过P3.3口和AT89S52进行通讯。输出系统1继电器模块下图是一个蜂鸣器和一个继电器的图,我们只用到了继电器的图,继电器和单片机的P1.3口进行通讯。1显示模块该显示模块的动态显示数码管,我们用到前面四个数码管,P0口是送字符的,P2口是用来位选数码管的。芯片系统本系统采用的是AT89S52芯片。下面是它的引脚图。八软件设计说明本系统采用的是循环查询方式,来显示和控制温度的。1总模块的流程图2各个模块的流程图读取温度DS18B20模块的流程键盘扫描处理流程九操作指引按键功能1. Enter P1.5(k2)2. Up P1.6(k3)3. Down P1.7(k4)显示温度1. 未插DS18B20时,数码管显示错误888.8.2. 插入DS18B20是,数码管显示当前温度XX.X设定温度1按下Enter,数码管温度显示停止,显示的数字变的比以前亮。2这时可以按Up和Down来调节当前温度。3调节好后,按Enter退出。这时数字变的又暗了,数码管继续显示当前温度继电器随着设定的温度,依据情况跳变。十参考文献1. 单片机原理与应用技术 .江力 主编 .清华大学出版社 .20062. 微型计算机接口技术 . 王兆月等 编著. 机械工业出版社 .20063. 数字电子技术 . 江晓安等 编著. 西安电子科技大学出版社 .19934. ME300B说明书 .伟纳电子 编著. 伟纳电子出版 .20065. DS18B20官方英文文档 . DS18B20官方英文站点下载 .程序源代码 TEMPERATURE_L DATA 31H ;DS18B20低8位Buffer TEMPERATURE_H DATA 30H ;DS18B20高8位Buffer TEMPERATURE_HC DATA 32H ;计算后的百位和十位的BCD码存放BUFFER TEMPERATURE_LC DATA 33H ;计算后的个位和小数位的BCD码存放BUFFER TEMPERATURE_ZH DATA 34H ;计算后十位和个位HEX码的存放BUFFER DIS_BUF_X DATA 35H ;数码管小数位Buffer DIS_BUF_G DATA 36H;数码管个位Buffer DIS_BUF_S DATA 37H;数码管十位Buffer DIS_BUF_B DATA 38H;数码管百位Buffer KEY_BUF_G DATA 39H ;键盘输入后,的个位值 KEY_BUF_S DATA 49H ;键盘输入后,的十位值 KEY_BUF_B DATA 41H ;键盘输入后,的百位值 K_UP EQU P1.5 ;上调按钮 K_DOWN EQU P1.6 ;下调按钮 K_ENTER EQU P1.7 ;输入数据确认按钮 P_DS18B20 EQU P3.3 ;读取DS18B20的输入端口 P_SWITCH EQU P1.3 ;继电器控制端口,1风扇,0电炉 FLAG EQU 20H.0 ;标志位,确定是否存在DS18B20 ENTER_FLAG EQU 20H.1 ;键盘输入的标志位,为0说明键盘正在输入,为1说明键盘输入退出;程序开始执行 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP,#60H ;初始化 MOV KEY_BUF_G,#00H ;由于KEY_BUF是由用户输入的,所以先赋值初始化 MOV KEY_BUF_S,#00H MOV KEY_BUF_B,#00HNEXT: LCALLREAD_TEMP ;调用读温度子程序 JB FLAG,NORMAL ;判断是否有DS18B20的存在 CALL ERR ;不存在时显示错误信息AJMPNEXTNORMAL: LCALL DATA_DEA;处理从DS18B20得到的数据 LCALL SET_DIS_BUF;赋值给DIS_BUF_X,G,S,B LCALL DISPLAY;调用数码管显示子程序 LCALL SCAN_KEY;扫描键盘 LCALL SWITCH;处理继电器 AJMPNEXT;程序名称:ERR;功能:程序出错处理,显示四个8,即8888;入口参数:无;出口参数:DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_BERR:MOV DIS_BUF_X,#08H ;如果没有找到DS18B20,那么就显示错误,错误显示为888 MOV DIS_BUF_G,#08H MOV DIS_BUF_S,#08H MOV DIS_BUF_B,#08H LCALL DISPLAY RET;程序名称:DATA_DEAL;功能:处理采集后的的数据;入口参数:TEMPERATURE_L;出口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_BDATA_DEAL: MOV A,TEMPERATURE_H ;判温度是否零下 ANL A,#80H JZ TEMPC1;A为0,说明是正数,跳往TEMPC1,如果是负数,则对低8为进行补码处理 CLR C MOV A,TEMPERATURE_L;二进制数求补(双字节) CPL A;取反加1 ADD A,#01H MOV TEMPERATURE_L,A;取补码后存回TEMPERATURE_L,此时TEMPERATURE_L里面的值就可以表示温;度了,不过还要继续处理一下。 MOV A,TEMPERATURE_H CPL A ADDC A,#00H ;高位TEMPERATURE_H取反,加上从低位TEMPERATURE_L进来的位 MOV TEMPERATURE_H,A ;写回TEMPERATURE_H MOV TEMPERATURE_HC,#0BH SJMP TEMPC11TEMPC1: MOV TEMPERATURE_HC,#0AH TEMPC11:MOV A,TEMPERATURE_HC SWAP A MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH ;取A低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值 MOV DPTR,#TEMPDOTTAB MOVC A,A+DPTR ;查表 MOV TEMPERATURE_LC,A ;TEMPERATURE_LC LOW=小数部分 BCD MOV DIS_BUF_X,A ;小数位的BCD码送入显示buffer中 MOV A,TEMPERATURE_L ;整数部分 ANL A,#0F0H ;得到个位单个数值 SWAP A ;SWAP后就得到个位真正的个位 MOV TEMPERATURE_L,A MOV A,TEMPERATURE_H ANL A,#0FH SWAP A ORL A,TEMPERATURE_L MOV TEMPERATURE_ZH,A ;组合后的值存入TEMPERATURE_ZH LCALL HtoB ;转换HEx值成为BCD码 MOV TEMPERATURE_L,A ;TEMPERATURE_L目前存入的是十位和个位的BCD编码 ANL A,#0F0H SWAP A ORL A,TEMPERATURE_HC ;TEMPERATURE_HC LOW位 = 十位数 BCD MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH SWAP A ;TEMPERATURE_LC HI位 = 个位数 BCD ORL A,TEMPERATURE_LC MOV TEMPERATURE_LC,A MOV A,R7 JZ TEMPC12 ANL A,#0FH SWAP A MOV R7,A MOV A,TEMPERATURE_HC ;TEMPERATURE_HC HI = 百位数 BCD ANL A,#0FH ORL A,R7 MOV TEMPERATURE_HC,ATEMPC12:RET; 小数部分码表TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H;0.0625-00H;0.0625*2 = 0.125-01H;0.0625*3 = 0.1875-01H;0.0625*4 = 0.25-02H;0.0625*5 = 0.3125-03H;以此类推.;程序名称:HtoB;功能:十六进制转 BCD;入口参数:A;出口参数:R7HtoB: MOV B,#064H ;100 DIV AB ;a/100 MOV R7,A ; MOV A,#0AH XCH A,B DIV AB SWAP A ORL A,B RET;程序名称:INIT_TEMP;功能:初始化DS18B20,确定DS18B20是否是存在的;入口参数:无;出口参数:FLAGINIT_TEMP: SETBP_DS18B20 NOP CLRP_DS18B20 ;主机发出延时537微秒的复位低脉冲 MOVR0,#6BH MOVR1,#04HTSR1: DJNZR0,$ MOV 40,#6BH DJNZ R1,TSR1 SETBP_DS18B20 ;然后拉高数据线,释放总线进入接受状态 NOP NOP NOP MOVR0,#32HTSR2: JNB P_DS18B20,TSR3 ;等待DS18B20回应 DJNZR0,TSR2 LJMPTSR4;延时TSR3: SETBFLAG;置标志位,表示DS1820存在 LJMPTSR5TSR4: CLRFLAG;清标志位,表示DS1820不存在 LJMPTSR7TSR5: MOVR0,#06BHTSR6: DJNZR0,TSR6;时序要求延时一段时间TSR7: SETBP_DS18B20 RET;程序名称:READ_TEMP;功能:读取DS18B20的数据;入口参数:TEMPERATURE_L,TEMPERATURE_H;出口参数:无READ_TEMP: SETBP_DS18B20 LCALLINIT_TEMP ;先复位DS18B20 JBFLAG,TSS2 RET ;判断DS1820是否存在?若DS18B20不存在则返回TSS2:MOVA,#0CCH ;跳过ROM匹配 LCALLWRITE_18B20 MOVA,#44H ;发出温度转换命令 LCALLWRITE_18B20 ;LCALLDISPLAY ;等待AD转换结束,12位的话750微秒 LCALLINIT_TEMP ;准备读温度前先复位 MOVA,#0CCH ;跳过ROM匹配 LCALLWRITE_18B20 MOVA,#0BEH ;发出读温度命令 LCALLWRITE_18B20 LCALLREAD_18B20 ;将读出的温度数据保存到35H/36H RET;具体的步骤:初始化完后当拉低电平开始产生写时隙15微妙之内送入一位数据1560微妙1820来;采样读取它 ;程序名称:WRITE_18B20;功能:将A保存的数值写入DS1820中,有具体的时序要求,详细参考附图的说明;入口参数:A 寄存器;出口参数:无WRITE_18B20: MOVR2,#8;一共8位数据,串行通讯 CLRCWR1:CLRP_DS18B20 MOVR3,#07 DJNZR3,$ RRCA;循环右移 MOVP_DS18B20,C MOVR3,#3CH DJNZR3,$;23*2 = 46微妙 SETBP_DS18B20 NOP DJNZR2,WR1;A里面一共是8位,所以要送8次 SETBP_DS18B20;释放总线 RET;程序名称:READ_18B20;功能:读取18B20中的数据,由于是串行通讯,每次读取一个,循环8次读取;入口参数:TEMPRATURE_L;出口参数:无READ_18B20: MOVR4,#4;将温度高位和低位从DS18B20中读出 MOVR1,#TEMPERATURE_LRE00:MOV R2,#8;数据一共有8位RE01:CLR C SETB P_DS18B20 NOP NOP CLRP_DS18B20 NOP NOP NOP SETBP_DS18B20 MOVR3,#09RE10:DJNZ R3,RE10 MOVC,P_DS18B20 MOVR3,#3CHRE20:DJNZ R3,RE20 RRCA DJNZ R2,RE01 MOVR1,A DECR1 DJNZ R4,RE00 RET;程序名称:SCAN_KEY;功能:扫描键盘;入口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B;出口参数:KEY_BUF_G,KEY_BUF_S,kEY_BUF_BSCAN_KEY: JB K_ENTER,QUIT;如果又Enter键入,则开始键盘输入 LCALL K_DELAY JB K_ENTER,QUIT CLR ENTER_FLAG;每次进来都赋值输入标志,设置为0 MOV KEY_BUF_G,DIS_BUF_G ;将当前的温度赋值给KEY_BUF,也就是说是以当前温度为基准,进行加减的 MOV KEY_BUF_S,DIS_BUF_S MOV KEY_BUF_B,DIS_BUF_BK_LOOP: JB ENTER_FLAG,QUIT;如果输入完成,ENTER_FLAG则为1,退出键盘程序 JB K_ENTER,KUP CALL PRO_ENTERKUP: JB K_UP,KDOWN CALL PRO_UPKDOWN:JB K_DOWN,LOOPA CALL PRO_DOWNLOOPA:LCALL DISPLAY SJMP K_LOOPQUIT: RET;程序名称:PRO_ENTER;功能:确认键盘输入和退出键盘输入;入口参数:ENTER_FLAG;出口参数:ENTER_FLAGPRO_ENTER: CALL K_DELAY JB K_ENTER,K_LOOP ;按键抖动处理 SETB ENTER_FLAG CALL K_DELAY RET;程序名称:PRO_UP;功能:数值上调处理;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_BPRO_UP: CALL K_DELAY JB K_UP,K_LOOP ;按键抖动处理 INC KEY_BUF_G ;个位增一 MOV A,KEY_BUF_G CJNE A,#0AH,UPNEXT;个位增加到10,回0 MOV KEY_BUF_G,#00H INC KEY_BUF_S ;十位加一 MOV A,KEY_BUF_S CJNE A,#0AH,UPNEXT;十位超过99,溢出了 MOV R0,#200ERROR1:LCALL ERR ;出错,显示8888 DJNZ R0,ERROR1 DEC KEY_BUF_S ;退回99 MOV KEY_BUF_G,#09HUPNEXT: MOV DIS_BUF_G,KEY_BUF_G MOV DIS_BUF_S,KEY_BUF_S MOV DIS_BUF_B,KEY_BUF_B CALL K_DELAY RET;程序名称:PRO_DOWN;功能:数值下调处理;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_BPRO_DOWN: CALL K_DELAY JB K_DOWN,K_LOOP ;按键抖动处理 DEC KEY_BUF_G ;个位减一 MOV A,KEY_BUF_G CJNE A,#0FFH,DOWNNEXT;个位减到0,回到9 MOV KEY_BUF_G,#09H DEC KEY_BUF_S ;十位减一 MOV A,KEY_BUF_S CJNE A,#0FFH,DOWNNEXT;十位低于0,溢出了 MOV R0,#200ERROR2:LCALL ERR ;出错,显示8888 DJNZ R0,ERROR2 INC KEY_BUF_S ;退回00 MOV KEY_BUF_G,#00HDOWNNEXT: MOV DIS_BUF_G,KEY_BUF_G ;增加完成后,赋值退出,然后DISPLAY显示出来 MOV DIS_BUF_S,KEY_BUF_S MOV DIS_BUF_B,KEY_BUF_B CALL K_DELAY RET K_DELAY:;键盘抖动延时子程序MOV R6,#250DL20MS_1:MOV R7,#200DJNZ R7,$DJNZ R6, DL20MS_1RET;继电器控制SWITCH: MOV A,KEY_BUF_G;三个Buffer都是0的话,说明还没有输入数值,直

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论