主程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTD0
ORG 000BH
LJMP TIME0
ORG 0100H
MAIN:
MOV SP ,#60H ; 給堆棧賦初值
CLR PSW.3 ; 工作寄存器初始化
CLR PSW.4 ;
MOV 71H,#0AH ;相對(duì)濕度初始最小值10%
MOV 72H,#62H ;相對(duì)濕度初始最大值98%
MOV 73H,00H ;當(dāng)前相對(duì)濕度存儲(chǔ)單元清零
MOV TMOD,#01H ;定時(shí)初始化
MOV TL0,#0CEH ;晶振=12MHZ,定時(shí)=50ms
MOV TH0,#3CH ;
SETB TR0 ;設(shè)置T0定時(shí)器
SETB EX0 ;設(shè)置INTO中斷優(yōu)先
SETB ET0 ;設(shè)置T0中斷
SETB EA ;開(kāi)中斷
LOP:
ACALL KEY_SCAN ; 掃描按鍵是否按下
CJNE A,#0DBH,LOP1; 判斷“標(biāo)準(zhǔn)”鍵是否按下,不是則跳
AJMP NORMAL ; 若是“標(biāo)準(zhǔn)”鍵按下,則跳轉(zhuǎn)至“標(biāo)準(zhǔn)”
LOP1:
CJNE A,#0DDH,LOP2; 判斷“快速”鍵是否按下,不是則跳
AJMP FAST ; 若是,則跳至“快速”模式工作
LOP2:
CJNE A,#0DEH,LOP ; 判斷“手動(dòng)”鍵是否按下,不是則跳
AJMP MANUAL ; 若是,則跳至“手動(dòng)”模式工作
標(biāo)準(zhǔn)模式:
NORMAL:
ACALL KEY_SCAN ; 掃描矩陣鍵盤(pán)
CJNE A,#0F6H,$ ; “確定”鍵按下才開(kāi)始工作
MOV 5FH,#5AH ; 高溫
MOV 5BH,#14H ; 低速
ACALL INTD0 ; 可控硅調(diào)節(jié)
ACALL WET ; 濕度檢測(cè)
MOV A,73H ;取出當(dāng)前相對(duì)濕度值
CJNE A,#62H,NORMAL ; 判斷是否達(dá)到98%的濕度
N1: MOV 5FH,#32H ; 低溫
MOV 5BH,#5FH ;高速
ACALL INTDO ;
ACALL WET ;
MOV A,73H ;
CJNE A,#OAH,N1 ;判斷是否達(dá)到10%的濕度,若不是則跳轉(zhuǎn),繼續(xù)
低溫高速工作
SJMP LOP
快速模式:
FAST:
ACALL KEY_SCAN ; 掃描矩陣鍵盤(pán)
CJNE A,#0F6H,$ ; “確定”鍵按下才開(kāi)始工作
MOV 5FH,#5AH ; 高溫
MOV 5BH,#14H ; 低速
ACALL INTD0 ; 可控硅調(diào)節(jié)
ACALL WET ; 濕度檢測(cè)
MOV A,73H ;取出當(dāng)前相對(duì)濕度值
CJNE A,#62H,FAST ; 否達(dá)到98%的濕度
F1: MOV 5FH,#5AH ; 高溫
MOV 5BH,#5FH ; 高速
ACALL INTDO ;
ACALL WET ;
MOV A,73H ;
CJNE A,#OAH,F1 ;判斷是否達(dá)到10%的濕度,若不是則跳轉(zhuǎn),繼續(xù)
低溫高速工作
SJMP LOP
手動(dòng)模式:
MANUAL:
MOV A,50H ; 從50H中取出時(shí)間值
MOV R0,A ;
ACALL DISPLAY ; 顯示初始化時(shí)間值
TIME:
ACALL KEY_SCAN ; 掃描矩陣鍵盤(pán)
CJNE A,#0EBH,WEN ; 判斷“時(shí)間”鍵是否按下,不是則跳
ACALL DISPLAY ; 數(shù)碼管顯示
AJMP TIAO ; 跳轉(zhuǎn)至調(diào)節(jié)子程序
MOV A,R0 ;把時(shí)間值存回50H單元
MOV 50H,A ;
WEN:
ACALL KEY_SCAN ; 掃描鍵盤(pán)
CJNE A,#0EDH,FENG ;判斷“溫度”鍵是否按下,沒(méi)有則跳
MOV A,5FH ; 把初始溫度存入R0
MOV R0,A
ACALL DISPLAY
AJMP TIAO
MOV A,R0
MOV 5FH,A ; 把溫度值存回5FH單元
FENG:
ACALL KEY_SCAN ;
CJNE A,#0EEH,TIME ; 判斷“風(fēng)量”鍵是否按下,沒(méi)有則重掃描
MOV A,5BH ;把初始風(fēng)量存入R0
MOV R0,A
ACALL DISPLAY
AJMP TIAO
MOV A,R0 ; 把風(fēng)量值存回5BH單元
MOV 5BH,A ;
ACALL KEY_SCAN; 掃描矩陣鍵盤(pán)
CJNE A,#0F6H,$ ; “確定”鍵按下才開(kāi)始工作
ACALL INTDO ; 可控硅調(diào)節(jié)
ACALL DOUS ; 調(diào)用倒時(shí)子程序
SJMP LOP
可控硅過(guò)零調(diào)功調(diào)速子程序
INTD0:
PUSH ACC ; INTO中斷服務(wù)程序
PUSH PSW ; 保護(hù)現(xiàn)場(chǎng)
PUSH DPH ;
PUSH DPL ;
SETB 24H.0 ; INTO中斷置位,避免主程序修改參數(shù)
WEN:
MOV A,5FH ; 取n1值
JZ TING1 ; n1=0,停止發(fā)熱控制
DEC A ; 若n1≠0,則n1-1
MOV 5FH,A ; 把n1值存回5FH
CJNE A,#00H,WEN ; 判斷n1值是否到零
AJMP FEN ; 跳轉(zhuǎn)至風(fēng)速控制
TING1:
CLR P3.6 ; 停止對(duì)PTC發(fā)熱控制
FEN:
MOV A,5BH ; 取出n2 值
JZ TING2 ;若n2=0,則停止電機(jī)控制
DEC A ;若n2≠0,則n2=n2-1
MOV 5BH,A ;把n2 值存回5BH
CJNE A,#00H,FEN ; 判斷n2值是否到零
AJMP ZONG ;
TING2:
CLR P3.7 ; 停止對(duì)電機(jī)控制
ZONG:
MOV A,59H ; 取N值
JZ KAI ; 若N=0,則可控硅未啟動(dòng)
DEC A ; 若N≠0,說(shuō)明可控硅已啟動(dòng),則N-1后中斷返回
MOV 59H,A ; 把N值存回59H
CJNE A,#00H,ZONG ;
AJMP EXIT ;
KAI: 開(kāi)啟可控硅控制
CLR 24H.0 ; 清INT0中斷標(biāo)志
JB 26H.0,KAI2 ; 若26H.0=1,PTC控制未啟動(dòng)
SETB P3.6 ; 開(kāi)啟對(duì)PTC控制
KAI2:
MOV A,66H ;
JZ EXIT1 ; 若A=0,說(shuō)明未開(kāi)啟對(duì)電機(jī)控制
SETB P3.7 ; 若A≠0,則開(kāi)啟對(duì)電機(jī)控制
EXIT1:
MOV 5FH,5AH ; 恢復(fù)原初始化數(shù)據(jù)
MOV 5BH,66H ;
MOV 59H,#100
EXIT:
POP DPL ; 恢復(fù)現(xiàn)場(chǎng)
POP DPH ;
POP PSW ;
POP ACC ;
RETI ; 中斷返回
濕度檢測(cè)(A/D轉(zhuǎn)換)子程序
WET:
SETB P1.5 ; 啟動(dòng)A/D轉(zhuǎn)換
LOOP:
MOV A,P1 ; 讀取狀態(tài)信號(hào)
ANL A,#80H ; 取出P1.7的值
CJNE A,#00H,LOOP ; 若A=0則轉(zhuǎn)換結(jié)束,若≠0則跳轉(zhuǎn),繼續(xù)讀取狀態(tài)信號(hào)
CLR P1.5 ; 轉(zhuǎn)換結(jié)束,轉(zhuǎn)換器進(jìn)入保持狀態(tài)
L1:
MOV A,P1 ; 讀出個(gè)位數(shù)值,讀入位選內(nèi)容
ANL A,#10H ; 屏蔽其他位,只剩個(gè)位
CJNE A,#10H,L1 ; 確定鎖存器上的BCD碼是否為個(gè)位
MOV A,P3 ; 讀取個(gè)位的BCD碼
ANL A,#0FH ; 屏蔽高位
MOV 40H,A ; 將個(gè)位的BCD碼存入40H單元
L2:
MOV A,P1 ; 讀出十位數(shù)值
ANL A,#08H ;
CJNE A,#08H,L2 ;
MOV A,P3 ;
ANL A,#0FH ;
MOV 41H,A ; 將十位的BCD碼存入41H單元
L3:
MOV A,P1 ; 讀出百位數(shù)值
ANL A,#04H ;
CJNE A,#04H,L3 ;
MOV A,P3 ;
ANL A,#0FH ;
MOV 42H,A ; 將百位的BCD碼存入42H單元
L4:
MOV A,P1 ; 讀出千位數(shù)值
ANL A,#02H ;
CJNE A,#02H,L4 ;
MOV A,P3 ;
ANL A,#0FH ;
MOV 43H,A ; 將千位的BCD碼存入43H單元
L5:
MOV A,P1 ; 讀出萬(wàn)位數(shù)值
ANL A,#01H ;
CJNE A,#01H,L5 ;
MOV A,P3 ;
ANL A,#0FH ;
MOV 44H,A ; 將萬(wàn)位的BCD碼存入44H單元
ZH:
MOV A,40H
ORL A,41H
MOV 73H,A ; 將當(dāng)前相對(duì)濕度存入73H
RET
顯示子程序:
DISPLAY:
MOV A,R0 ; 數(shù)值的顯示
MOV B,#10 ;
DIV A B ; 把要顯示的數(shù)的十位存放在A中,個(gè)位存放在B中
ADD A,#10 ; 位選通十位
MOV P0,A ; 顯示十位數(shù)字
TI0:
JNB P3.4 ,TT ;定時(shí)50ms是否到,是則跳,否則等待
SJMP TI0
TT:
SETB P3.4
MOV A,B ; 把個(gè)位的數(shù)值賦給A
ADD A,#20H ; 位選通顯示個(gè)位
MOV P0,A; 顯示個(gè)位數(shù)值
TI1:
JNB P3.4 TT1
SJMP TI1
TT1:
SETB P3.4
矩陣鍵盤(pán)子程序:
KEY_SCAN:
MOV P2,#0F8H ; 置列線為0,行線為1
MOV A,P2 ; 讀P2口
ANL A,#0F8H ; 取出高三位
MOV B,A ; 暫存到B
MOV P2,#0C7H ; 置列線為1,行線為0
MOV A,P2; 讀P2口
ANL A,#0C7H ; 取出低三位
ORL A,B ; 高三位與低三位進(jìn)行或運(yùn)算,重新組合
CJNE A,#0FFH,KEY_IN1 ; 0FFH表示無(wú)按鍵按下,不相同則跳轉(zhuǎn)
RET ; 結(jié)束,無(wú)按鍵按下
KEY_IN1: 識(shí)別具體按鍵值子程序
MOV B,A ; 將按鍵的特征編碼暫存于B
MOV DPTR,#KEY_TABLE
MOV R1,#0
KEY_IN2:
MOV A,R1
MOVC A,@A+DPTR ; 查表
CJNE A,B,KEY_IN3 ; 比較,若不相同則跳轉(zhuǎn),若相同則找到按鍵的特征編碼
MOV 30H,A ; 把特征編碼存入30H單元
RET
KEY_IN3:
INC R1
CJNE A,#0C0H,KEY_IN2 ; 若不是結(jié)束編碼則繼續(xù)核對(duì)下一個(gè)編碼
RET ; 0C0H為結(jié)束碼
KEY_TABLE:
DB 0DBH , 0DDH , 0DEH ; 標(biāo)準(zhǔn),快速,手動(dòng)
DB 0EBH , 0EDH , 0EEH ; 時(shí)間,濕度,風(fēng)量
DB 0F3H , 0F5H , 0F6H ; +,-,確定
DB 0C0H ; 結(jié)束碼
“+”“-”鍵調(diào)節(jié)子程序:
TIAO:
ACALL KEY_SCAN ; 掃描鍵盤(pán)
UP:
CJNE A,#F3H,DOWN ;判斷“+”鍵是否按下
INC R0 ; 數(shù)值加1
CJNE R0,#99,RIGHT ;判斷是否加到99
MOV R0,#00H ; 若加到99,則從0開(kāi)始
AJMP RIGHT
DOWN:
CJNE A,#0F5H,RIGHT ; 判斷“-”鍵是否按下
DEC R0 ; 數(shù)值減1
CJNE R0,#00H.RIGHT ;判斷是否減到0
MOV RO,#99 若減到0,則重新從99開(kāi)始
RIGHT:
ACALL DISPLAY ; 顯示數(shù)值
SURE:
ACALL KEY_SCAN
CJNE A,#0F6H,UP ;判斷“確定”鍵是否按下,不是則跳
RET
倒時(shí)子程序:
DOUS:
MOV R2,#1500; 為延時(shí)1分鐘而用
MOV A,50H ; 取出設(shè)定好的時(shí)間
MOV R0,A
DS1:
SETB P3.4 ; 啟動(dòng)定時(shí)
ACALL DISPLAY ; 調(diào)用顯示程序
DJNE R2,DS1 ; 延時(shí)1分鐘
MOV R2,#1500;
LCALL WET ; 檢測(cè)當(dāng)前濕度值
MOV A,73H ; 將當(dāng)前濕度傳給A
CJNE A,#0AH,DS2 ; 當(dāng)前濕度是否達(dá)到10%,不是則跳
JMP DS3
DS2:
DJNE R0,DS1 ;設(shè)定的時(shí)間減1,繼續(xù)顯示
DS3:
RET
時(shí)間中斷程序:
TIMA:
PUSH PSW
PUSH ACC
MOV TL0,#0CEH ; 重新賦值
MOV TH0,#3CH ;
CLR P3.4
POP ACC
POP PSW
RETI