专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

学习型红外遥控器汇编语言程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年04月19日   【字体:

;可用,版本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程序
;***********************************************************************

由于程序太大,帖子无法全部贴出 请点这里下载程序的完整版本: http://www.51hei.com/ziliao/file/STC89C52学习型遥控器.rar

关闭窗口

相关文章