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

📄 红外线遥控器解码.txt

📁 这里我们以红外线遥控编码芯片为LC7461等芯片为例来说明用单片机实现红外遥控解码的详细过程
💻 TXT
📖 第 1 页 / 共 5 页
字号:








main(){
unsigned char ctr;
delay1s();
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
ctr=0;
buf1=RECEIVE;
buf2=SEND;
buf1_length=0;
buf2_length=0;
buf1_flag=0;
buf2_flag=0;
state1=0;
state2=0;
SP=0xe0; //将堆栈指针指向高端
TL2=0xfb;
TH2=0xff; //溢出值为5,波特率为115.2Kbps;
RCAP2H=0xff;
RCAP2L=0xfb;
SCON=0x50; //方式1,8位方式,SM0=0,SM1=1,SM2=0,REN=1允许接收
IE=0x10; //串行中断允许,全局中断不允许
T2CON=0x34; //RCLK=1,TCLK=1,TR2=1 启动计数器
EA=1; //开放全局中断
free();



while(1){
//ir_init();
//while(!ir_flag);
//ir_exit();
//ir_jiema();
//if(yima()==0) P1_0=1;
//if(yima()==1) P1_0=0;


if(buf1_flag){
buf1=RECEIVE;
ctr=*buf1;

switch(ctr){
case ACK: ack();
break;
case NACK: nack();
break;
case FREE: free();
break;
case BUSY: busy();
break;
case DOWNLOAD: download();
break;
case UPLOAD: upload();
break;
case RUN: run();
break;
case READ_IR: read_ir();
break;
case READ_KEY: read_key();
break;
case STORE_IR: store_ir();
break;
default: buf1_flag=0;
REN=1;
break;
}
}


}

}


void sub(void){
}

void ie_0(void){
}

void tf_0(void){
}

void ie_1(void){
}

void tf_1(void){
}

void tf_2(void){
}
2005-1-14 19:59 sina3228
红外线遥控器读码机源程序和说明
;红外线遥控读码机,用本实例配合PIC单片机学习网的ST套件可读出任何6121或6122(CD6121/CD6122/SC6121/SC6122)及其兼容芯片的红外线遥控器的用户码、键码。
;本例是一个红外线遥控接收解码程序,程序中数码管显示用的是定时器中断法的动态扫描
;动态显示二位数码管的方法,中断法,我们以3MS中断一次从而交换两位数码管轮流点亮。
;对准实验板红外线接收头轻按要测定的遥控器的待测按键一次,此时实验板的两位数码管将显示该键的键码,
;(显示为16进制的),轻触实验板的S2此时显示器切换为显示当前遥控器用户码的低8位, 再次轻触实验板的S2此时显示器切换为显示当前遥控器用户码的高8位,
;再一次轻触实验板的S2此时显示又回到显示当前键的键码,用按键S2可反复循环显示用户码低8位、高8位、键码。
;注意:所有的显示均为16进制,\'A\'显示为\'A\',\'B\'显示为\'b\',\'C\'显示为\'c\',\'D\'显示为\'d\',\'E\'显示为\'E\',\'F\'显示为\'F\'.
;注意6121的遥控器发射码依次为:同步头(引导码)+32位数据码(用户码低8位+用户码高8位+键码+键码的反码)
;引导码是由9MS的高电平加4.5MS的低电平构成,我们接收到的刚好反相为9MS的低电平加4.5MS的高电平.
;数据码\'0\'是由560US的高电平加560US的低电平构成,接收时反相为560US的低电平加560US的高电平构成.
;数据码\'1\'是由560US的高电平加1.69MS的高电平构成,接收时反相为560US的低电平加1.69MS的高电平构成.
;PIC单片机学习网    陈学乾   [url]http://www.pic16.com[/url]
;程序文件名:“ST-RMT.ASM"
;烧写时应注意:配置位已经在程序中写明,加载HEX文件时会自动加载,烧写时不用再手动设置配置位。
;实验时请注意套件跳线选择;
;*******************************************************************
LIST P=16F84A,R=DEC  ;定义器件为16F84,默认数制为十进制
;-------------------------------------------------------
  __CONFIG B\'11111111110001\';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC 
                                              ;没有代码保护
                                              ;看门狗关闭
                                              ;上电廷时器开启
                                              ;振荡器模式为XT
;-------------------------------------------------------------
RTCC   EQU 01H           ;定义定时器0地址
PC     EQU 02H           ;定义程序计数器低字节寄存器地址
STATUS EQU 03H           ;定义状态寄存器地址
PORTA  EQU 05H           ;定义RA口数据寄存器地址
PORTB  EQU 06H           ;定义RB口数据寄存器地址
INTCON EQU 0BH           ;定义中断控制寄存器

OPTION_REG  EQU 81H      ;
TRISA       EQU 85H      ;定义RA口方向控制寄存器
TRISB       EQU 86H      ;定义RB口方向控制寄存器
;-----------------------STATUS
C           EQU 0        ;定义进位标志位位地址
Z           EQU 2         ;定义0标志位位地址
RP0         EQU 5          ;寄存器体选
;-------------------------INTCON
T0IF        EQU 2          ;定时器0溢出中断标志位
T0IE        EQU 5          ;定时器0溢出中断允许/禁止
GIE         EQU 7          ;总中断允许/禁止
;-------------------------
RMT         EQU 4          ;遥控接收输入脚位地址(RA。4)
;-------------------------
BITIN       EQU 7           ;遥控接收数据位位标志
;-------------------------
CNT0         EQU 20H          ;用户临时寄存器1
CNT1         EQU 21H          ;用户临时寄存器2
CNT2         EQU 22H          ;用户临时寄存器3
CNT3         EQU 23H          ;用户临时寄存器4
TABADD       EQU 24H          ;数码管显示码取码用寄存器
FLAGS        EQU 25H         ;显示位选标志位
DISPBUF_H    EQU 26H         ;显示器高位
DISPBUF_L    EQU 27H         ;显示器低位
W_TEMP       EQU 2BH         ;W现场保护寄存器
STATUS_TEMP  EQU 2CH         ;STATUS现场保护寄存器
CSR0         EQU 2DH         ;遥控键码反码寄存器
CSR1         EQU 2EH        ;遥控器键码寄存器
CSR2         EQU 2FH        ;遥控器用户码高8位寄存器
CSR3         EQU 30H        ;遥控器用户码低8位寄存器
FLAGS2       EQU 31H        ;临时寄存器
CSR0A        EQU 32H        ;遥控接收32位数据暂存寄存器
CSR1A        EQU 33H        ;遥控接收32位数据暂存寄存器
CSR2A        EQU 34H        ;遥控接收32位数据暂存寄存器
CSR3A        EQU 35H        ;遥控接收32位数据暂存寄存器
COUNTER      EQU 36H        ;按键计数寄存器
;--------------------
               ORG 0000H
               GOTO MAIN
               ORG  0004H
               GOTO TMR0SERV    ;定时器中断,扫描数码管
               ORG  0008H
;-------------------------------------------------
CONVERT   
            MOVWF     PC                 ;将W寄存器内的7段显示码地址放入PC 
TABLE                                       ;PC执行新地址指令, 跳到相对的地址执行?               
   RETLW       081H     ;0  ;RETLW指令,将七段显示码存入W后返回
   RETLW       0E7H    ;1                                
   RETLW       092H    ;2
   RETLW       0A2H    ;3
   RETLW       0E4H    ;4
   RETLW       0A8H    ;5
   RETLW       088H     ;6
   RETLW       0E3H            ;7
   RETLW       080H    ;8
   RETLW       0A0H    ;9
          RETLW       0C0H            ;A
          RETLW       08CH            ;b
          RETLW       09EH            ;c 
          RETLW       086H            ;d
          RETLW       098H            ;E
          RETLW       0D8H            ;F
;----- -----------------------------------------------
TMR0SERV
                MOVWF      W_TEMP            ;现场保护
                SWAPF      STATUS,W          ;用SWAPF才不会影响标志位
                MOVWF      STATUS_TEMP       ;将W和STATUS存入各保护寄存器

                MOVLW      0FFH
                MOVWF      PORTB             ;先熄灭所有数码管以免闪烁
                BSF        PORTA,1
                BSF        PORTA,2

  
                MOVLW      TABLE
                MOVWF      TABADD           ;将转换表的首地址存入TABADD  
                MOVFW      DISPBUF_L        ;计数值(W)与转换表的起始地址相加
                BTFSS      FLAGS,1
                MOVFW      DISPBUF_H
                ADDWF      TABADD,W
                CALL       CONVERT          ;存入W后调用转换表子程序
                MOVWF      PORTB            ;送RB口显示

                BTFSS      FLAGS,1          ;根据标志位选择是点亮那一个数码管
                BCF        PORTA,1
                BTFSC      FLAGS,1
                BCF        PORTA,2
                COMF       FLAGS,1

                MOVLW      155         ;送定时器初值
                MOVWF      RTCC

                BCF        INTCON,T0IF      ;清定时器0溢出中断标志位
                SWAPF      STATUS_TEMP,W    ;恢复中断前STATUS,W的值
                MOVWF      STATUS
                SWAPF      W_TEMP,F
                SWAPF      W_TEMP,W         ;(用SWAPF才不会影响STATUS的值)
                RETFIE
;------------------------------------------------
MAIN
               CLRF        PORTA
               CLRF        PORTB   ;初始化IO口
     
               BSF         STATUS,RP0 ;设置寄存器体1
               MOVLW       0F8H       ;将RMT设置为输入,S2输入其它IO口设置为输出
               MOVWF       TRISA 
               MOVLW       00H       ;
               MOVWF       TRISB  
               MOVLW       84H
               MOVWF       OPTION_REG  ;预分频器分配给定时器0,分频比1:32;
               BCF         STATUS,RP0  ;恢复寄存器体0
   
               MOVLW       155
               MOVWF       RTCC       ;定时器送初值(255-155)*32US=3.2MS,每3.2MS一次中断 
               MOVLW       0FFH       ;先让数码管全部不显示
               MOVWF       PORTB
               CLRF        DISPBUF_L  ;数码管先显示00
               CLRF        DISPBUF_H
               CLRF        COUNTER     ;按键计数送初值
               BCF         INTCON,T0IF
               BSF         INTCON,T0IE ;定时器0溢出中断允许
               BSF         INTCON,GIE  ;总中断允许
;--------------------------------------------------
LOOP       
               BTFSS       PORTA,3     ;是否按下S9
               GOTO        KEY          ;跳转键处理
               BTFSS       PORTA,RMT    ;是否有遥控器按下
               GOTO        RCV          ;跳转遥控接收程序
               GOTO        LOOP         ;反复检测
;--------------------------------------------------
KEY                               
              
               CLRF        CNT0          ;消除键抖动
               MOVLW       100
               MOVWF       CNT1 
KEY_A
               BTFSC       PORTA,3      
               INCF        CNT0,1
               BTFSS       PORTA,3
               CLRF        CNT0
               BTFSC       CNT0,3
               GOTO        LOOP
               DECFSZ      CNT1,1
               GOTO        KEY_A
               INCF        COUNTER,1     ;按键计数加一
               MOVFW       COUNTER
               MOVWF       CNT1
               DECFSZ      CNT1,1        ;是否是第一次按下按键
               GOTO        KEY_B         ;不是则转
               SWAPF       CSR3,W        ;用户码低8位 高低位交换,先处理高位
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_H     ;存入寄存器
               MOVFW       CSR3          ;用户码低8位 低位处理
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_L     ;存入寄存器 
               GOTO        KEY_END
KEY_B
               DECFSZ      CNT1,1        ;第二次按下按键否
               GOTO        KEY_C         ;不是第二次按下按键则是第三次转相应程序
               SWAPF       CSR2,W        ;显示值高低位交换,先处理高位
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_H     ;存入寄存器
               MOVFW       CSR2          ;显示值低位处理
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_L     ;存入寄存器 
               GOTO        KEY_END
KEY_C
               CLRF        COUNTER       ;该次循环结束,按键计数送初值
               SWAPF       CSR1,W        ;键码值高低位交换,先处理高位
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_H     ;存入寄存器
               MOVFW       CSR1          ;键码值低位处理
               ANDLW       0FH           ;屏蔽掉高位
               MOVWF       DISPBUF_L     ;存入寄存器
KEY_END 
               BTFSS       PORTA,3       ;等待键释放
               GOTO        $-1      
               GOTO       LOOP
;--------------------------------------------------
RCV
               BTFSC       PORTA,RMT
               GOTO        LOOP        ;是干扰退出
               MOVLW        4
               MOVWF       CNT1       ;4*256*10us
               CLRF        CNT2
               CLRF        CNT0
RCV1                                     ;先检测引导码的9MS低电平
               GOTO        $+1           ;每一个循环10US 
               NOP
               BTFSC       PORTA,RMT
               INCF        CNT2,1
               BTFSS       PORTA,RMT
               CLRF        CNT2
               BTFSC       CNT2,3         ;高电平大于8*10US=80US则为有效高电平,否则是一些干扰信号
               GOTO        RCV2

⌨️ 快捷键说明

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