?? sybcscx.asm
字號:
;***************************************************************************
;* 實驗板測試程序。 *
;* Support telephone: (www.gg-dl.com )
;*
;*
;*
;*
;***************************************************************************
ORG 0000H
AJMP MAIN;轉入主程序
ORG 0013H ;0013H;0003H;外部中斷P3.3腳INT0入口地址 ;INT1
AJMP INT;轉入外部中斷服務子程序(紅外遙控解碼程序)
;以下為主程序進行CPU中斷方式設置
;;
MAIN:;LCALL YS3;等待硬件上電穩(wěn)定
SETB EA;打開CPU總中斷請求
SETB IT1;IT1;設定INT1的觸發(fā)方式為脈沖負邊沿觸發(fā)
SETB EX1;EX1;打開INT1中斷請求
MOV SCON,#50H;設置成串口1方式
MOV TMOD,#20H;波特率發(fā)生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍為2400x2=4800BPS
MOV TH1,#0F3H;預置初值(按照波特率2400BPS預置初值)
MOV TL1,#0F3H;預置初值(按照波特率2400BPS預置初值)
SETB TR1;啟動定時器T1
;以上完成串口通訊初始化設置
START:; CLR P3.4;
SETB P2.1 ;CLOSE MOTOR
MOV P1,#01111111B
LCALL DELAY
MOV P1,#10111111B
LCALL DELAY
MOV P1,#11011111B
LCALL DELAY
MOV P1,#11101111B
LCALL DELAY
MOV P1,#11110111B
LCALL DELAY
MOV P1,#11111011B
LCALL DELAY
MOV P1,#11111101B
LCALL DELAY
;MOV P1,#00
MOV P1,#11111110B;P1口的LED循環(huán)由下往上點亮一次,延時約250毫秒
LCALL DELAY
CLR P2.3 ;MOV P2,#11011111B;蜂鳴器鳴響一聲
LCALL DELAY
SETB P2.3
CLR P2.0 ;MOV P2,#11101111B;繼電器J1吸合一次
CLR P2.1 ;OPEN MOTOR
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB P2.0
SETB P2.1 ;CLOSE MOTOR
LCALL DELAY
MOV P0,#0FFH
MOV P2,#11101111B;數(shù)碼管個位顯示8
LCALL DELAY
MOV P2,#11011111B;數(shù)碼管十位顯示8
LCALL DELAY
MOV P2,#10111111B;數(shù)碼管百個位顯示8
LCALL DELAY
MOV P2,#01111111B;數(shù)碼管千位顯示8
LCALL DELAY
LJMP START
;以下為進入P3.3腳外部中斷子程序,也就是解碼程序,紅外接收接口
INT: CLR EA;暫時關閉CPU的所有中斷請求
MOV R6,#10
SB: ACALL YS1;調用882微秒延時子程序
JB P3.3,EXIT;P3.3;延時882微秒后判斷P3.3腳是否出現(xiàn)高電平如果有就退出解碼程序 P3.3
DJNZ R6, SB;重復10次,目的是檢測在8820微秒內如果出現(xiàn)高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB P3.3, $;等待高電平避開9毫秒低電平引導脈沖.P3.3
ACALL YS2;延時4.74毫秒避開4.5毫秒的結果碼
MOV R7,#26;忽略前26位系統(tǒng)識別碼
JJJJA:JNB P3.3,$;等待地址碼第一位的高電平信號
LCALL YS1;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態(tài)
MOV C,P3.3;將P3.3引腳此時的電平狀態(tài)0或1存入C中
JNC UUUA;如果為0就跳轉到UUUA
LCALL YS3;檢測到高電平1的話延時1毫秒等待脈沖高電平結束
UUUA: DJNZ R7,JJJJA
MOV R1,#1AH ;設定1AH為起始RAM區(qū)
MOV R2,#2;接收從1AH到1BH的2個內存,用于存放操作碼和操作反碼
PP: MOV R3,#8;每組數(shù)據(jù)為8位
JJJJ: JNB P3.3,$;等待地址碼第一位的高電平信號
LCALL YS1;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態(tài)
MOV C,P3.3;將P3.3引腳此時的電平狀態(tài)0或1存入C中
JNC UUU;如果為0就跳轉到UUU
LCALL YS3;檢測到高電平1的話延時1毫秒等待脈沖高電平結束
UUU: MOV A,@R1;將R1中地址的給A
RRC A;將C中的值0或1移入A中的最低位
MOV @R1,A;將A中的數(shù)暫時存放在R1數(shù)值的內存中
DJNZ R3,JJJJ;接收滿8位換一個內存
INC R1;對R1中的值加1,換下一個RAM
DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
MOV A,1AH
CPL A;對1AH取反后和1BH比較
CJNE A,1BH,EXIT;如果不等表示接收數(shù)據(jù)發(fā)生錯誤,放棄
MOV P1,1AH;將按鍵的鍵值通過P1口的8個LED顯示出來!
MOV A,1AH;將紅外遙控器具體按鍵的鍵值發(fā)送到串口去
MOV SBUF,A;通過串口在電腦屏幕上顯示出來
CLR P2.3 ;蜂鳴器鳴響嘀嘀嘀的聲音,表示解碼成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P2.3 ;蜂鳴器停止
EXIT: SETB EA ;允許中斷
RETI ;退出解碼子程序
YS1: MOV R4,#20 ;(占用R4/R5)延時子程序1,精確延時882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;(占用R4/R5)延時子程序2,精確延時4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;(占用R4/R5)延時程序3,精確延時1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
;1毫秒延時子程序
DELY1:MOV R4,#2
DL1:MOV R5,#248
DJNZ R5,$
DJNZ R4,DL1
RET
;10毫秒延時子程序
DELAY10:MOV R4,#20
DL2:MOV R5,#248
DJNZ R5,$
DJNZ R4,DL2
RET
DELAY:MOV R1,#04H; 08H;(占用R1/R2/R3)延時子程序,12M晶振延時約250毫秒
L3: MOV R2 ,#0FAH
L1: MOV R3 ,#0FAH
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R1 ,L3
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -