?? 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 + -