📄 main.asm
字号:
;数字温度控制显示程序(误差补偿法) (CPU:89C2051 晶体:12MHz)
;作者:高宇
;2001、3、17
;主程序用工作寄存器:第0组
;定时测量工作寄存器:第1组
;显示用工作寄存器: 第2组
;AT24C02读写工作寄存器:第3组
;注:在调试板中,加热控制为P1.7,I2C器件开启为P1.6,而在实际电路板中相反
MainRAM SEGMENT DATA
MainMark SEGMENT BIT
$NOLIST
$INCLUDE (Lib.H)
$INCLUDE (END.H)
$LIST
;*************************************************************
SetTimer EQU 10 ;数码管闪烁频率设置
SetWaitTimer EQU 200 ;设置加热温度时,键没按下后等待返回温度显示的时间
SetChangSpeed1 EQU 20 ;设定按住键盘后正常速度时增加或减少控制温度的速度()
SetChangSpeed2 EQU 4 ;设定按住键盘一段时间后快速增加或减少控制温度的速度()
SetPushKeyMum EQU 5 ;同一键按住五个闪烁周期后加速控制温度设定速度
SetDisplayBit EQU 3 ;设置显示的位数
TempUpH EQU 01H
TempUpL EQU 2CH ;设定温度上限为300度
TempDownH EQU 00H
TempDownL EQU 00H ;设定温度下限为0度
SetCompKey EQU 5 ;连续读5次,键值相同说明按下了一个键
UpKey EQU 10H ;上键
DownKey EQU 11H ;下键
SetKey EQU 12H ;设定键
UnKey EQU 55H ;无键
TempOffset EQU 00H ;滞回比较温度 ;
;-------------------------------------------------------------
;DATA 20H
RSEG MainMark
XSBJ: DBIT 1 ;数码管显示标记(0 不显示 1 显示)
FHBJ: DBIT 1 ;返回温度显示(0 不返回 1 返回)
ChangOk: DBIT 1 ;改变控制温度允许与否标记(0 否 1 可)
DisplayStatu: DBIT 1 ;数码管显示状态(0 不闪烁 1 闪烁)
SetTempChang: DBIT 1 ;上一步重新设定了控制温度(1 重新设定 0 没有)
ReadTempOK: DBIT 1 ;已经读取了温度
TempContr: DBIT 1 ;是否加热标记
TestCon: DBIT 1 ;确定采样基准值还是实际值
Timerout: DBIT 1 ;温度测量时间溢出标志
;-------------------------------------------------------------
RSEG MAINRAM
SetTempHBak1: DS 1
SetTempLBak1: DS 1 ;设定温度值存贮
VIH: DS 1 ;待测电压整数部分
VIL: DS 1 ;待测电压小数部分
VIHT: DS 1 ;待测电压或基准电压整数部分
VILT: DS 1 ;待测电压或基准电压小数部分
CLOCK: DS 1 ;检测次数计数器
TOTALH: DS 1 ;临时累加器高字节
TOTALM: DS 1 ;临时累加器中字节
TOTALL: DS 1 ;临时累加器低字节
DisPort: DS 1 ;动态显示时应显示的数码管号
Mumber0: DS 1 ;第一个数码管显示数值
Mumber1: DS 1 ;第二个数码管显示数值
Mumber2: DS 1 ;第三个数码管显示数值
Timer: DS 1 ;时间基准(65ms)
Timer1: DS 1 ;时间基准(65ms)
Timer2: DS 1 ;时间基准(65ms)
KeyCount: DS 1 ;同一键按下计数
KeyCodeTemp: DS 1 ;键值缓存
KeyCode: DS 1 ;保存键值
SetTempH: DS 1
SetTempL: DS 1 ;设定温度值存贮
ChangSpeed: DS 1 ;控制温度设定时速度
PushKeyMumber: DS 1 ;同一键一直按下次数
UpPushKeyCode: DS 1 ;上一次按键保存
BeforTempH: DS 1
BeforTempL: DS 1 ;上一次温度保存
TempH: DS 1
TempL: DS 1
SetTempHBak2: DS 1
SetTempLBak2: DS 1 ;设定温度值存贮
TempSub : DS 1 ;保存实际温度与控制温度差值
ContrlMumber: DS 1
Counter: DS 1 ;计数器
ProgramAddressT1: DS 2;断点地址保存
;-------------------------------------------------------------
TempOffsetH: DS 1
TempOffsetL: DS 1 ;温度误差
;-------------------------------------------------------------
SetTempHE2PROM1 EQU 010H
SetTempLE2PROM1 EQU 011H
SetTempHE2PROM2 EQU 030H
SetTempLE2PROM2 EQU 031H
SetTempHE2PROM3 EQU 050H
SetTempLE2PROM3 EQU 051H ;设定好的控制温度值保存地址及备份地址
;-------------------------------------------------------------
RC BIT P1.2 ;92h ;RC充放电控制端口(低电平放电)
KeyPort BIT P1.2 ;键输入口
JUDE BIT P3.6 ;0B6H;比较电压判断口
XM0 BIT P1.5 ;第三个数码管控制口/设置键
XM1 BIT P1.4 ;第四个数码管控制口/下键/采样实际值
XM2 BIT P1.3 ;第五个数码管控制口/上键/采样基准值
TempContrPort BIT P1.6 ;加热控制(1 加热 0 停止)
;*************************************************************
ISEG AT 05FH
STACK: DS 01EH
;分配堆栈
CSEG AT 0000H
USING 0
;使用第0组寄存器
Start:
LJMP Main ;主程序
;-------------------------------------------------------------
CSEG AT 0003H
LJMP Start
CSEG AT 000BH
LJMP DINS ;T0:定时中断子程序
CSEG AT 0013H
LJMP Start
CSEG AT 001BH
LJMP DINS1 ;T1:定时中断子程序
CSEG AT 0023H
LJMP Start
;-------------------------------------------------------------
CSEG AT 026H
Main:
CLR TempContr
MOV SP,#STACK-1
;设置堆栈
CLR EA
MOV R0,#20H
CLEAR:
MOV @R0,A ;清零片内单元
INC R0
CJNE R0,#5FH,CLEAR
CLR ReadTempOK
MOV DisPort,#00H ;显示第1个数码管
MOV KeyCode,#UnKey
MOV KeyCodeTemp,#UnKey
CLR EA
MOV TMOD,#11H ;定时器设置
MOV TH0,#0D8H ;约10mS检测一次
SETB RC ;电容放电
MOV ContrlMumber,#00H
MOV VIH,#00H
MOV VIL,#00H
MOV TempH,#00H
MOV TempL,#00H
MOV TempOffsetH , #00H
MOV TempOffsetL , #00H ;起始时设置测量误差为0
CLR TestCon
CLR Timerout ;起始时温度测量没有溢出
MainEncrypt:
LCALL SetTemp ;启动时显示控制温度
MOV A,#00H
LCALL SetDisplayMode ;数码管常亮
LOOP:
SETB EA
JNB ReadTempOK,LOOP00
LCALL CompTemp
LOOP00:
MOV A , TempOffsetH
ANL A , #10000000B ;最高位表示误差方向
JZ LOOP101
CLR C
MOV A , VIL
SUBB A , TempOffsetL
MOV R3 , A
MOV A , TempOffsetH
ANL A , #01111111B
MOV R2 , A
MOV A , VIH
SUBB A , R2
MOV R2 , A
AJMP LOOP102
LOOP101:
MOV A , VIL
ADD A , TempOffsetL
MOV R3 , A
MOV A , VIH
ADDC A , TempOffsetH
MOV R2 , A ;进行测量误差修正
LOOP102:
MOV DPTR,#TempTab
MOV R1,#19
LCALL UNEX2
CJNE A,#0FFH,LOOP0
MOV R2,BeForTempH
MOV R3,BeForTempL
SJMP LOOP1 ;温度超限则显示上一次的正常温度
LOOP0:
MOV A,R4
MOV BeForTempH,A
MOV TempH,A
MOV R2,A
MOV A,R5
MOV BeForTempL,A
MOV TempL,A
MOV R3,A
LOOP1:
LCALL IBTD2 ;把数值转换成BCD码并存入显示缓冲区中
MOV A,KeyCode
CJNE A,#UnKey,LOOP2
LJMP LOOP
LOOP2:
CJNE A,#SetKey,LOOP3
LJMP LOOP
LOOP3:
LCALL SetTemp ;若有键按下则进入温度设置模块
LJMP LOOP
NOP
NOP
;*************************************************************
CompTemp:
MOV A,SetTempL
ADD A,#01H
MOV SetTempLBak1,A
MOV A,SetTempH
ADDC A,#0H
MOV SetTempHBak1,A
CLR C
MOV A,TempL
SUBB A,SetTempLBak1
MOV B,A
MOV A,TempH
SUBB A,SetTempHBak1
JC CompTemp5
;温度是否超过上限判断,否则转。
MOV A,B
JNZ CompTemp3
SETB TempContr
MOV TempSub,#21
RET
CompTemp3:
CLR C
MOV A,TempL
SUBB A,#low(310)
MOV A,TempH
SUBB A,#high(310)
JNC CompTemp31
;温度是否超过300度判断,否则转。
CLR TempContr
;停止加热
RET
CompTemp31:
;温度超过设定300度
LJMP ErrorDisplay
CompTemp5:
CLR C
MOV A,SetTempLBak1
SUBB A,TempL
MOV B,A
MOV A,#160
SUBB A,B
JNC CompTemp6
MOV A,#00H
CompTemp6:
CLR C
MOV B,A
SUBB A,#150
JNC CompTemp7
MOV A,B
MOV B,#8
DIV AB
SJMP CompTemp8
CompTemp7:
; ADD A,#8
; MOV B,A
; CLR C
; SUBB A,#16
; MOV A,B
; JNC CompTemp8
MOV A,#18
CompTemp8:
MOV TempSub,A
SETB TempContr
;否则处于加热状态
RET
;*************************************************************
;设定控制温度子程序
SetTemp:
CLR TR0
CLR ET0 ;关闭温度测量
CLR ET1
CLR TR1
CLR TempContrPort
MOV Timer1,#00H ;清返回主程序时间计数器
CLR FHBJ ;清可返回标记
MOV Timer2,#00H ;清控制温度改变时间计数器
MOV ChangSpeed,#SetChangSpeed1
SETB ChangOk ;按住键后可改变控制温度值
MOV PushKeyMumber,#00H
;------------------------------------------------------------
LCALL ReadSetTempDate ;读取E2PROM中的设定温度值
;------------------------------------------------------------
MOV A,#01H
LCALL SetDisplayMode ;数码管闪烁
;-------------------------------------------------------------
SetTemp1:
LCALL ReadKey
MOV A,KeyCode
CJNE A,#UnKey,SetTemp10
;-------------------------------------------------------------
MOV Timer2,#00H ;清控制温度改变时间计数器
MOV ChangSpeed,#SetChangSpeed1
SETB ChangOk ;按住键后可改变控制温度值
MOV PushKeyMumber,#00H
MOV UpPushKeyCode,#UnKey
LJMP SetTemp3
;-------------------------------------------------------------
SetTemp10: ;有键盘按下
JNB ChangOk,SetTemp3
CLR ChangOk ;改变了控制温度后不允许马上再改变
;等下次时间到后可再改变
PUSH ACC
CJNE A,UpPushKeyCode,SetTemp11 ;为上键否
INC PushKeyMumber ;按键次数加1
MOV A,PushKeyMumber
CJNE A,#SetPushKeyMum,SetTemp12 ;按住相同键的时已到指定时间否
MOV PushKeyMumber,#00H ;清按键时间
MOV ChangSpeed,#SetChangSpeed2 ;加速控制温度调整时间
SetTemp12:
SJMP SetTemp13
SetTemp11:
MOV UpPushKeyCode,A ;按了另外键
MOV PushKeyMumber,#00H
MOV ChangSpeed,#SetChangSpeed1 ;重新判别按键时间
SetTemp13:
POP ACC
;------------------------------------------------------------
CJNE A,#UpKey,SetTemp2
CLR C
MOV A,SetTempL
SUBB A,#TempUpL
MOV A,SetTempH
SUBB A,#TempUpH
JNC SetTemp14 ;设定温度是否超过上限判断
MOV A,SetTempL
ADD A,#01
MOV SetTempL,A
MOV A,SetTempH
ADDC A,#00H
MOV SetTempH,A
SJMP SetTemp3
SetTemp14:
MOV SetTempL,#TempDownL
MOV SetTempH,#TempDownH
SJMP SetTemp3
SetTemp2:
CJNE A,#DownKey,SetTemp3
CLR C
MOV A,#TempDownL
SUBB A,SetTempL
MOV A,#TempDownH
SUBB A,SetTempH
JNC SetTemp21 ;设定温度是否低于下限判断
CLR C
MOV A,SetTempL
SUBB A,#01
MOV SetTempL,A
MOV A,SetTempH
SUBB A,#00H
MOV SetTempH,A
SJMP SetTemp3
SetTemp21:
MOV SetTempL,#TempUpL
MOV SetTempH,#TempUpH
SetTemp3:
CJNE A,#SetKey,SetTemp30
SETB FHBJ
;------------------------------------------------------------
SetTemp30:
MOV R2,SetTempH
MOV R3,SetTempL
LCALL IBTD2 ;把数值转换成BCD码并存入显示缓冲区中
LCALL Display ;显示数码
LCALL Dealy
JNB FHBJ,SetTemp4 ;没到返回时间则继续处于设定温度状态
;------------------------------------------------------------
CLR ET1
CLR TR1
LCALL WriterSetTempDate;控制温度写入E2PROM中
SETB TR0
SETB ET0
MOV ContrlMumber,#00H
MOV A,#00H
LCALL SetDisplayMode ;数码管常亮
RET
SetTemp4:
LJMP SetTemp1
NOP
NOP
;*************************************************************
;读取设定温度
ReadSetTempDate:
LCALL CloseDisplay
MOV Counter,#00H
MOV A,#SetTempHE2PROM1
LCALL ReadI2CDate
MOV SetTempH,A ;设定温度值存贮
MOV A,#SetTempLE2PROM1
LCALL ReadI2CDate
MOV SetTempL,A ;设定温度值存贮
RET
ErrorDisplay:
CLR EA ;禁止中断
MOV Mumber0,#0AH
MOV Mumber1,#0AH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -