您的位置:控制工程论坛网论坛 » 教程与手册 » 定时做的遥控汇编程序

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

定时做的遥控汇编程序

xilinxue  发表于 2008/11/7 13:25:38      878 查看 1 回复  [上一主题]  [下一主题]

手机阅读

REM_SIGN        EQU   5AH        ;      
REM_FIX         EQU   5BH        ;
REM_KEY         EQU   5DH        ;
REM_KEY1        EQU   5EH        ;
REM_TIME        EQU   5FH        ;
TIME1           EQU   71H        ;主循环执行时间
TIME2           EQU   72H        ;显示缓冲区数据处理间隔时间
ORG    00H
JMP    MAIN
ORG    0003H
JMP    INT0 
ORG    000BH
JMP    TIME                

MAIN:    
          MOV   SP,#10H             ;10H-24H共20个单元作为堆栈
          MOV   PSW,#10H      
          MOV   TMOD,#01H
          SETB  IT0                 ;外部中断0为边沿触发方式
          SETB  EA
          SETB  ET0
          SETB  EX0
MAIN1:    AJMP  MAIN1
         
TIME   : PUSH   ACC
         PUSH   PSW
        
         MOV    PSW,    #00H
         MOV    A, REM_SIGN
         CJNE   A,#03H,EXIT1      ;不是连发的定时溢出标记清0
         INC    R1                ;执行一次遥控按键处理后,T0延事超过60ms,R1+1
         INC    R2                ;T0中断次数存储单元,当T0中断3次(每次60ms),本次遥控结束         
         MOV    A,R2
         SUBB   A,#3              ;判断在250ms内有无连发码出现
         JNC    EXIT0             ;无则清0
         MOV    TH0,#15H          ;定时值60MS
         MOV    TL0,#0A0H
         SETB   TR0
         JMP    EXIT2
EXIT0:   CLR    TR0          
         MOV    R2,#00H
EXIT1:   MOV    REM_SIGN,#00H
EXIT2:   POP    PSW
         POP    ACC
         RETI
         NOP
         NOP

INT0:
         PUSH       ACC
         PUSH       PSW
         MOV        PSW,        #08H                ;使用另一组寄存器
         MOV   R2,#00H
         CLR   TR0
         CLR   EX0
         MOV   R5,REM_SIGN
         CJNE  R5,#00H,INT_2       ;初始化原始数据
         MOV   R0,#REM_FIX         ;遥控数据接收的首址
         MOV   R1,#0               ;
         MOV   R2,#0               ;R2是连发溢出标记,当T0延时60ms*3后仍未检测到有遥控中断,本次遥控结束
         MOV   R3,#8               ;每个字节的位数
         MOV   R6,#0               ;数据对比单元
         MOV   R7,#4               ;要接收的字节数

         MOV   REM_SIGN,#01H       ;建立标记01                           
         JMP   INT_OFF
INT_2:   CJNE  R5,#01H,INT_3       ;起始码和结果码的判断
         MOV   A,#30H              ;
         MOV   R6,TH0
         SUBB  A,R6 
         JNC   ERR_OUT             ;启动码+结果码<12.55ms退出(忽略TL0的值)
         MOV   A,#039H
         SUBB  A,R6 
         JC    ERR_OUT             ;启动码+结果码〉14.6ms推出(忽略TL0的值)
         MOV   REM_SIGN,#02H       ;建立标记02                                 
         JMP   INT_OFF
INT_3:   CJNE  R5,#02H,INT_4       ;(old key_out)
         MOV   A,#03H
         MOV   R6,TH0            
         SUBB  A,R6                ;R6内存TH0的值
         JNC   ERR_OUT             ;周期<1ms退出
         MOV   A,#0BH
         SUBB  A,R6
         JC    ERR_OUT             ;周期>2.69ms退出   
         MOV   A,#6H               ;输入检测周期1.6ms用来判断1或0
         SUBB  A,R6                ;     
         MOV   A,@R0               ;
         RRC   A                   ;存入一位数值
         MOV   @R0,A
         DJNZ  R3,INT_OFF                      
INT_3_1 :INC   R0
         MOV   R3,#08H
         DJNZ  R7,INT_OFF        
         MOV   A,REM_KEY1              
         CPL   A
         CJNE  A,REM_KEY,ERR_OUT   ;正反码比较,错则退        
         MOV   REM_TIME,#8         ;
;----------------------------------------------------------                   
INT_4: ; 
;----------------------------------------------------------
 KY_OUT: MOV   A,REM_SIGN
         CJNE  A,#3,ODD            ;判断遥控是出于第一次按键触发还是处于连发阶段,连发阶段的标记是REM_SIG=3
         MOV   A,R1                ;连发最小时间判断,过滤掉<60ms的脉冲,因<60ms的脉冲不会令T0溢出
         JZ    NORUN
 ODD  :  INC   REM_TIME            ;每连发一次连发记忆单元+1
 NORUN:  MOV   A,REM_TIME          ;因为跳过上一步IREM_TIME+1,所以不会执行BIJIAO(不够减)
         SUBB  A,#5                ;连发5次调用一次按键处理程序
         JNC   GO_0
         JMP   GO_1
GO_0:    MOV   REM_TIME,#00H       ;每调用一次按键处理子程序连发记忆单元清0
         JMP   BIJIAO2
BI_RET:  MOV   R1,#00
         MOV   REM_SIGN,#03H       ;执行一次按键处理后建立遥控标记#03
GO_1:    SETB  TR0
         JMP   INT_OFF1                 
ERR_OUT: MOV   REM_SIGN,#00H       ;报错标记清0 
         LJMP  INT_OFF1            ;报错返回不启动定时器 
INT_OFF: SETB  TR0
        
INT_OFF1:MOV   TH0,#00H
         MOV   TL0,#00H
         SETB  EX0 
  ;       MOV   DPL,MTD5
     ;    MOV   DPH,MTD4
    ;     MOV   PSW,MTD3
    ;     MOV   A,MTD2
    POP         PSW
    POP         ACC
         MOV   R4,#0
         MOV   R5,#0               ;确定遥控结束后的参数复位时间
         RETI
         NOP
         NOP
BIJIAO2: NOP
         AJMP   MAIN
END

 

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2008/11/7 13:25:38

      占用的资源少,运行效率高,但是,它的可移植性很差,看明白也比较难,希望有不明白的朋友在后面跟贴子,把你的不明白的地方说出来,或者把我程序里面的不好的地方说出来,我很期待与大家交流的
    2楼 回复本楼

    引用 xilinxue 2008/11/7 13:25:38 发表于2楼的内容

总共 , 当前 /