?? 源程序.asm
字號:
明是由一個0.58ms 低電平地和一個1.58ms 高電平組成,
即保存一個1 .為1則再調一個延時,讓它延到低電平。
等待到高電平后重復上述過程解碼。
11.3 遙控器解碼
程序介紹:通過上述的解碼原理,利用單片機的中斷
口來測PWM碼的寬度,通過本實驗儀配備的遙控,單片
機解碼在數碼管上顯示(圖20)。實際應用例如:紅外遙
控。
圖20
程序實例(disvcd.asm):
ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT
ORG 0030H
MAIN:
88
SETB EA ;開所有中斷
SETB IT1
SETB EX1;
MOV 33H,#00H
TIN:
;顯示/////////////////////////////////////////
MOV A,33H
ANL A,#0FH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,33H
ANL A,#0F0H
SWAP A
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
ACALL YS1
AJMP TIN
;/////////////////////////////////////////////
INT: ;中斷解碼
CLR EA ;關所有中斷
MOV R6,#10
SB: ACALL YS1 ;延時882m
89
JB P3.3,EXIT ;為高退出
DJNZ R6,SB ;延時9ms
JNB P3.3,$ ;避開9ms高電平引導
脈沖
ACALL YS2 ;避開4ms低電平引導脈沖
MOV R7,#16 ;忽略16位系統碼
JJJJA: JNB P3.3,$
LCALL YS1
MOV C,P3.3
JNC UUUA
LCALL YS3 ;延時1ms
UUUA: DJNZ R7,JJJJA
;解系統正碼和反碼,取反后比較相等保存//////////
MOV R1,#1AH
MOV R2,#2
PP: MOV R3,#8
JJJJ: JNB P3.3,$
LCALL YS1
MOV C,P3.3
JNC UUU
LCALL YS3
UUU: MOV A,@R1
RRC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
MOV A,1AH
90
CPL A
CJNE A,1BH,EXIT
;/////////////////////////////////////////////
MOV 33H,1AH
EXIT: SETB EA
RETI
YS1: MOV R4,#20
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2
D3: MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
91
十二、綜合
12.1 電子鐘
程序及操作指南:程序寫入上電后,將在四個數碼管
上顯示0000,然后每隔一分鐘,數碼管將從低位跳變,該
程序模擬的就是時鐘。用按鍵數顯鍵可將時間調至正確時
間。按按鍵數鍵一下,數碼管將在低位閃爍,然后依次按
一下,數碼管的閃爍位置就向前移一個數碼管,按到第五
下時,退出。將對應的數碼管按閃爍以后,長按按鍵數顯
鍵,數碼管將會顯示從1至9,顯示到所需時間,松開按鍵
數顯鍵,數碼管顯示對應所設時間,程序也會記下這個值。
例設置成2334,
即晚上11點34分。設置步驟如下:按鍵一下長按至
數碼管分低顯示到4時松開按鍵一下長按至
數碼管分高位顯示到3時松開按鍵一下長按
至數碼管時低位顯示到3時松開按鍵一下長
按至數碼管時高位顯示到2時松開。
注意:如果小時設置超過23,數碼管將顯示ERR(錯
誤),再按一下鍵恢恢復。
程序實例(clock.asm):
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT ;外中斷0入口
ORG 000BH
AJMP DIN0 ;定時器0入口
MAIN:
92
DISML EQU 30H
DISMH EQU 31H
DISHL EQU 32H
DISHH EQU 33H ;顯示分,時的個時位
TFLAG EQU 34H ;時間秒標志,判是否到50
個0.2秒,即50*0.2=1秒
SETFLAG EQU 35H ;設置標志,依次從個位到
十位到百位到千位
ADDFLAG EQU 36H
MFLAG EQU 37H ;時間分標志,判是否到60
個一秒,即一分
MOV DISML,#00H
MOV DISMH,#00H
MOV DISHL,#00H
MOV DISHH,#00H ;顯示分,時的個時位初值
MOV TFLAG,#00H ;時間秒標志初值
MOV SETFLAG,#00H ;設置標志初值
MOV ADDFLAG,#00H ;設數加標志
MOV MFLAG,#00H ;時間分標志
MOV SCON,#00H ;串行口工作于方式0(同
步移位)
MOV TMOD,#00000001B;定時器0工作于方式1
MOV TL0,#0EEH
MOV TH0,#31H ;設定時時間為0.05秒,定
時20次則一秒
SETB EA ;開總中斷
SETB ET0 ;開定時器0中斷允許
SETB EX0 ;開外中斷0允許
93
SETB TR0 ;開定時0運行
SETB IT0 ;外中斷0下降沿觸發
DIS:
ACALL DISPLAY ;調用顯示時鐘程序
AJMP CRITERION ;調判斷程序,按鍵是否按
了。
; ACALL DELAY
; AJMP DIS
DIN0:
PUSH ACC
;設置時是否出錯,比如小時設到超過了23//////////
MOV A,DISHH
CJNE A,#02H,INCC
MOV A,DISHL
CLR C
SUBB A,#04H
JC INCC
MOV SETFLAG,#06H
AJMP RE
;/////////////////////////////////////////////
;是否到一秒///////////////////////////////////
INCC: INC TFLAG
MOV A,TFLAG
CJNE A,#19,RE
MOV TFLAG,#00H
;/////////////////////////////////////////////
;是否到一分///////////////////////////////////
INC MFLAG
94
MOV A,MFLAG
CJNE A,#60,RE
MOV MFLAG,#00H
;/////////////////////////////////////////////
;計分/////////////////////////////////////////
INC DISML
MOV A,DISML
CJNE A,#0AH,RE
MOV DISML,#00H
INC DISMH
MOV A,DISMH
CJNE A,#06H,RE
MOV DISMH,#00H
;/////////////////////////////////////////////
;計時/////////////////////////////////////////
;計時分兩種情況,分為小時的高位到2和沒到2,沒到2時時
低位是逢10進位,到2后,時低位到4則全歸0
MOV A,DISHH
CJNE A,#02H,HJ
;/////////////////////////////////////////////
;第一種情況///////////////////////////////////
INC DISHL
MOV A,DISHL
CJNE A,#04H,RE
MOV DISHL,#00H
MOV DISHH,#00H
AJMP RE
;/////////////////////////////////////////////
95
;第二種情況///////////////////////////////////
HJ: INC DISHL
MOV A,DISHL
CJNE A,#0AH,RE
MOV DISHL,#00H
INC DISHH
;/////////////////////////////////////////////
RE:
MOV TL0,#0EEH
MOV TH0,#31H ;設定時時間為0.02秒,定
時50次則一秒
POP ACC
RETI ;退出中斷
INT:
PUSH ACC
JB P3.2,EXIT
MOV R3,#0FFH
DJNZ R3,$
JB P3.2,EXIT ;判鍵抖
MOV A,SETFLAG
CJNE A,#00H,ADD2
AJMP SETKEY
ADD2: CJNE A,#06H,B0 ;是錯誤了嗎,是的,去恢
復
MOV SETFLAG,#00H
AJMP SETKEY
B0: MOV R4,#15H
ADD1: JB P3.2,SETKEY
96
ACALL DELAY
DJNZ R4,ADD1
MOV ADDFLAG,#01H
AJMP EXIT
;狀態增值/////////////////////////////////////
SETKEY: INC SETFLAG
MOV A,SETFLAG
CJNE A,#05H,EXIT
MOV SETFLAG,#00H
;/////////////////////////////////////////////
EXIT:
POP ACC
RETI
;顯示時鐘/////////////////////////////////////
DISPLAY:
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV A,DISHL
97
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
RET
;/////////////////////////////////////////////
;判按鍵標志///////////////////////////////////
CRITERION:
MOV A,SETFLAG
CJNE A,#00H,ERFLAG ;設置標志為0,即沒
有按鍵,繼續去顯示
AJMP RET1
ERFLAG: CJNE A,#06H,SETML1 ;設置標志為6,即錯
誤了,去顯示錯誤
AJMP ERR
SETML1: CJNE A,#01H,SETMH1
AJMP SETML ;設置標志為1,顯示
設分低
SETMH1: CJNE A,#02H,SETHL1
AJMP SETMH ;設置標志為2,顯示
設分高
98
SETHL1: CJNE A,#03H,SETHH1
AJMP SETHL ;設置標志為3,顯示
設時低
SETHH1: CJNE A,#04H,RET1 ;設置標志為5,是退
出標志
AJMP SETHH ;設置標志為4,顯示
設時高
RET1: SETB TR0
ACALL DELAY
AJMP DIS
;/////////////////////////////////////////////
;設分低(分低位閃爍)/////////////////////////
SETML:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETML2 ;是否按下了2秒鐘,
是就開始閃爍設置
JNB P3.2,ADD3
MOV ADDFLAG,#00H ;松開了,清閃標志
AJMP SETML2
ADD3: INC DISML
MOV A,DISML
CJNE A,#0AH,SETML2
MOV DISML,#00H
SETML2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV SBUF,#00H
99
E1: JNB TI,E1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E2: JNB TI,E2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E3: JNB TI,E3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E4: JNB TI,E4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;設分高(分高位閃爍)////////////////////////////////
SETMH:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETMH2 ;是否按下了2秒鐘,
是就開始閃爍設置
100
JNB P3.2,ADD4
MOV ADDFLAG,#00H ;松開了,清閃標志
AJMP SETMH2
ADD4: INC DISMH
MOV A,DISMH
CJNE A,#0AH,SETMH2
MOV DISMH,#00H
SETMH2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
F1: JNB TI,F1
CLR TI
MOV SBUF,#00H
F2: JNB TI,F2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
F3: JNB TI,F3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
101
MOV SBUF,A
F4: JNB TI,F4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;設時低位(時低位閃爍)////////////////////////////
SETHL:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETHL2 ;是否按下了2秒鐘,
是就開始閃爍設置
JNB P3.2,ADD5
MOV ADDFLAG,#00H ;松開了,清閃標志
AJMP SETHL2
ADD5: INC DISHL
MOV A,DISHL
CJNE A,#0AH,SETHL2
MOV DISHL,#00H
SETHL2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G1: JNB TI,G1
CLR TI
MOV A,DISMH
102
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G2: JNB TI,G2
CLR TI
MOV SBUF,#00H
G3: JNB TI,F3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G4: JNB TI,G4
CLR TI
AJMP C RITERION
;//////////////////////////////////////////////////
;設時高位(時高位閃爍)////////////////////////////
SETHH:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETHH2 ;是否按下了2秒鐘,
是就開始閃爍設置
JNB P3.2,ADD6
MOV ADDFLAG,#00H ;松開了,清閃標志
AJMP SETHH2
ADD6: INC DISHH
MOV A,DISHH
CJNE A,#03H,SETHH2
103
MOV DISHH,#00H
SETHH2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H1: JNB TI,H1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H2: JNB TI,H2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H3: JNB TI,H3
CLR TI
MOV SBUF,#00H
H4: JNB TI,H4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;錯誤顯示//////////////////////////////////////////
104
ERR: CLR TR0
ACALL DELAY2
MOV SBUF,#0EAH
I1: JNB TI,I1
CLR TI
MOV SBUF,#0EAH
I2: JNB TI,I2
CLR TI
MOV SBUF,#9EH
I3: JNB TI,I3
CLR TI
MOV SBUF,#00H
I4: JNB TI,I4
CLR TI
AJMP CRITERION
;延時/////////////////////////////////////////
DELAY:
MOV R1,#100
DE: MOV R2,#100
DJNZ R2,$
DJNZ R1,DE
RET
;//////////////////////////////////////////////////
DELAY1:
MOV R1,#0FFH
DE1: MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,DE1
105
RET
DELAY2: MOV 38H,#02H
DE3: MOV R2,#0FFH
DE2: MOV R1,#0FFH
DJNZ R1,$
DJNZ R2,DE2
DJNZ 38H,DE3
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;數顯代碼
END
12.2 智能紅外工業控制器
程序介紹:這個產品是通過遙控器控制定時時間來決
定P1.0口輸出高電平和低電平的時間,在P1.0口接一個繼
電器后,從而控制電磁閥開和關,以達到對石油含水量的
定時智能排放。現已應用在上海金山煉油廠,反映良好。
本實驗儀完全模擬了這個產品,它的詳細操作請參照附一
(以用于上海金山煉油廠的產品說明)。
程序實例(honwai.asm):
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP DIN0 ;TIME
ORG 00013H
AJMP INT
106
MAIN:
;DATA DEFINE////////////////////////////////////////
ON_MINUTE_LOW EQU 30H
ON_MINUTE_HIGH EQU 31H
ON_HOUR_LOW EQU 32H
ON_HOUR_HIGH EQU 33H
OFF_MINUTE_LOW EQU 34H
OFF_MINUTE_HIGH EQU 35H
OFF_HOUR_LOW EQU 36H
OFF_HOUR_HIGH EQU 37H
DIS_MINUTE_LOW EQU 38H
DIS_MINUTE_HIGH EQU 39H
DIS_HOUR_LOW EQU 40H
DIS_HOUR_HIGH EQU 41H
TI
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -