📄 1527.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中断接收EV1527的程序,单片机选用89C2051
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLOW EQU 20H
CHIGH EQU 21H
CDATA EQU 22H
DATA1_1 EQU 23H ;数据储存寄存器
DATA1_2 EQU 24H
DATA1_3 EQU 25H
FLAGS_RF EQU 26H ;信号接收标志位寄存器
RF_P EQU P3.2 ;高频信号接收口
HEAD_OK EQU FLAGS_RF.0 ;同步信号接收成功标志位,1为成功0为失败
SIGANLHL EQU FLAGS_RF.1 ;信号高低标志位
SIGNAL_OK EQU FLAGS_RF.2 ;信号接收ok标志位
KEY_S EQU 2FH
KEY_V EQU 2EH
K1 BIT P3.7
ORG 00H
AJMP start
ORG 00BH
AJMP IT0P
ORG 30H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 主程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start: MOV P1,#0FFH ;关闭所有灯
MOV R0,#00H
MOV TMOD,#02H ;
MOV TH0,#9bH ;这是晶振为12M的定时中断
MOV TL0,#9bH
SETB EA ;启动总中断
SETB ET0 ;设定定时中断0
SETB TR0 ;开启中断
MOV KEY_V,#80H ;按键设置初始值
start1:LCALL KEY
JB 25H.0,KK1
AJMP start1
KK1: MOV P1,#7FH
jb 25h.1,kk2
AJMP start1
kk2: mov p1,#0bfh
jb 25h.2,kk3
ajmp start1
kk3: mov p1,#6fh
jb 25h.3,kk4
ajmp start1
kk4: mov p1,#0efh
ajmp start1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中断子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IT0P: PUSH ACC
PUSH PSW
JB RF_P,SIGNAL_H ;检测信号接收端是否为一,
;是则跳转到数居高处理程序,否则则继续
SIGNAL_L:
JB SIGANLHL,gaoqing ;检测数据低位是否为1高低电位标志?
Lowsignalcounterincrease:
INC CLOW ;计时低电位时间
JNB HEAD_OK,IT0P_EXIT1 ;同步信号接收成功?
MOV A,CLOW
SUBB A,#18H ;2.0MS 17
JNC jieshoucuo ;检测c位是否为零,是则表示接收错误
AJMP zdtuichu
gaoqing: ;高标志清除
CLR SIGANLHL
MOV CLOW,#00H
AJMP zdtuichu
;=================================================
SIGNAL_H:
JB SIGANLHL,Highsignalcounterincreasc ;测试信号高低标志位是否为高电位
catchsynchronization:
jb HEAD_OK,Signalanalysis
mov A,CLOW
subb A,#95H ;
jnc checkdataeffective
mov C,CLOW
subb A,#14H ;2.4MS
jc checkdataeffective
setb HEAD_OK ;设同步信号成功标志
setb SIGANLHL
MOV CDATA,#18H ;接收信号的位数
IT0P_EXIT1:
ajmp zdtuichu ;退出中断
Signalanalysis:
MOV A,CHIGH ;信号的分辩
SUBB A,#08H ;07
JC L_datazerosignal
MOV A,CHIGH
SUBB A,#18H
JNC checkdataeffective
L_dataonesignal:
MOV A,CHIGH
SUBB A,#08H ;08
JC checkdataeffective
dataonesignal: ;信号数据为1
SETB C
AJMP addonesignal
L_datazerosignal:
MOV A,CHIGH
SUBB A,#01H
JC checkdataeffective
datazerosignal: ;信号数据为0
CLR C
addonesignal:
MOV A,DATA1_1 ;存储数据
RLC A
MOV DATA1_1,A
MOV A,DATA1_2
RLC A
MOV DATA1_2,A
MOV A,DATA1_3
RLC A
MOV DATA1_3,A
DJNZ CDATA,reselighsignalcounter
SETB SIGNAL_OK ;设接收成功标志
CLR HEAD_OK
AJMP IT0P_EXIT2
reselighsignalcounter:
setb SIGANLHL ;复位
mov CHIGH,#00H
ajmp zdtuichu ;中断退出
Highsignalcounterincreasc:
INC CHIGH
AJMP zdtuichu ;中断退出
checkdataeffective:
SETB SIGANLHL
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;接收信号错误程序;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
jieshoucuo:
clr SIGNAL_OK ;接收信号错误
CLR HEAD_OK
MOV DATA1_1,#00H
MOV DATA1_2,#00H
MOV DATA1_3,#00H
IT0P_EXIT2:
MOV CHIGH,#00H ;清除返回
MOV CLOW,#00H
MOV CDATA,#00H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;中断退出;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
zdtuichu:
POP PSW
POP ACC
RETI ;中断返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 按键扫描处理程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY: LCALL KEY_CHKSW ;调用按键扫描处理程序'有键按下R0加一
MOV A,R0
MOV R1,A
CJNE R1,#03H,KEY1 ;对码按键次数比较,按建按四次确认对码
MOV R3,#05H ;对码LED闪烁次数符值
start2:LCALL DESHAN
mov R0,#00h ;重置按键次数
KEY1: RET
KEY_CHKSW:ACALL SCAN_KEY
MOV KEY_S,A
XRL A,KEY_V
JZ KEY_CHKSW1
MOV R7,#10
LCALL DELAYMS
MOV KEY_V,KEY_S
LCALL PROC_KEY ;
KEY_CHKSW1:RET
;jiema: SETB TR0
; ajmp JJ
;===============================================================================
; 扫描按键
; 返回值:A --- 按键状态
SCAN_KEY:CLR A
MOV C,K1
MOV ACC.7,C
RET
;===============================================================================
PROC_KEY:
; 按键处理子程序
; 传入参数: KEY_V --- 按键值
MOV A,KEY_V
JNB ACC.0,PROC_K1
RET
PROC_K1: ; 按键K1处理程序
JB P3.7,PROC_K11
INC R0
PROC_K11:RET
;===============================================================================
DELAYMS:
; 延时子程序
MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:RET
DESHAN:CLR P3.5
ACALL DELAY
SETB P3.5
ACALL DELAY
DJNZ R3,DESHAN
RET
DELAY: MOV R4,#0FFH
DELAY1:MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DELAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -