?? 數(shù)字測(cè)溫儀.asm
字號(hào):
;數(shù)字測(cè)溫儀程序編制說(shuō)明
;本程序工作過(guò)程如下:
;1、開(kāi)機(jī)后首先進(jìn)行初始化,初始化后顯示“P”1秒,提示系統(tǒng)進(jìn)入測(cè)試工作狀態(tài),顯
; 示完成后,進(jìn)行溫度測(cè)試。
;2、溫度測(cè)試的過(guò)程是這樣的:
; * T0置為計(jì)數(shù)方式,對(duì)T0腳(即P3.5)的脈沖計(jì)數(shù),工作方式2,初值為255
; * 將T1置為定時(shí)方式,工作方式2,初值為0
; * 從P3.4口送單穩(wěn)觸發(fā)脈沖,使555輸出單穩(wěn)脈沖(正脈沖),該脈沖寬度隨熱敏
; 電阻阻值而變化。
; * 開(kāi)T0、T1中斷,啟動(dòng)T0、T1。此時(shí)T1自動(dòng)對(duì)內(nèi)部機(jī)器周期計(jì)數(shù),當(dāng)TL1溢
; 出時(shí),產(chǎn)生T1中斷。在T1中斷處理程序中,將RAM 21H單元加1(即21H單
; 元存放脈沖寬計(jì)數(shù)值高位)后返回主程序。
; * 當(dāng)來(lái)自P3.5的單穩(wěn)脈沖結(jié)束(即下降沿到來(lái))時(shí),TL0計(jì)數(shù)器加1并溢出,產(chǎn)
; 生T0中斷。在T0中斷處理程序中,關(guān)T0、T1中斷,并將TL1中的的內(nèi)容讀
; 到RAM 20H單元(20H單元存放脈寬計(jì)數(shù)值的低位)。
; * 查表求溫度值
; NTTAB是脈寬計(jì)數(shù)值與溫度的對(duì)照表,按低溫到高溫的次序存放,即第一、第
; 二單元存放-100C時(shí)的脈寬計(jì)數(shù)值,依此類(lèi)推,第121和122單元?jiǎng)t存放+500C
; 時(shí)的脈寬計(jì)數(shù)值。
; 將20H、21H中的計(jì)數(shù)值與NTTAB中的計(jì)數(shù)值依次進(jìn)行比較,直至20H、21H
; 中的值小于NTTAB中的計(jì)數(shù)值為止。而比較的次數(shù)就對(duì)應(yīng)溫度的整數(shù)值,二計(jì)
; 數(shù)值之差與對(duì)照表相鄰兩計(jì)數(shù)值的商即為小數(shù)位。
;3、程序中除了對(duì)-100C到+500C進(jìn)行測(cè)試外,還有開(kāi)路(計(jì)數(shù)值過(guò)大)、短路檢測(cè)(計(jì)
; 數(shù)值過(guò)?。?、負(fù)超溫檢測(cè)、正超溫檢測(cè),并有相應(yīng)的顯示。
;4、將檢測(cè)值(溫度值或其他結(jié)果)顯示1秒,然后再重復(fù)溫度檢測(cè)。
;需要說(shuō)明的是:本程序雖包括了測(cè)溫的全過(guò)程,但未考慮軟硬件的自檢,軟件濾波等部
;分。
;關(guān)于電路圖中元件參數(shù)說(shuō)明
;1、C5為0.1μ。
;2、電容C4、熱敏電阻RT的參數(shù)決定單穩(wěn)脈沖的寬度,而最終的計(jì)數(shù)值除了與單穩(wěn)
; 脈沖的寬度有關(guān)外,還與晶振頻率有關(guān),因而在RT的型號(hào)確定后要根據(jù)系統(tǒng)對(duì)精
; 度和分辨率等的要求選擇C4的值。本程序中NTTAB脈寬計(jì)數(shù)值與溫度對(duì)照表是在
; 熱敏電阻為MF53-1型負(fù)溫?zé)崦綦娮杓?2K精密電阻與之并聯(lián),C4為1μ,晶振為
; 4MHz的條件下得到的。數(shù)據(jù)不十分準(zhǔn),僅做參考。讀者在元件參數(shù)定了后,可在
; 調(diào)試程序時(shí)用可變電阻箱代替熱敏電阻,在程序測(cè)出計(jì)數(shù)值處設(shè)斷點(diǎn),讀出每個(gè)標(biāo)
; 準(zhǔn)阻值所對(duì)應(yīng)的計(jì)數(shù)值(即20H、21H中的內(nèi)容),自己將NTTAB建立起來(lái)。
; * * * * * * * * * * * * * * * * * * * * * * * * * *
; * 用89C2051控制的數(shù)字測(cè)溫儀 *
; * 源程序清單 *
; * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0000H
AJMP MAIN ;轉(zhuǎn)主程序
ORG 000BH
AJMP WT0 ;T0中斷入口
ORG 001BH
AJMP WT1 ;T1中斷入口
;主程序
ORG 030H
MAIN: MOV IE,#00H ;關(guān)中斷
MOV SP,#40H ;設(shè)堆棧指針SP為40H
SETB P3.5 ;將P3.5口置”1”
MOV 30H,#0CH ;“P3 ”送顯示緩沖區(qū)30H~33H
MOV 31H,#0EH
MOV 32H,#0EH
MOV 33H,#0EH
MAIN0: ACALL D1S ;調(diào)顯示1秒子程序
MOV P1,#0FFH ;關(guān)顯示
CLR 20H ;清脈寬計(jì)數(shù)值存放區(qū)20H~21H
CLR 21H
CLR 22H ;清單穩(wěn)脈沖結(jié)束標(biāo)志22H
MOV TH0,#0FFH ;置T0計(jì)數(shù)初值255
MOV TL0,#0FFH
MOV TH1,#00H ;置T1的計(jì)數(shù)初值0
MOV TL1,#00H
MOV TMOD,#26H ;置T0為計(jì)數(shù)方式,方式2;T1為定時(shí)方式。方式2
SETB EA ;允許T0、T1中斷
SETB ET0
SETB ET1
SETB TR0 ;開(kāi)T0中斷
CLR P3.5 ;送單穩(wěn)觸發(fā)脈沖
NOP
NOP
NOP
NOP
SETB P3.5
SETB TR1 ;開(kāi)T1中斷
MAIN1: CJNE 22H,#01H,MAIN2 ;單穩(wěn)脈沖未結(jié)束,轉(zhuǎn)檢查是否超時(shí)
AJMP MAIN3 ;單穩(wěn)脈沖結(jié)束,轉(zhuǎn)取脈寬計(jì)數(shù)值
MAIN2: CJINE 21H,#08H,MAIN1 ;未超時(shí),轉(zhuǎn)等待單穩(wěn)脈沖結(jié)束
CLR EA
CLR ET0
CLR ET1
CLR TR0
CLR TR1
MOV 30H,#0DH ;開(kāi)路提示“E1”送顯示緩沖區(qū),轉(zhuǎn)顯示
MOV 31H,#01H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN3: CJNE 21H,#00H,MAIN4 ;單穩(wěn)脈沖結(jié)束,先判斷是否短路。不是,轉(zhuǎn)查表程序。
MOV 30H,#0DH ;短路,短路提示“E2”送顯示緩沖區(qū),轉(zhuǎn)顯示
MOV 31H,#02H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN4: ACALL NTTR ;調(diào)查表子程序
AJMP MAIN0
;查表求溫度值子程序
NTTR: MOV R2,#00H ;清計(jì)數(shù)與溫度對(duì)照表偏移量寄存器R2
MOV DPTR,NTTAB ;DPTR指向計(jì)數(shù)與溫度對(duì)照表首址
NTTR1: CLR C ;20H、21H中的內(nèi)容與NTTRB相減,并將差值存23H、24H
MOV R3,#02H
MOV R0,#20H
MOV R1,#23H
NTTR2: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
MOV @R1,A
INC R0
INC R1
INC R2
CJNE R2,#122,NTTR3 ;若未到NTAB表尾,繼續(xù)比較
POVER:JC NTTR30 ;到表尾,查到對(duì)應(yīng)溫度,轉(zhuǎn)求溫度值
MOV 30,#0EH ;到表尾,查到對(duì)應(yīng)溫度,正超溫提示“UUU”送顯緩區(qū)
MOV 31H,#0BH
MOV 32H,#0BH
MOV 33H,#0BH
RET ;返回主程序
NTTR3: DJNZ R3,NTTR2
JNC NTTR1 ;未查到對(duì)應(yīng)溫度值,繼續(xù)查表
NTTR30:MOV A,R2 ;已查到對(duì)應(yīng)溫度,由偏移量求出整數(shù)部分,暫存R4
CLR C
SUBB A,#02H
RR A
MOV R4,A
MOV R1,#23H ;求溫度值的小數(shù)部分:+X/2送B
MOV A,@R1
CPL A
INC A
RR A
MOV B,A
NTTR4: DEC R2 ;Ni+1送20H、21H
MOV R0,#21H
MOV A,R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R0
DEC R2
MOV A, R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R2 ;求+i/2從A
DEC R2
MOV R3,#02H
CLR C
NTTR5: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
JNC NTTR50
CLP A
INC A
NTTR50:RR A
MOV R5,A
MOV A,B ;+x/2*10/+i得到溫度值的小數(shù)部分
JZ NTTR6
MOV B, #05H
MUL AB
MOV B,R5
DIV AB
MOV 20H,A ;小數(shù)部分送20H
AJMP NTTR7
NTTR6: MOV 20H,#00H
NTTR7: MOV A,#0AH ;判整數(shù)部分為正還是負(fù)
CLR C
SUBB A,R4
JC PTEMP
NTEMP:CJNE A,#0AH,NTEMP1 ;為負(fù)
MOV 30H,#0EH ;“-X”送顯示緩沖區(qū)高三位
MOV 31H,#0AH
MOV 32H,A
AJMP NTEMP2
NTEMP1:MOV 30H,#0AH ;“-10” 送顯示緩沖區(qū)高三位
MOV 31H,#01H
MOV 32H,#00H
NTEMP2:MOV A,#0AH ;修正小數(shù)部分后,將小數(shù)部分送顯緩低三位
CLR C
SUBB A,20H
MOV 33H,A
RET ;返回主程序
PTEMP: MOV 30H,#0EH ;為正?!?”送顯緩最高位
MOV A,R4 ;溫度值整數(shù)部分送顯緩中間兩位
MOV B,#0AH
DIV AB
JNZ PTEMP1
] MOV 31H,#0EH
JMP PTEMP2
PTEMP1:MOV 31H,A
PTEMP2:MOV 32H,B
MOV 33H,20H ;小數(shù)部分送顯緩最低位
RET ;返回主程序
;顯示子程序(將顯緩區(qū)的內(nèi)容循環(huán)顯示一遍,每位顯示1ms后,關(guān)顯示返回主程序)
DSP: MOV R2,#01H
MOV R0,#30H
MOV DPTR,#TAB
DSP1: MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
ORL P3,R2
ACALL D1MS
MOV A,R2
RL A
MOV R2,A
CJNE R2,#10H,DSP2
ANL P3,#0F0H
RET
DSP2: INC R0
AJMP DSP1
;延時(shí)1ms子程序
D1MS: MOV R7,#166
D1MS1: DJNZ R7,D1MS1
RET
;顯示1秒子程序
D1S: MOV R6,#04H
D1S1: MOV R5,#250
D1S2: ACALL DSP
DJNZ R5,D1S2
DJNZ R6,D1S1
RET
;段碼表
TAB: DB 40H,79H,24H,30H,19H :0.,1.,2.,3.,4.
DB 12H,02H,78H,00H,10H :5.,6.,7.,8.,9.
DB 3FH,41H,0CH,06H,0FFH :-.,U.,P.,E.,滅
;T0中斷處理程序
WT0: MOV A,TL1 ;將T1計(jì)數(shù)值送20H
MOV 20H,A
CLR EA ;關(guān)中斷
CLR TR0 ;T0停止計(jì)數(shù)
CLR TR1 ;T1停止計(jì)數(shù)
MOV 22H,#01H ;置單穩(wěn)脈沖結(jié)束標(biāo)志
RETI ;返回主程序
;T1中斷處理程序
WT1: INC 21H ;脈寬計(jì)數(shù)值高位加1
RETI ;返回主程序
;脈寬計(jì)數(shù)與溫度對(duì)照表
NTTBL: DB 0D0H,05H,0B2H,05H,96H,05H,72H,05H
DB 52H,05H,35H,05H,15H,05H,0F6H,04H
DB 0D8H,04H,0B9H,04H,9CH,04H,81H,04H
DB 65H,04H,4AH,04H,30H,04H,14H,04H
DB 0FAH,03H,0E0H,03H,0C6H,03H,0ADH,03H
DB 95H,03H,7CH,03H,64H,03H,4CH,03H
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -