您的位置:首页单片机其他单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

多机红外通信接收端(汇编程序代码)

[日期:2007-12-30 ] [来源:周立功 作者:] [字体: (投递新闻)

/***************************************************************+
*文件名: Receive.asm
*版权:  www.zlgmcu.com
*日期:  16:27 04-3-16
*功能:  多机红外通信接收端程序代码
****************************************************************/
$NOMOD51
$INCLUDE (REG932.INC)

INFR  EQU P0.4   ;定义红外接收端口
MOTOR_CONTROL EQU P0.5   ;定义外部设备控制端口

HEADFLAG BIT 0x10   ;定义帧头出错标志
BITFLAG  BIT 0x11   ;定义位出错标志
DATA1  DATA 0x30   ;定义DATA1全局变量
DATA2  DATA 0x31   ;定义DATA2全局变量
;-------------------------------------
 ORG 0000H
 AJMP MAIN
 ORG 003BH
 AJMP KEY_ISR
;-------------------------------------
 ORG 0080H
MAIN:
 MOV P0M1,#0x00   ;定义P0口模式
 MOV P0M2,#0x00

 ACALL KEYISR_INIT   ;调用按键中断初始化程序
 ACALL DELAY100US
LOOP:
 ACALL POWER_DOWN   ;调用完全掉电程序
 AJMP LOOP
 RET
;-------------------------------------
;功能:键盘中断初始化
;-------------------------------------
KEYISR_INIT:
 MOV KBMASK,#0x10   ;P04键盘中断
 MOV KBCON,#0x00   ;清键盘中断标志位
 SETB EKBI    ;键盘中断使能
 SETB EA    ;开中断
 RET
;-------------------------------------
;功能:完全掉电
;-------------------------------------
POWER_DOWN:
 MOV PCONA,#0xFF   ;功能模块掉电
 MOV PCON,#0x03   ;进入完全掉电状态
 RET
;-------------------------------------
;功能:帧校验
;-------------------------------------
READHEAD:
 MOV A,#4    
 ACALL DELAY_N00US   ;延时400us
 JNB INFR,SKIP1   ;INFR为0,跳至SKIP1
 SETB HEADFLAG   ;INFR为1,置帧错误标志
SKIP1:
 ACALL DELAY100US   ;延时100us
 JNB INFR,SKIP2   ;再次读INFR,并对其进行判断,其为0,跳
 SETB HEADFLAG   ;为1,置帧错误标志
SKIP2:
 MOV A,#5
 ACALL DELAY_N00US   ;延时500us

 MOV A,#4
 ACALL DELAY_N00US   ;延时400us
 JB INFR,SKIP3   ;INFR为1,跳至SKIP3
 SETB HEADFLAG   ;INFR为0,置帧错误标志
SKIP3:
 ACALL DELAY100US   ;延时100us
 JB INFR,SKIP4   ;再次读INFR,并对其进行判断,其为1,跳
 SETB HEADFLAG   ;为0,置帧错误标志
SKIP4:
 MOV A,#5
 ACALL DELAY_N00US 
 
 MOV A,#4    
 ACALL DELAY_N00US   ;延时400us
 JNB INFR,SKIP5   ;INFR为0,跳至SKIP5
 SETB HEADFLAG   ;INFR为1,置帧错误标志
SKIP5:
 ACALL DELAY100US   ;延时100us
 JNB INFR,SKIP6   ;再次读INFR,并对其进行判断,其为0,跳
 SETB HEADFLAG   ;为1,置帧错误标志
SKIP6:
 MOV A,#5
 ACALL DELAY_N00US   ;延时500us
 RET
;-------------------------------------
;功能:从红外线传送的数据上读取1字节
;出口参数:A
;-------------------------------------
READBYTE:
 CLR A    ;将A清0
 MOV R7,#8    ;定义循环次数8
READBYTE_START: 
 ACALL DELAY100US   ;延时100US
 JB INFR,BIT1   ;读INFR,为1,则跳至BIT1
BIT0: ANL A,#0xEF    ;为0,清最高位为0
 JMP READBIT_OVER 
BIT1: ORL A,#0x80    ;为1,置最高位为1
READBIT_OVER:
 RL A    ;左移1位
 
 MOV R4,A    ;保存A
 MOV A,#4
 ACALL DELAY_N00US   ;延时400us
 MOV A,R4    ;还原A
 DJNZ R7,READBYTE_START  
 RET
;-------------------------------------
;功能:读取接收到的红外数据
;出口参数:DATA1,DATA2
;-------------------------------------
READDATA:
 ACALL READBYTE   ;读取一字节
 MOV DATA1,A    ;存入DATA1
 ACALL READBYTE   ;读取一字节
 MOV DATA2,A    ;存如DATA2
 RET
;-------------------------------------
;功能:延时100US
;注:在7.373Mhz情况下
;-------------------------------------
DELAY100US:
 MOV R7,#182
LOOP1:
 DJNZ R7,LOOP1 
 RET
;-------------------------------------
;功能:延时N x 100us,
;入口参数:A
;-------------------------------------
DELAY_N00US:
 MOV R5,A
LOOP_N00US:
 ACALL DELAY100US
 DJNZ R5,LOOP_N00US
 RET
;-------------------------------------
;功能:MS级延时
;入口参数:A
;-------------------------------------
DELAYMS:
 MOV R3,A
LOOPMS1:
 MOV R4,#10
LOOPMS2:
 ACALL DELAY100US
 DJNZ R4,LOOPMS2
 DJNZ R3,LOOPMS1
 RET
;-------------------------------------
;功能:键盘中断服务程序
;-------------------------------------
KEY_ISR:
 CLR EA    ;关中断
 MOV PCONA,#0x00   ;外部功能模块上电
 JNB INFR,$    ;读取INFR,等待其为1,
 MOV A,#5
 ACALL DELAYMS    ;延时5ms
 
 JB INFR,$    ;等待INFr为0
 ACALL READHEAD   ;帧头校验
 ACALL READDATA   ;读数据
 
 MOV A,DATA1    
 CJNE A,#0x01,NONE_CONTROL  ;判断数据,
 SETB MOTOR_CONTROL   ;为1,则开外部设备(灯)
 /*
 MOV A,DATA2
 CJNE A,#0x02,NONE_CONTROL  ;判断数据,
 SETB MOTOR_CONTROL   ;为2,则开外部设备(灯)
 */
NONE_CONTROL:
 
 MOV KBCON,#0x00   ;清键盘中断标志
 SETB EA    ;开中断
 RETI
;-------------------------------------
 END
;-------------------------------------

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告