📄 main(2001426).asm
字号:
LCALL VOTE3
JB F0,ReadSetTempDate2
MOV SetTempL,A ;设定温度值存贮
MOV Counter,#00H
RET
ReadSetTempDate2:
INC Counter
MOV A,Counter
CJNE A,#04,ReadSetTempDate3
MOV SetTempH,#00H
MOV SetTempL,#0C8H
LCALL WriterSetTempDate
SJMP ReadSetTempDate1 ;若4次读取不正确则重写E2PROM
ReadSetTempDate3:
CJNE A,#08,ReadSetTempDate1 ;若8次读取不正确则显示错误码(818)
ErrorDisplay:
CLR EA ;禁止中断
MOV Mumber0,#0AH
MOV Mumber1,#0AH
MOV Mumber2,#0BH ;错误代码(ERR)
LCALL Display ;显示数码
LCALL Dealy
SJMP ErrorDisplay
;保存设定温度
WriterSetTempDate:
LCALL CloseDisplay
LCALL OpenI2c
MOV B,SetTempH
MOV A,#SetTempHE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempH
MOV A,#SetTempHE2PROM2
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempH
MOV A,#SetTempHE2PROM3
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM2
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM3
LCALL WriteI2CDate
LCALL DealyLong
LCALL CloseI2c
RET
;*************************************************************
AdjustSpT12:
MOV ProgramAddressT1+1,#00H
MOV ProgramAddressT1,#00H
PUSH ProgramAddressT1+1
PUSH ProgramAddressT1
RETI
;定时中断1子程序:
DINS1:
POP ProgramAddressT1
POP ProgramAddressT1+1
PUSH ProgramAddressT1+1
PUSH ProgramAddressT1
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH B
;------------------------------------------------------------
;在中断程序中判断堆栈指针及程序是否处于正常范围内运行
MOV A,SP
CJNE A,#STACK,AdjustSpT11
AdjustSpT11:
JC AdjustSpT12;堆栈指针出错
CLR C
MOV A,ProgramAddressT1+1
SUBB A,#LOW(START)
MOV A,ProgramAddressT1
SUBB A,#HIGH(START)
JC AdjustSpT12 ;断点小于START则转
MOV A,#LOW(ProgramEndAddress)
SUBB A,ProgramAddressT1+1
MOV A,#HIGH(ProgramEndAddress)
SUBB A,ProgramAddressT1
JC AdjustSpT12 ;断点大于ProgramEndAddress则转
;------------------------------------------------------------
JB DisplayStatu,DINS10
MOV TH1,#0F0H
MOV TL1,#0BFH ;8ms中断一次
LCALL ReadKey
LCALL Display
JNB TempContr,DINS00002
MOV A,ContrlMumber
JZ DINS00002
CJNE A,TempSub,DINS00003
DINS00001:
CLR TempContrPort
SJMP DINS00003
DINS00002:
SETB TempContrPort
DINS00003:
INC ContrlMumber
MOV A,ContrlMumber
CJNE A,#20,DINS00004
MOV ContrlMumber,#00H
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
MOV TH0,#0
MOV TL0,#0
CLR RC ;电容开始充电
CLR RC ;电容开始充电
SETB TR0 ;开始计时
ADC1:
JNB JUDE,ADC1 ;等待充电达到Vi
CLR TR0 ;冻结定时器
CLR TR0 ;冻结定时器
MOV R3,TL0 ;读取充电时间间隔
MOV R2,TH0
MOV TH0,#068H ;约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 VIL,A
MOV A,TOTALM
SWAP A
ANL A,#0FH
MOV R2,A
MOV A,TOTALH
SWAP A
ORL A,R2
MOV R2,A
MOV VIH,A
CLR A ;清零累加器,为下一次检测作准备
MOV TOTALH,A
MOV TOTALM,A
MOV TOTALL,A
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,ReadKeyE
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
;---------------------------------------------------------------
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 453, 0, 896, 20, 1345, 40, 1807, 60, 2255, 80
DW 2722,100, 3192,120, 3654,140, 4121,160, 4601,180
DW 5066,200, 5553,220, 6016,240, 6486,260, 6981,280
DW 7465,300, 7944,320, 8439,340, 8697,350
NOP
NOP
NOP
LJMP 0000H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -