?? main.asm
字號:
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
JB Timerout , DINS00003 ;測量時間溢出則關加熱
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
PUSH DPH
PUSH DPL
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:
CLR Timerout
MOV DPTR,#00H
MOV TH0,#0
MOV TL0,#0
CLR RC ;電容開始充電
SETB TR0 ;開始計時
ADC1:
INC DPTR
MOV A , DPH
CJNE A , #27 , ADC12
SETB Timerout
CLR TempContr
SJMP DINSE
ADC12:
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 DPL
POP DPH
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 + -