找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2567|回复: 4
收起左侧

单片机红外遥控器汇编程序 控制LED灯 支持掉电唤醒

[复制链接]
ID:261025 发表于 2021-9-16 12:43 | 显示全部楼层 |阅读模式
程序是反编译后整理修改 单片机用的是15w201s  支持掉电唤醒  INT0 INT1 INT4唤醒

两节CR2016电池供电 电池容量太小  红外耗电有点大  发射时电压从6V降到5V甚至更低  电池可能用不了多久

制作出来的实物图如下:
51hei截图20210916122711.jpg 51hei截图20210916122700.jpg 51hei截图20210916122723.jpg
单片机源程序如下:


  1. ;==========================================================================
  2. //发送红外数据  void ir_send()
  3. ir_send:           MOV   set_count_1,#02H; //发送编码中的引导码(9ms高电平+4.5ms低电平)  
  4.                    MOV   set_count_2,#9EH;                  
  5.                    SETB  irflag  ////红外发射标志      
  6.                                    LCALL TX_TIME;   //定时器发送
  7.                                                 
  8.                    MOV   set_count_1,#01H; //发送编码中的4.5ms低电平
  9.                    MOV   set_count_2,#50H;                 
  10.                    CLR   irflag      //红外发射标志   低电平则不发射   
  11.                                    LCALL TX_TIME;    //定时器发送  
  12.                                                 
  13.                    MOV   ircode,#80H;   //发送16位用户码的前1-8位   
  14.                    LCALL ir_sendbyte    //红外发送一个字节数据
  15.                                                 
  16.                    MOV   ircode,#7FH;   //发送16位用户码的前9-16位
  17.                    LCALL ir_sendbyte    //红外发送一个字节数据  
  18.                                                 
  19.                    MOV   ircode,irdata; //发送8位数据码     
  20.                    LCALL ir_sendbyte    //红外发送一个字节数据
  21.                                                 
  22.                    MOV   A,irdata;
  23.                    CPL   A ;              取反                  
  24.                    MOV   ircode,A       //发送8位数据反码      
  25.                    LCALL ir_sendbyte    //红外发送一个字节数据  

  26.                    MOV   set_count_1,#00H; //发送编码中的0.56ms高电平
  27.                    MOV   set_count_2,#23H;               
  28.                    SETB  irflag        //红外发射标志
  29.                                    LCALL TX_TIME;   //定时器发送   
  30.   
  31. ;                                   SETB  IR    ;//发射完了关闭红外发射二极管  
  32. ;                       RET;
  33. ;   不加入下面这部分程序 遥控成功概率变低很多               
  34.                    LCALL DELAY23MS   //延时23ms(编码中的23ms低电平)                  
  35.                    MOV   set_count_1,#02H;  //发送编码中的引导码(9ms高电平+4.5ms低电平)  
  36.                    MOV   set_count_2,#9EH;           
  37.                    SETB  irflag  
  38.                                    LCALL TX_TIME;  //定时器发送                                                           
  39.                    MOV   set_count_1,#01H    //发送编码中的4.5ms低电平  
  40.                    MOV   set_count_2,#50H                  
  41.                    CLR   irflag   
  42.                    LCALL TX_TIME;  //定时器发送   
  43.                    MOV   set_count_1,#00H     //发送编码中的0.56ms高电平   
  44.                    MOV   set_count_2,#23H;                    
  45.                    SETB  irflag  
  46.                    LCALL TX_TIME;  //定时器发送                             
  47.                                    SETB  IR    ;//发射完了关闭红外发射二极管  
  48.                        RET;
  49.                                                                                                 
  50. ;----------------------------------------------------------------------------------
  51. //红外发送一个字节数据
  52. ir_sendbyte:       MOV   R7,#0x00;
  53. Q0223:             MOV   set_count_1,#00H; //发送编码中的0.56ms高电平
  54.                    MOV   set_count_2,#23H;                 
  55.                    SETB  irflag   //红外发射标志  启动红外发射二极管发射   
  56.                                    LCALL TX_TIME;  //定时器发送
  57.                                    MOV   A,ircode        //判断红外编码最低位,若为1则1.69ms的低电平
  58.                    JNB   ACC.0,Q024C               
  59.                    MOV   set_count_1,#00H;    //为0则0.565ms的低电平  
  60.                    MOV   set_count_2,#82H;                  
  61.                    SJMP  Q0252                        
  62. Q024C:             MOV   set_count_1,#00H;                    
  63.                    MOV   set_count_2,#0x2B;               
  64. Q0252:             CLR   irflag    //红外发射标志    低电平则不发射   
  65.                             LCALL TX_TIME;   //定时器发送
  66.                                    MOV   A,ircode        //判断红外编码最低位,若为1则1.69ms的低电平  
  67.                    CLR   C                       
  68.                    RRC   A       //将数据右移,即从低位到高位发送           
  69.                    MOV   ircode ,A                     
  70.                    INC   R7                          
  71.                    CJNE  R7,#0x08,Q0223              
  72.                    RET  
  73. ;------------------------------------------------------------------------------------------------                                                               
  74. //定时器发送                                            
  75. TX_TIME:           MOV   count_1,#00H;  //中断计数先清0               
  76.                    MOV   count_2,#00H;                  
  77.                    SETB  TR0          //开启定时器0            
  78. Q0232:             CLR   C            //等待发送完            
  79.                    MOV   A,count_2;
  80.                    SUBB  A,set_count_2;
  81.                    MOV   A,count_1;
  82.                    SUBB  A,set_count_1;
  83.         
  84.                    JC    Q0232                     
  85.                    CLR   TR0          //关闭定时器0              
  86.                                    RET;

复制代码

;    LED灯遥控程序
;   
;             15W201S                 11.0592M
;==========================================================================
;标号==============指令================================地址===机器码=======
;==========================================================================
                                   count_1      EQU 08H;  
                                   count_2      EQU 09H;

                               set_count_1  EQU 0CH;
                                   set_count_2  EQU 0DH;
                                   irdata                EQU 0EH;         
                                   ircode            EQU 0FH;
                  
                                   keyflag EQU 20H.0;  按键标志位         按下=1
                               irflag  EQU 20H.1;  红外发射标志         发射=1        
                   P5M1    DATA    0xC9            ; P5M1.n,P5M0.n     =00--->Standard,    01--->push-pull
                   P5M0    DATA    0xCA
                   P5 EQU 0C8H

                                   KA   EQU  P3.0;           开关
                               KB   EQU  P3.2;           变光
                               KC   EQU  P3.3;           亮度加
                               KD   EQU  P5.4;           亮度减
                                   IR   EQU  P3.1;           输出
                                   LED  EQU  P5.5;           指示灯

                                 INT_CLKO    DATA    08FH        //外部中断与时钟输出控制寄存器
                        ;         INT2        BIT     P3.6       //INT2引脚定义
                ;                 INT3        BIT     P3.5        //INT3引脚定义
                                 INT4        BIT     P3.0        //INT4引脚定义
                                 
                                      
                                   
                  ORG 0000H
                  LJMP     main;   
                                  ORG                0003H                        
                          LJMP        INT_0                          
;==========================================================================
                  ORG 000BH  
                  LJMP     timer0;
                                  ORG                0013H                        
                          LJMP        INT_1  
                ;                  ORG   0053H                 //INT2中断入口
        ;          RETI
                ;                  ORG   005BH                 //INT3中断入口
        ;          RETI
                                  ORG   0083H                 //INT4中断入口
                  RETI
                        
                                  ORG 100H
;==========================================================================
main:                           MOV   SP,#3FH;  MOV      SP,#0x20;
                        ;           ORL   INT_CLKO,#10H         //(EX2 = 1)使能INT2下降沿中断
                        ;           ORL   INT_CLKO,#20H         //(EX3 = 1)使能INT3下降沿中断
                                   ORL   INT_CLKO,#40H    //(EX4 = 1)使能INT4下降沿中断
                           CLR     A
                                   MOV     P5M1, A     ;设置为准双向口
                   MOV     P5M0, A

                   LCALL    timer0_init; //定时0初始化                 
                   MOV   count_1,#00H    //中断计数先清0     
                   MOV   count_2,#00H                     
                   CLR   irflag          //红外发射标志先置0
                                   SETB  LED;
                                   SETB KA;           
                                   SETB KB;           
                                   SETB KC;           
                                   SETB KD;         

;==========================================================================
C01C4:            LCALL    keyscan;      //键值扫描  
                                  JB      keyflag,C01C5         //若有按键按下
                      JNB        INT0, $                ;高电平时才进入睡眠
                      JNB        INT1, $                ;高电平时才进入睡眠        
                      CLR        IE0                    ;外中断0标志位
                      CLR        IE1                    ;外中断1标志位        
                      SETB        EX0                    ;INT0 Enable
                      SETB        EX1                    ;INT1 Enable
                      SETB        IT0                    ;INT0 下降沿中断               
                      SETB        IT1                    ;INT1 下降沿中断               
                      ORL   PCON, #0x02;         
                      NOP
                      NOP
                                  LJMP C01C4
//---------------------------------------------------------------------------
C01C5:                          CLR LED;
                                   LCALL DELAY6MS;
                                  LCALL    ir_send;  //发送红外编码
                              JNB KA,$;
                                  JNB KB,$;
                                  LCALL DELAY6MS;
                                  JNB KA,$;
                                  JNB KB,$;         
                                CLR      keyflag; //按键标志清零
                                  SETB LED;
                ;                  MOV                R1, #110
                                  SJMP     C01C4                                                   
//---------------------------------------------------------------------------
//void keyscan() // 按键扫描  
keyscan:
                                         JB       ka,C01EE;                //A键按下                                    
                                      MOV      irdata,#0x01;
                                         SETB     keyflag;
                                         RET;         

C01EE:               JB       kb,C01F6;                //B键按下                                       
                                      MOV      irdata,#0x06;
                                         SETB     keyflag;
                                         RET;

C01F6:               JB       kc,C01FE;                //C键按下
                                         JB       KD,C01F7;                //D键按下
                                         MOV      irdata,#0x1E;
                                      SETB     keyflag;
                                         RET;

C01F7:                                 MOV      irdata,#0x12;
                                      SETB     keyflag;
                                         RET

C01FE:           ;    JB       kd,C0206;                //D键按下
                             ;         MOV      irdata,#0x1E;
                             ;         SETB     keyflag;
C0206:               RET         
;==========================================================================
//定时器0中断  timer0_interrupt  
timer0:                                                                                            
                             PUSH  ACC                          
                   INC   count_2;
                   MOV   A,count_2;
                   JNZ   Q02B3                  
                   INC   count_1;
Q02B3:             JNB   irflag,Q02BA ; //有发射标志,则发射38khz的矩形波         
                   CPL   IR;      
                   SJMP  Q02BC                       
Q02BA:             SETB  IR;//否则不发射,即相当于发射编码中的低电平      
Q02BC:             POP   ACC  

                   RETI   
;==========================================================================
//定时器0初始化
timer0_init:       MOV   TMOD,#02H    //定时0 8位自动重装模式               
                                   MOV   TH0,#0F3H;   //定时13us,38K红外矩形波        
                   MOV   TL0,#0E6H;                  
                                   SETB  EA   
                   SETB  ET0                          ;
                   RET   
;========================================================================
INT_1:
        CLR                EX1                ;INT1 Disable
        CLR                IE1                ;外中断1标志位
        RETI
;========================================================================
INT_0:
        CLR                EX0                ;INT0 Disable
        CLR                IE0                ;外中断0标志位
        RETI                                                                                                
;==========================================================================
//延时  
DELAY6MS:   ;误差 -0.018084490741us
    MOV R6,#0C2H
DL0:
    MOV R5,#54H
    DJNZ R5,$
    DJNZ R6,DL0
    NOP
    RET
;==========================================================================
DELAY23MS:   ;误差 -0.054253472225us                       11.0592        1T
    MOV R7,#38H
DL3:
    MOV R6,#0FCH
DL2:
    MOV R5,#03H
    DJNZ R5,$
    DJNZ R6,DL2
    DJNZ R7,DL3
    MOV R5,#01H
    DJNZ R5,$
    RET            

;==========================================================================
$INCLUDE (TX.ASM)
END;

51hei截图20210916122649.jpg 51hei截图20210916122639.jpg 51hei截图20210916122731.jpg
51hei.png

上图Keil代码下载: 15W201S 15W204S红外遥控器 - 掉电唤醒.rar (30.89 KB, 下载次数: 27)

评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:72088 发表于 2021-9-17 21:00 | 显示全部楼层
有学习功能么,就是两个遥控对着红外线管学习
回复

使用道具 举报

ID:88256 发表于 2021-9-17 21:11 | 显示全部楼层
电路板可以去免费打样双面板啊,这样更精致美观
回复

使用道具 举报

ID:261025 发表于 2021-9-18 11:17 | 显示全部楼层
新乡家电维修 发表于 2021-9-17 21:00
有学习功能么,就是两个遥控对着红外线管学习

没有  还不会写
回复

使用道具 举报

ID:261025 发表于 2021-9-18 11:18 | 显示全部楼层
hhdsdy 发表于 2021-9-17 21:11
电路板可以去免费打样双面板啊,这样更精致美观

不做产品就是自己做着玩 用不着打样  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表