⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 红学习.asm

📁 带总线通讯学习功能的红外线遥控器程序.可应用于各种学习性读发码装置.
💻 ASM
字号:
;可用,版本3 ,能接收长码
;2001.10.20
;
;
;******************************************

;************红外线接收程序******************

;*********************************************
;器件地址
EEPROM          EQU       0A0H
;MODE            EQU       070H           ;高四位0111,是红外线设备型号
                                          ;低四位    ,是红外线设备的地址


;R2,R3   是延时计数器
;R4  :脉冲电平宽度计时器,算法,计数26次(也就是26US)R4加1
;R5  :脉冲个数计数器
;内存数据定义
SP_STATR        EQU       01H
SP_END          EQU       00H
ACK             BIT       08H           ;接收数据非应答标志
BITCNT          DATA      15H           ;IIC数据计数器           ;SADDP:类型+地址
BYTECNT         DATA      16H           ;IIC数据字节计数器       ;SCISTEP:串行通信进程
SLVADR          DATA      14H           ;被控器地址,EEPROM的地址 ;SCILEN:后4位数据长度(几个字节)
SUBADR          DATA      17H           ;被控器单元地址          ;SCICOM:前4位是命令
RCVDAT          DATA      18H           ;接收数据缓冲区          ;CRC   :校验寄存器
XMTDAT          DATA      19H           ;发送数据缓冲区          ;SCODE :校验寄存器
CYCLE           DATA      22H           ;循环计数器              ;RBUFSP:接收缓冲区指针
DAT             DATA      21H           ;脉冲个数计数器          ;SCISP :发送数据缓冲区指针
STU             DATA      20H           ;学习过的置0,没有学习过的置1
ER              DATA      13H           ;出错标志位,为0则出错,为1则是正确
MODE            DATA      09H           ;高四位0111,是红外线设备型号
                                        ;低四位    ,是红外线设备的地址

;端口位定义
IN              BIT       P1.4; P0.0           ;红外线接收位
BZ              BIT       P0.5           ;蜂鸣器输出位
OUT             BIT       P1.7           ;红外线发射位
WP              BIT       P0.0;P1.4           ;写保护,为0时可读写,为1时不能写
SDA             BIT       P1.3           ;模拟IIC数据传送位
SCL             BIT       P1.2           ;模拟IIC时钟控制状态标志

LED             BIT       P0.7            ;
RECE            BIT       P0.6           ;串口接收发送位

                ORG       0000H
                AJMP      MAIN
                ORG       000BH          ;定时器TO0中断入口地址
                AJMP      LOPP
                ORG       0023H
                AJMP      SINT           ;串口中断入口地址
                ORG       063H

;***************主程序******************************

MAIN:
               MOV        STU,#00H
               MOV        SP,#0AH
               MOV        P0M2,#080h
               CLR        LED
               MOV        DAT,#00H         ;脉冲个数计数器清0
               MOV        TMOD,#022H       ;设置定时器0和1为方式2,定时控制方式,以运行控制位TR0,TR1启动定时器
               MOV        TH0,#00H         ;加载计数初值
               MOV        TL0,#00H         ;保存计术数值,计时
               MOV        TH1,#0FAH
               MOV        TL1,#0FAH        ;波特率为4800
               MOV	  SADEN,#0FFH
               MOV	  SCON,#0F0H       ;串口工作方式3,多机通信控制,允许接收
               MOV        TCON,#040H       ;启动T1定时
               MOV        PCON,#00H        ;波特率加倍
               MOV        IEN0,#092H       ;允许定时T0中断,
                                           ;中断总充许
                                           ;允许串行中断

               MOV         WDCON,#017H
             ; MOV        MODE,#70H        ;高四位0111,是红外线设备型号
                                           ;低四位    ,是红外线设备的地址
               LCALL       GETADDR         ;调用,检查地址子程式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               MOV        PT0AD,#010H      ;禁止CIN1A(P0.4) 的数字输入功能
               ANL        P0M2,#0EFH       ;CIN1A(P0.4)仅为输入功能
               ORL        P0M1,#010H
               MOV        CMP1,#028H       ;正向输入为CIN1A
                                           ;选择内部1.23V作为参考电压
                                           ;比较结果输出到中断
             ; SETB       EC1              ;打开中比较器1中断

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               SETB        WP              ;禁止写EEPROM
               SETB        TR1             ;启动串行中断,启动TR1定时
               MOV         ER,#00H
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;
              LCALL       LOP
              AJMP        MAIN
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;;

AFFL:
              JBC        B.7,AFFL1         ;中断返回时,接受命令正确,则调用命令处理程式
              MOV        WDRST,#01EH
              MOV        WDRST,#0E1H
              AJMP       AFFL              ;等待中断

;********************命令处理************************************************
;主机命令: 第1个字节(前4位是设备娄型,后4位是设备地址)
;          第2个字节(前4位是命令,后4位是数据字节数)
;          第3~N个字节(EEPROM的地址)
;          最后一位是CRC
;接收前四位命令: 0111  7   是查询设备状态
;                0101  5   是学习红外线指令命令
;                0110  6   是发送红外线指令命令
;从机应答:
;发射前4位命令:  0111  7   命令已接受
;                0101  5   红外码学习正确
;                0000      红外码学习错或超时
;接收后四位数据长度为1个字节0001
;数据字节:为学习或发送的按键值(就是EEPROM 的地址)
;设备娄型,地址是01000000


AFFL1:
              CLR         LED
              CLR         ES                ;串行中断关闭
              CLR         TR1
              MOV         R5, SUBADR

;********************判断红外线码学习还是发射**********************************

                                            ;取得EEPROM的高低字节地址
              MOV         A,22H             ;把数据中的按键值入A
              CJNE        A,#04H,ORDER1     ;判断是错误码,还是正常按键值
              AJMP        TTMM              ;命令=4,则转发送红外码子程序
ORDER1:
              JNC         TTM3              ;命令大于4,则置错误标志返回等待中断
              JC          TTMM              ;命令小于4, 则顺继执行
TTMM:
              MOV         B,#60H            ;把96放入乘数B中
              MUL         AB                ;把接收到的键码乘以96,取得学习码EEPROM
                                            ;的按键地址
              MOV         SUBADR,A          ;把乘积的低字节入EEPROM的低字节地址
              MOV         A,B               ;把B 存A中
              RL          A                 ;把乘积的高字节左移一位
              MOV         SLVADR,#EEPROM
              MOV         B,SLVADR
              ADD         A,B               ;把乘积的高字节与EEPROM的芯片地址相加
              MOV         SLVADR,A          ;后放入高字节
              CLR         F0                ;清出错标志
              MOV         A,R5              ;命令前四位入A
              CJNE        A,#05H,ORDER      ;是学习红外码和发射码吗?不是置错误标记
              AJMP        TTM1              ;
ORDER:
              CJNE        A,#06H,TTM3       ;是学习红外码吗?
TTMM1:
              LCALL       LOP               ;SUBADR=0则调用学习红外码子程序
              AJMP        TTM2
TTM1:
              LCALL       LDD               ;调用红外线发射子程式
TTM2:
              JB          F0,TTM3           ;调用子程序出错,置错误标记
              SETB        ES                ;打开串行中断
              SETB        TR1
              MOV         ER,#05H           ;调用子程式正确,则置正确标记
              AJMP        AFFL              ;返回等待中断
TTM3:
              MOV         ER,#00H
              SETB        ES                ;串行中断打开
              SETB        TR1
              CLR         LED
              AJMP        AFFL              ;出错返回等待中断
;***********************************************************************
;                红外线接收存EEPROM程序
;***********************************************************************
LOP:
               SETB       TR0               ;为零时,启动T0计数
               MOV        R0,#CYCLE
               MOV        R4,#00H
               MOV        R2,#00H
               MOV        R3,#00H
               MOV        TL0,#00H
               MOV        TH0,#00H

LOPAQ:
               JNB        IN,LOPAQ1         ;接收红外起始码,为0时转LOPAQ1,启动接收
               CJNE       R4,#0FFH,LOPAQ    ;1分钟之内没有接收红外起始码, 则出错
               MOV        WDRST,#1EH
               MOV        WDRST,#0E1H
               MOV        R4,#00H
               INC        R2
               CJNE       R2,#08H,LOPAQ
               MOV        R2,#00H
               MOV        WDRST,#1EH
               MOV        WDRST,#0E1H
               INC        R3
               CPL        LED
               CJNE       R3,#7EH,LOPAQ
               MOV        WDRST,#01EH
               MOV        WDRST,#0E1H
               SETB       F0
               CLR	  LED
               CLR        B.7
               RET
;********************开始接收红外码****************************
LOPAQ1:
               CLR	  LED
               MOV        DAT,#00H
               MOV        R0,#CYCLE
               MOV        R4,#00H         ;计数清0
               MOV        TH0,#0CBH       ;加载计数初值
               MOV        TL0,#0CBH       ;保存计术数值,每52秒中断一次


LPP:
               CJNE       R4,#0FEH,LPPAA
               AJMP       RETURN1
LPPAA:
               JNB        IN,LPP          ;红外线输入为高则转移LBB,为0时转LPP

LBB:
               MOV        TL0,#0CBH       ;保存计术数值
               INC        R4
               MOV        A,R4
               MOV        @R0,A           ;把脉冲低电平宽度计时时间入寄存器

               MOV        R4,#00H         ;计数清0
               INC        SP_END          ;R0+1->R0,地址加1
               INC        DAT             ;R5+1>R5

LBB1:
               CJNE       R4,#0FEH,LBB12
               AJMP       RETURN1
LBB12:
               JB         IN,LBB1         ;红外线输入为高,则继续计时转LBB1,为0时转LCC,
                                          ;计时高电平的时间
;*********此处开始计时中断改为每26微秒中断一次*******************

LCC:
               MOV        TH0,#0E5H       ;加载计数初值
LCC1:
               MOV        TL0,#0E5H       ;保存计术数值,每26秒中断一次
               INC        R4
               MOV        A,R4
               MOV        @R0,A           ;把脉冲高 电平宽度计时时间入寄存器
               MOV        R4,#00H         ;计数清0
              ; INC        SP_END         ;R0+1-》R0
               INC        DAT             ;R5+1->R5
               MOV        A,DAT
               CJNE       A,#0FFH,LCCH
               INC        SP_STATR


LCCH:
               CJNE       R4,#0FEH,LCCH1AA
               AJMP       RETURN1
LCCH1AA:
               JNB        IN,LCCH          ;红外线输入还是为低,则继续计时
                                           ;计低电平的时间
               MOV        TL0,#0E5H        ;保存计术数值
               INC        R4
               MOV        A,R4
               MOV        @R0,A            ;把脉冲低电平宽度计时时间入寄存器
               MOV        R4,#00H          ;计数清0
               ;INC        SP_END          ;R0+1->R0,地址加1
               INC        DAT              ;R5+1->R5
               MOV        A,DAT
               CJNE       A,#0FFH,LCCH1
               INC        SP_STATR

LCCH1:
               JNB        IN,LCC1             ;红外线输入还是为高,则继续计时

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -