基于单片机的恒温控制系统设计
摘要:本设计的测量及加热控制系统以单片机为核心部件,通过对系统软件和硬件设计的合理规划,发挥单片机自身集成众多系统级功能单元的优势,在不减少功能的前提下有效降低了硬件成本,系统操控简便。Abstract:ThedesignofthetemperaturemeasurementandheatingcontrolsystemstoAT89S52microcontrollercorecomponent,plusthetemperatureacquisitioncircuit,keyboardanddisplaycircuit,heatingcircutaltemperaturesensorDS18B20,andthedeterminantofthekeyboardanddynamicdisplayinordertoeasilycontrolthesolid-staterelaysforheatingcontroloftheswitchingdevice.Thisworksbothonthecurrenttemperatureinreal-timedisplayoftemperaturecanbecontrolledinordertoenableuserstoreachtherequiredtemperature,andmakeitconstantatthistemperature.HumanizeddesignkeyboarddeterminanttemperatureeasyExpress,thetwodecimalinteger,adisplayshowsahigheraccuracy.Setupinthefuzzycontroltheory,controlalgorithms,sothatthecontrolaccuracycanmeetthegeneralrequirementsofsocialproduction.Throughthesystemsoftwareandhardwaredesignofrationalplanning,exerttheirownsingle-chipintegrationofmanysystem-levelfunctionalunitoftheadvantages,doesnotreducethefunctionsatthepremiseofeffectivelyreducingthecostofhardware,thesystemeasytomanipulate.Keywords:microcontroller,temperaturecontrol,fuzzycontrol
1.引言
温度是工业生产中主要的被控参数之一,与之相关的各种温度控制系统广泛应用于冶金、化工、机械、食品等领域。
2.整体方案设计
本设计的测量及加热控制系统以单片机为核心部件,实验证明该温控系统具有很高的可靠性和稳定性。温度测量及加热系统控制的总体结构如图1所示。系统主要包括现场温度采集、实时温度显示、加热控制参数设置、加热电路控制输出、和系统核心
图1:方案一框图
温度采集电路以形式将现场温度传至单片机。单片机结合现场温度与用户设定的目标温度,按照已经编程固化的控制算法计算出实时控制量。以此控制量,决定加热电路的工作状态,使温逐步稳定于用户设定的目标值。系统运行过程中的各种状态参量均由数码管实时显示DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端S18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位
?这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
3.2、键盘和显示的设计
键盘采用行列式和外部中断相结合的方法,图3中各按键的功能定义如下表1。其中设置键与单片机的脚相连,、YES、NO用四行三列接单片机P0口,REST键为硬件复位键,与R、C构成复位电路。模块电路如下图3:
表1:按键功能
按键 键名 功能 REST 复位键 使系统复位 RET 设置键 使系统产生中断,进入设置状态 数字键 设置用户需要的温度 YES 确认键 用户设定目标温度后进行确认 NO 清除键 用户设定温度错误或误按了YES键后使用
图3键盘接口电路
显示采用3位共阳LED动态显示方式,显示内容有温度值的十位、个位及小数点后一位。用P2口作为段控码输出,并用74HC244作驱动。P1.0—P1.2作为位控码输出,用PNP型三极管做驱动。模块电路如下图4:
图4显示接口电路
3.3加热控制电路的设计
用于在闭环控制系统中对被控对象实施控制,被控对象为电热杯,采用对加在电热杯两端的电压进行通断的方法进行控制,以实现对水加热功率的调整,从而达到对水温控制的目的。对电炉丝通断的控制采用SSR-40DA固态继电器。它的使用非常简单,只要在控制端TTL电平,即可实现对继电器的开关,使用时完全可以用NPN型三极管接成电压跟随器的形式驱动。当单片机的P1.3为高点平时,三极管驱动固态继电器工作接通加热器工作,当单片机的P1.3为低电平时固态继电器关断,加热器不工作。控制电路图如下图5:
图5加热控制电路
3.4报警及指示灯电路的设计
当用户设定的目标温度达到时需用声音的形式提醒用户,此时蜂鸣器为三声断续的滴答滴答的叫声。在本系统中我们为用户设计了越限报警,当温度低于用户设置的目标温度10度或高于10度时蜂鸣器为连续不断的滴答滴答叫声。当单片机P1.7输出高电平时,三极管导通,蜂鸣器工作发出报警声。P1.7为低电平时三极管关断,蜂鸣器不工作。D1为电热杯加热指示灯,P1.5低电平有效;D0为检测到DS18B20的指示,高电平有效;D10为降温指示灯,低电平有效。报警及指示灯电路如下图6示:
图6报警及指示灯电路
4软件系统的设计
系统的软件由三大模块组成:主程序模块、功能实现模块和运算控制模块。
4.1主程序模块
主程序主要完成加热控制系统各部件的初始化以及实际测量中各个功能模块的协调
图7主程序流程图
4.2功能实现模块
以用来执行对固态继电器及电热杯的控制。功能实现模块主要由中断处理子程序、温度比较处理子程序、键盘处理子程序、显示子程序、报警子程序等部分组成。键盘显示及中断程序流程图如下图8:
图8键盘、显示、中断子程序流程图
4.3运算控制模块
该模块由标度转换、模糊控制算法,及其中用到的乘法子程序。
4.3.1标度转换
式中A为二进制的温度值,为DS18B20的数字信号线送回来的温度数据。
单片机在处理标度转换时是通过把DS18B20的信号线送回的16位数据右移4位得到二进制的温度值。其小数部分通过查小数表的形式获取。程序流程图如下图9:
图9标度转换子程序流程图
4.3.2模糊控制算法子程序
由于无法确切确定电炉的物理模型,因而无法建立其数学模型和传递函数。加热器为一惯性系统,我们采用模糊控制的方法,通过多次温度测量模糊计算当用户设定目标温度时需提前关断加热器的温度,利用加热器自身的热惯性使温度上升到其设定温度。每隔5摄氏度我们进行一次温度测量,并当达到其温度时关断加热器记录下因加热器的热惯性而上升的温度值。从而可以建立热惯性的温度差值表,在程序中利用查表法,查出相应设定温度对应的关断温度。通过实验数据我们可以看出,当水温从0℃加热到50℃这段温度区域,其温度惯性曲线可近似成线性的直线,水温从50℃加热到100℃这段温度惯性曲线可近似成另一条线性的直线段。通过对设置的目标温度与温控系统监测温度进行差值处理就可近似的求出单片机的提前关断温度。程序流程图如图10:
图10模糊控制算法子程序流程图
5设计总结
我们的温度控制系统是基于AT89S52单片机的设计方案,她能实时显示当前温度,并能根据用户的要求作出相应的控制。此系统为闭环系统,工作稳定稳定性高,控制精度高,利用模糊控制算法使超调量大大降低。软件采用模块化结构,提高了通用性。本设计的目的不仅仅是温度控制本身,主要提供了单片机外围电路及软件包括控制算法设计的思想,应该说,这种思想比控制系统本身更为重要。
5.1设计所达到的性能指标
5.1.1温控系统的标度误差
我们将标准温度计和温控系统探头放人同一容器中,选定若干不同的温度点,记
录下标准温度计显示的温度和温控系统显示的温度进行比较。测量数据如下表2所示:
表2标准温度计测量的温度和温控系统显示的温度
标准温度计和温控系统显示的温度(℃) 标准温度计 16.9 47.7 57.8 63.0 72.8 85.1 90.9 温控系统 16.5 48.0 58.3 62.9 73.0 85.5 90.5 差值比较 -0.4 0.3 0.5 0.1 0.2 0.4 -0.4 标度误差 1.5%
5.1.2温控系统的静态误差
通过测量在不同的温度点同标准温度的温度差来确定温控系统的静态误差。其测量
数据如下表3:
表3标准温度和温控系统显示的温度
标准温度和温控系统显示的温度(℃) 标准温度 26.0 37.0 46.0 60.0 70.0 83.0 系统显示值 25.7 36.4 46.1 59.6 70.0 83.3 差值 -0.3 -0.6 -0.1 -0.4 0 0.3 静态误差 0.18℃
5.1.3温控系统的控制精度
通过设定不同的温度值,使加热器加热,待温度稳定时记录各温度点的温度计数据
和温控系统的显示值。其记录数据如下表4:
温度计读数和温控系统显示的温度(℃) 设定温度值 20.0 28.0 35.0 45.0 55.0 75.0 87.0 91.0 系统显示值 20.5 27.7 34.4 45.1 54.1 74.9 86.1 91.2 差值 0.5 -0.3 -0.6 0.1 -0.9 -0.1 -0.9 0.2 控制精度 0.45℃ 超调量 0.83%
5.2、结果分析论述
我们的系统完全满足设计要求,静态误差方面可以达到0.18℃的误差,在读数正确
方面与标准温度计的读数误差为1.5%,对一般的工业生产完全可以采用我们的设计。
该系统具有较小的超调值,超调值大约为0.83%左右。虽然超调为不利结果,但另一方面却减小了系统的调节时间。从其数据表可以看出该系统为稳定系统。
5.3设计方案评价
5.3.1优点
在硬件方面:本设计方案采用了单总线型数字式的温度传感器,提高了温度的采集
精度,节约了单片机的口线资源。方案还使用仅一跟口线就可控制的美国生产的固态继电器SSR—40DA作加热控制器件,使设计简单化,且可靠性强。在控制精度方面,本设计在不能确定执行机构的数学模型的情况下,大胆的假设小心的求证,利用模糊控制的算法来提高控制精度。
在软件方面:我们采用模块化编程,思路清晰,使程序简洁、可移植性强。
5.3.2缺点
本设计方案虽然采用了当前市场最先进的电子器件,使电路设计简单,但设计方案造价高。本系统虽然具有较小的超调量,但加大了调节时间。如果需要更高的控制精度,则我们的模糊控制将不适应,需修改程序。
5.3.3方案的改进
在不改变加热器容量的情况下,为减小调节时间,可以实行在加热快达到设定温度时开启风扇来减小热惯性对温度的影响的措施。在控制精度上可采用先进的数字PID控制算法,对加热时间进行控制,提高控制精度。可以改进控制系统使能同PC联机通信,以利用PC的图形处理功能打印显示温度曲线。AT89S52串行口为TTL电平,PC串行口为RS232电平,使用一片MAX232作为电平转换驱动。
6.参考文献
[1]李广弟单片机基础北京:北京航空航天大学出版社,2001
[2]王福瑞单片微机测控系统设计大全北京:北京航空航天大学出版社,1997
[3]赵茂泰智能仪器原理及应用(第2版)北京:电子工业出版社,2004
[4]赖寿涛微型计算机控制技术北京:机械工业出版社,2000
[5]沙占友模拟与数字万用表检测及应用技术北京:电子工业出版社1999
7.附录
7.1附录[1]使用说明书
按键功能说明
数字键:按SET键后,按相应的数字键(0~9)可对温度进行设置,所设置的温
度将实时显示在LED显示器上;
SET键:按SET键可对温度的十位、个位以及小数部分进行设置;
YES键:设置好温度后按YES键,系统将据你所设置的温度(须大于当前实际
温度)对水进行加热;
NO键:若误按了SET键,或对输入有误,可按NO键进行取消;
RST键:对系统进行复位。
指示灯及报警器说明
红灯:加热状态标志;
绿灯:温度传感器正常工作标志;
蓝灯:保温状态标志;
报警器:功能①当水温达到预设值时报警提醒;
功能②当水温达到或超越上、下限时报警提示。
7.2附录[2]设计总电路
7.3附录[3]程序清单
TEMPER_LEQU29H;用于保存读出温度的低8位
TEMPER_HEQU28H;用于保存读出温度的高8位
FLAGEQU38H;是否检测到DS18B20标志位
DAYUEQU44H;设温>实温
XIYUEQU45H;设温<实温
DEYUEQU46H;设温=实温
GAOLEEQU47H;水温高于最高温度
DILEEQU48H;水温低于最低温度
A_bitEQU79h;数码管个位数存放内存位置
B_bitEQU7Ah;数码管十位数存放内存位置
C_BITEQU78H;数码管小数存放内存位置
ORG0000H
AJMPSTART
ORG0003H
AJMPPITO
ORG0030H
START:CLRP1.7
CLRP1.3
CLRP1.5
SETBP1.6
MOVR4,#00H
MOVSP,#60H;确立堆栈区
MOVPSW,#00H;
MOVR0,#20H;RAM区首地址
MOVR7,#60H;RAM区单元个数
ML:MOV@R0,#00H
INCR0
DJNZR7,ML
CLRIT0
MAIN:LCALLGET_TEMPER;调用读温度子程序进行温度显示,这里我们考
;虑用网站提供的两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,
;我们不要求显示小数所以可以抛弃29H的低4
;位将28H中的低4位移入29H中的高4位,这
;样获得一个新字节,这个字节就是实际测量获
;得的温度
LCALLDISPLAY;调用数码管显示子程序
JNB00H,MAIN
CLR00H
MOVA,38H
CJNEA,#00H,SS
AJMPMAIN
SS:LCALLGET_TEMPER
LCALLDISPLAY;调用数码管显示子程序
LCALLBIJIAO
LCALLXIAOYU
LCALLJIXIAN
JNBDEYU,LOOP
CLRP1.3;关加热器
SETBP1.6;关蓝灯
SETBP0.7;关风扇
CLRDEYU
LCALLGET_TEMPER
LCALLDISPLAY
AJMPTT2
LOOP:JNBDAYU,TT
CLRDAYU
SETBP1.3
SETBP1.6
SETBP0.7
CLRP1.7
LCALLGET_TEMPER
LCALLDISPLAY
AJMPTT2
TT:JNBXIYU,TT2
CLRXIYU
CLRP0.7
CLRP1.6
CLRP1.3
CLRP1.7
LCALLGET_TEMPER
LCALLDISPLAY
TT2:MOVA,29H
CLRC
CJNEA,50H,JX
MOVA,30H
CLRC
CJNEA,51H,JIA1
AJMPYS2
JIA1:JCJX
MOVA,51H
MOV52H,A
ADDA,#2
MOV52H,A
CLRC
MOVA,30H
CJNEA,52H,JIA2
JIA2:JNCJX
YS2:SETBP1.7
CLRP1.6
MOVR5,#20H
YS:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS
CLRP1.7
SETBP1.6
MOVR5,#20H
YS1:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS1
YS3:SETBP1.7
CLRP1.6
MOVR5,#20H
YS0:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS0
CLRP1.7
SETBP1.6
MOVR5,#20H
YS01:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS01
YS4:SETBP1.7
CLRP1.6
MOVR5,#20H
YS02:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS02
CLRP1.7
SETBP1.6
MOVR5,#20H
YS03:LCALLGET_TEMPER
LCALLDISPLAY
DJNZR5,YS03
JX:MOV A, 29H
CJNE A, 31H, JX00
JX01:SETB P1.7
CLR C
AJMP LAST
JX00:JCJX01
CLRP1.7
CJNE A, 32H, JX03
JX02:SETB P1.7
CLR C
AJMP LAST
JX03:JNC JX02
CLRP1.7
LAST:LCALLGET_TEMPER
LCALLDISPLAY
AJMPSS
;常数表格区
TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;0-8
DB90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH;9,A,B,C,D,E,F,灭,p.
TAB1:DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,;0.--9.
TAB2:DB0,0,1,2,3,3,4,4,5,5,6,7,8,8,9,9,;小数点
;1ms延时程序
;中断服务程序
;完成按键识别,键值求取,按键实时显示等功能;
;
PITO:PUSHACC
PUSHPSW
SETBRS0
CLRRS1
SETB 00H
MAIN1:MOVR7,#03H;显示位数为2位
MOVR0,#7AH
MOV78H,#00H
MOV79H,#00H
MOV7AH,#00H
KK:LCALLDIR
LCALLKEY1
LOOP1:CJNEA,#11,LOOP2
AJMPLAST0
LOOP2:CJNE A, #12, LOOP3
LJMP LAST3
LOOP3:CJNEA,#10,L4
MOV A, #00H
L4:MOV@R0,A
LCALL DIR
DECR0
DJNZ R7, KK
SETB01H
LAST0:JNB01H,KK
LOOP4:LCALLKEY1
CJNEA,#12,LOOP5
AJMPLAST3
LOOP5:CJNEA,#11,LOOP4
LAST1:LCALLDIR
LCALLMUN
LCALLJD
LCALL BIJIAO
LAST3:POPPSW
POPACC
RETI
;精度控制子程序
JD:PUSHACC
PUSHPSW
CLRC
MOVA,38H
MOV50H,A
MOVA,39H
MOV51H,A
CJNEA,29H,L001
L001:JCLAST02;设温<实温,则跳出
MOVA,29H
MOV41H,A
MOVA,38H
CJNEA,#25,L002
L003:CLRC;0 SUBBA,41H
CJNEA,#3,L004
L005:MOVA,30H
ADDA,#5;0 DAA
JNBACC.4,L0051
ANLA,#0FH
SETBC
L0051:MOV39H,A
MOVA,29H
ADDCA,#1
MOV38H,A
AJMPLAST2
LAST02:AJMPLAST2
L004:JCL005
MOVA,39H
SUBBA,#0
DAA
MOV39H,A
JNCL0041
DEC38H
L0041:MOVA,38H
SUBBA,#2;0 MOV38H,A
AJMPLAST2
L002:JCL003
CJNEA,#50,L006
L007:CLRC;25 SUBBA,41H
CJNEA,#3,L008
L009:MOVA,30H
ADDA,#1
DAA
JNBACC.4,L0091
ANLA,#0FH
SETBC
L0091:MOV39H,A
MOVA,29H
ADDCA,#1
MOV38H,A
AJMPLAST2
L008:JCL009
MOVA,39H
SUBBA,#0
MOV39H,A
MOVA,38H
SUBBA,#2
MOV38H,A
AJMPLAST2
L006:JCL007
CJNEA,#65,L010
L011:CLRC
SUBBA,41H
CJNEA,#3,L012
L013:MOVA,30H
ADDA,#2
JNBACC.4,L00131
ANLA,#0FH
SETBC
L00131:MOV39H,A
MOVA,29H
ADDCA,#1
MOV38H,A
AJMPLAST2
L012:JCL013
MOVA,39H
SUBBA,#0
MOV39H,A
MOVA,38H
SUBBA,#2
MOV38H,A
AJMPLAST2
L010:JCL011
CJNEA,#90,L016
L017:CLRC
SUBBA, 41H
CJNEA, #2,L014
L015:MOVA, 30H
ADDA, #0
JNBACC.4,L00151
ANL A, #0FH
SETB C
L00151:MOV39H,A
MOVA,29H
ADDCA,#1
MOV38H,A
AJMPLAST2
L014:JCL015
CLRC
MOVA,38H
SUBBA,#1
MOV38H,A
AJMPLAST2
L016:JCL017
LAST2:POPPSW
POPACC
RET
;键扫描
KEY1:LCALLKS1;键扫描
JNZLK1
LCALLDIR
AJMPKEY1
LK1:LCALLDIR
LCALLDIR
LCALLKS1
JNZLK2
LCALLDIR
AJMPKEY1
LK2:MOVR2,#0FEH;确定键值
MOVR4,#01H
MOVA,R2
LK4:MOVP0,A
NOP
MOVA,P0
JBACC.3,LONE
MOVA,#00H
AJMPLKP
LONE:JBACC.4,LTWO
MOVA,#03H
AJMPLKP
LTWO:JBACC.5,LTHR
MOVA,#06H
AJMPLKP
LTHR:JBACC.6,NEXT5
MOVA,#09H
AJMPLKP
NEXT5:INCR4
MOVA,R2
JNBACC.2,KND
RLA
MOVR2,A
AJMPLK4
KND:AJMPKEY1
LKP:ADDA,R4
PUSHACC
LK3:LCALLDIR
LCALLKS1
JNZLK3
POPACC
RET
KS1:PUSHPSW
MOVP0,#78H
NOP
MOVA,P0;判断有无键按下
CPLA
ANLA,#78H
POPPSW
RET
;求设置温度的二进制代码,值保存在38H单元
MUN:PUSHPSW
MOVR0,#7AH;求键值
MOVA,@R0
SWAPA
DECR0
ADDA,@R0
MOVR1,A
ANLA,#0F0H
SWAPA
MOVB,#10
MULAB
MOVR2,A
MOVA,R1
ANLA,#0FH
ADDA,R2
MOV38H,A
MOVR0,#78H
MOV39H,@R0
POPPSW
RET
;比较实际温度和设置温度的大小并设置相应的标志位
BIJIAO:MOVA,29H;实际温度
MOV40H,A
MOVA,38H ;设置温度
CLRC
CJNEA,40H,L1;设置温度>实际温度?
MOVA,39H
CJNEA,30H,L1
SETBDEYU
SJMPL2
L1:JCL2
SETBDAYU;设温>实温,
SJMPL2
L2:RET
;极限值求取子程序
;完成上下极限值的求取,并置相应的标志位
;
JIXIAN:PUSHACC
PUSH PSW
CLRC
MOVA,50H
SUBBA,#10
MOV31H,A
MOVA,50H
ADDA,#10
MOV32H,A
POP PSW
POPACC
RET
;DS18B20复位初始化子程序
INIT_1820:SETBP1.4
NOP
CLRP1.4;主机发出延时537微秒的复位低脉冲
MOVR1,#3
TSR1:MOVR0,#107
DJNZR0,$
DJNZR1,TSR1
SETBP1.4;然后拉高数据线
NOP
NOP
NOP
MOVR0,#25H
TSR2:JNBP1.4,TSR3;等待DS18B20回应
DJNZR0,TSR2
LJMPTSR4;延时
TSR3:SETBFLAG;置标志位,表示DS1820存在
SETBP1.5;检查到DS18B20就点亮P1.5LED
LJMPTSR5
TSR4:CLRFLAG;清标志位,表示DS1820不存在
CLRP1.5
LJMPTSR7
TSR5:MOVR0,#117
TSR6:DJNZR0,TSR6;时序要求延时一段时间
TSR7:SETBP1.4
RET
;读出转换后的温度值
GET_TEMPER:SETBP1.4
LCALLINIT_1820;先复位DS18B20
JBFLAG,TSS2
RET;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:SETBP1.5;DS18B20已经被检测到
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLDISPLAY;调用显示子程序实现延时一段时间,等待AD转换结束,12位750微秒
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200;将读出的温度数据保存到35H/36H
SETBP1.5
RET
;写DS18B20的子程
WRITE_1820:MOVR2,#8;一共8位数据
CLRC
WR1:CLRP1.4
MOVR3,#6
DJNZR3,$
RRCA
MOVP1.4,C
MOVR3,#23
DJNZR3,$
SETBP1.4
NOP
DJNZR2,WR1
SETBP1.4
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:MOVR2,#8;数据一共有8位
RE01:CLRC
SETBP1.4
NOP
NOP
CLRP1.4
NOP
NOP
NOP
SETBP1.4
MOVR3,#9
RE10:DJNZR3,RE10
MOVC,P1.4
MOVR3,#23
RE20:DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
;显示子程序
DISPLAY:MOVA,29H;将29H中的十六进制数转换成10进制
MOVB,#10;16进制/10=10进制
DIVAB
MOVB_bit,a;十位在a
MOVA_bit,b;个位在b
MOVC_BIT,30H
DIR:MOVDPTR,#TAB
MOVA,C_BIT
MOVCA,@A+DPTR
MOVP2,A
CLRP1.0
ACALLD1MS
SETBP1.0
MOVDPTR,#TAB1;指定查表启始地址
MOVA,A_BIT;取个位数
MOVCA,@A+DPTR;查个位数的7段代码
MOVP2,A;送出个位的7段代码
CLRP1.1;开个位显示
ACALLd1ms;显示1ms
SETBP1.1
MOVDPTR,#TAB
MOVA,B_BIT;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
MOVP2,A;送出十位的7段代码
CLRP1.2;开十位显示
ACALLD1ms;显示1ms
SETBP1.2
RET
d1ms:PUSHPSW
SETBRS1
SETBRS0
MOV R7,#05H
DD1:MOV R6,#0FFH
DD2:DJNZ R6,DD2
DJNZ R7,DD1
POPPSW
RET
-29-
|
|