📄 main.asm.bak
字号:
LCALL ReadI2CDate
MOV SetTempL,A ;设定温度值存贮
RET
ErrorDisplay:
CLR EA ;禁止中断
MOV Mumber0,#0AH
MOV Mumber1,#0AH
MOV Mumber2,#0BH ;错误代码(ERR)
LCALL Display ;显示数码
LCALL Dealy
CLR TempContrPort
SJMP ErrorDisplay
;保存设定温度
WriterSetTempDate:
LCALL CloseDisplay
LCALL OpenI2c
MOV B,SetTempH
MOV A,#SetTempHE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
LCALL CloseI2c
RET
;*************************************************************
DINS1:
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH B
;
;------------------------------------------------------------
JB DisplayStatu,DINS10
MOV TH1,#0F0H
MOV TL1,#0BFH ;8ms中断一次
LCALL ReadKey
LCALL Display
JNB TempContr,DINS00003
MOV A,ContrlMumber
JNZ DINS00001
CLR TempContrPort
DINS00001:
CJNE A,TempSub,DINS00002
SETB TempContrPort
DINS00002:
INC ContrlMumber
MOV A,ContrlMumber
CJNE A,#23,DINS00004
MOV ContrlMumber,#00H
SJMP DINS00004
DINS00003:
CLR TempContrPort
DINS00004:
POP B
POP DPL
POP DPH
POP PSW
POP ACC
RETI
NOP
NOP
DINS10:
MOV TH1,#00H
MOV TL1,#00H ;8ms中断一次
INC Timer
MOV A,Timer
CJNE A,#SetTimer,DINS11
MOV Timer,#00H
CPL XSBJ
DINS11:
INC Timer1
MOV A,Timer1
CJNE A,#SetWaitTimer,DINS12
MOV Timer1,#00H
SETB FHBJ
SETB FHBJ
DINS12:
INC Timer2
MOV A,Timer2
CJNE A,ChangSpeed,DINS13
MOV Timer2,#00H
CPL ChangOk
DINS13:
POP B
POP DPL
POP DPH
POP PSW
POP ACC
RETI
;-------------------------------------------------------------
;定时中断0子程序:
DINS:
PUSH ACC
PUSH PSW
SETB RS0
CLR TR0 ;定时器初始化
LCALL CloseDisplay
JB TestCon , DINS000
SETB XM2
CLR XM1
CLR XM0
AJMP DINS001
DINS000:
CLR XM2
SETB XM1
CLR XM0
DINS001:
MOV TH0,#0
MOV TL0,#0
CLR RC ;电容开始充电
SETB TR0 ;开始计时
ADC1:
JNB JUDE,ADC1 ;等待充电达到Vi
CLR TR0 ;冻结定时器
CLR TR0 ;冻结定时器
MOV R3,TL0 ;读取充电时间间隔
MOV R2,TH0
MOV TH0,#048H ;约38mS定时
MOV TL0,#000H
SETB TR0 ;定时器继续工作
SETB RC ;放电,准备下次充电
SETB RC ;放电,准备下次充电
MOV A,R3 ;累加采样值
ADD A,TOTALL
MOV TOTALL,A
MOV A,R2
ADDC A,TOTALM
MOV TOTALM,A
CLR A
ADDC A,TOTALH
MOV TOTALH,A
INC CLOCK ;检测次数加一
MOV A,CLOCK
ANL A,#0FH
NOP
NOP
JZ ADC2
DINSE:
POP PSW
POP ACC
RETI ;检测未满16次,中断返回
NOP
NOP
ADC2:
MOV A,TOTALL ;检测满16次,求平均充电时间,保存到R2R3
SWAP A
ANL A,#0FH
MOV R3,A
MOV A,TOTALM
SWAP A
ANL A,#0F0H
ORL A,R3
MOV R3,A
MOV VILT,A
MOV A,TOTALM
SWAP A
ANL A,#0FH
MOV R2,A
MOV A,TOTALH
SWAP A
ORL A,R2
MOV R2,A
MOV VIHT,A
CLR A ;清零累加器,为下一次检测作准备
MOV TOTALH,A
MOV TOTALM,A
MOV TOTALL,A
JB TestCon , DINSQ11
SETB TestCon
CLR C
MOV A , VILT
SUBB A , #LOW(2911)
MOV TempOffsetL , A
MOV A , VIHT
SUBB A , #HIGH(2911)
JC DINSW11
ORL A , #10000000B
MOV TempOffsetH , A
LJMP DINSE
DINSW11:
CLR C
MOV A , #LOW(2911)
SUBB A , VILT
MOV TempOffsetL , A
MOV A , #HIGH(2911)
SUBB A , VIHT
MOV TempOffsetH , A
LJMP DINSE
DINSQ11:
MOV VIL , VILT
MOV VIH , VIHT
CLR TestCon
SETB ReadTempOK
LJMP DINSE
;******************************************************
;*******************************************************
CloseDisplay:
MOV P3,#0FFH
SETB XM0
SETB XM1
SETB XM2
MOV P3,#0FFH
SETB XM0
SETB XM1
SETB XM2
RET
;显示数码
Display:
PUSH PSW
SETB RS1
MOV A,DisPort
CJNE A,#SetDisplayBit,Display1
MOV DisPort,#00H
MOV A,#00H
Display1:
LCALL DisplayMumber ;每循环一次显示1位数码管
INC DisPort
POP PSW
RET
;-------------------------------------------
;显示一位数码
;输入: A 数码管端口号
; Mumber0 -- Mumber2
;输出 A 键值
DisplayMumber:
LCALL CloseDisplay
JNB XSBJ,DisplayMumber3
MOV B,A
MOV R0,#Mumber0
ADD A,R0
MOV R0,A
MOV A,@R0
MOV DPTR,#MumberTemp
MOVC A,@A+DPTR
MOV P3,A
MOV A,B
CJNE A,#00H,DisplayMumber1
SETB XM0
SETB XM1
CLR XM2
RET
DisplayMumber1:
CJNE A,#01H,DisplayMumber2
SETB XM0
CLR XM1
SETB XM2
RET
DisplayMumber2:
CJNE A,#02H,DisplayMumber3
CLR XM0
SETB XM1
SETB XM2
MOV A,KeyCodeTemp
RET
DisplayMumber3:
RET
MumberTemp:
DB 0C0H,0F9H,064H,070H,059H
DB 052H,042H,0F8H,040H,050H
DB 048H,046H ;A,E
;*************************************************************
;二进制整数转换为十进制数
;输入二进在R2R3中
;输出在Mumber0--Mumber4中
IBTD2:
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
IBTD21:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
NOP
NOP
DJNZ R7,IBTD21
MOV R0,#Mumber0
MOV A,R6
XCHD A,@R0
INC R0
SWAP A
XCHD A,@R0
INC R0
MOV A,R5
XCHD A,@R0
RET
;*************************************************************
;设置显示模式
;输入 A 0 不闪烁
; 1 闪烁
SetDisplayMode:
CLR TR1
CLR ET1
SETB XSBJ ;数码管显示
JZ SetDisplayMode1
SETB DisplayStatu ;闪烁显示
SETB DisplayStatu ;闪烁显示
MOV TH1,#00H
MOV TL1,#00H
SETB TR1
SETB ET1
SETB EA
RET
SetDisplayMode1:
CLR DisplayStatu ;正常显示
CLR DisplayStatu ;正常显示
MOV TH1,#0F0H
MOV TL1,#0BFH ;8ms中断一次
SETB TR1
SETB ET1
SETB EA
RET
;*************************************************************
;读键盘
;键值在KeyCode中
ReadKey:
SETB KeyPort
SETB KeyPort
MOV P3,#0FFH
SETB XM0
SETB XM1
CLR XM2
JB KeyPort,ReadKey1
MOV A,KeyCodeTemp
CJNE A,#UpKey,ReadKey01 ;上一次按键为上键吗
INC KeyCount ;为上键则相同按键次数加1
MOV A,KeyCount
CJNE A,#SetCompKey,ReadKey00
MOV KeyCount,#00H
MOV Timer1,#00H ;有键按下时清等待返回计数器
MOV KeyCode,#UpKey
ReadKey00:
RET
ReadKey01:
MOV KeyCodeTemp,#UpKey
MOV KeyCount,#00H
RET
;---------------------------------------------------------------
ReadKey1:
SETB XM0
CLR XM1
SETB XM2
JB KeyPort,ReadKey2
MOV A,KeyCodeTemp
CJNE A,#DownKey,ReadKey11 ;上一次按键为上键吗
INC KeyCount ;为上键则相同按键次数加1
MOV A,KeyCount
CJNE A,#SetCompKey,ReadKey10
MOV KeyCount,#00H
MOV Timer1,#00H ;有键按下时清等待返回计数器
MOV KeyCode,#DownKey
ReadKey10:
RET
ReadKey11:
MOV KeyCodeTemp,#DownKey
MOV KeyCount,#00H
RET
;---------------------------------------------------------------
ReadKey2:
CLR XM0
SETB XM1
SETB XM2
JB KeyPort,ReadKeyE
MOV A,KeyCodeTemp
CJNE A,#SetKey,ReadKey21 ;上一次按键为设定键吗
INC KeyCount ;为设定键则相同按键次数加1
MOV A,KeyCount
CJNE A,#SetCompKey,ReadKey20
MOV KeyCount,#00H
MOV Timer1,#00H ;有键按下时清等待返回计数器
MOV KeyCode,#SetKey
ReadKey20:
RET
ReadKey21:
MOV KeyCodeTemp,#SetKey
MOV KeyCount,#00H
RET
;---------------------------------------------------------------
ReadKeyE:
MOV KeyCount,#00H
MOV KeyCodeTemp,#UnKey
MOV KeyCode,#UnKey
RET
NOP
NOP
Dealy:
MOV R2,#07H
Delay1:
MOV R3,#088H
Delay2:
NOP
NOP
DJNZ R3,Delay2
DJNZ R2,Delay1
RET
NOP
NOP
;修改表后在调用插值的函数前,端点个数的存放寄存器(R1)的值要改变
TempTab:
DW 216, 0, 430, 20, 643, 40, 866, 60, 1080, 80
DW 1304,100, 1525,120, 1748,140, 1948,160, 2208,180
DW 2442,200, 2682,220, 2911,240, 3145,260, 3388,280
DW 3630,300, 3870,320, 4119,340, 4250,350
NOP
NOP
NOP
LJMP 0000H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -