发一个遥控器解码程序(C51)
时间:10-02
整理:3721RD
点击:
相关常数定义:
- typedef bit BOOL;
- typedef unsigned char BYTE;
- #define EX0INT_BANK 1
- #define TIMER1_BANK 2
- #define EX0INT 0
- #define T1INT 3
- 遥控器系统码(有人也叫它用户码)
- #define IR_ADDR_LOW 0x08
- #define IR_ADDR_HIGH 0xF7
- #define IR_STEP_NEW_CODE 0
- #define IR_STEP_LEAD_CODE 1
- #define IR_STEP_ADDR_LO 2
- #define IR_STEP_ADDR_HI 3
- #define IR_STEP_CODE_NOR 4
- #define IR_STEP_CODE_INV 5
- #define IR_STEP_MAX 6
- #define IR11MS0 110 //Repeat
- #define IR11MS5 115 //
- #define IR13MS0 130 //Start
- #define IR14MS0 140 //
- #define IR0MS90 9 //bit 0
- #define IR1MS40 14 //
- #define IR2MS00 20 //bit 1
- #define IR2MS50 25 //
- 变量定义:
- BOOL fgIrKeyExist; //为真表示接收到了一个键码
- BYTE bIrCounter; //遥控中断间隔计时
- BYTE bIrStatus; //遥控接收状态
- BYTE bIrBitCounter; //接收bit计数
- BYTE bIrData; //接收到的键扫描码
- BYTE bIrBuffer; //接收到的键扫描码保存值
- BYTE bRemoteKey; //按键码
- 就两个函数:
- 一为timer1计时,周期为100us
- void Timer1( ) interrupt T1INT using TIMER1_BANK
- {
- bIrCounter++;
- }
- 二为Int0中断函数,下降沿有效,解码过程就在这里完成
- void Exint0() interrupt EX0INT using EX0INT_BANK
- {
- BOOL fgGetBit = FALSE;
- BYTE bTimer;
- bTimer = bIrCounter;
- bIrCounter = 0;
- switch(bIrStatus)
- {
- case IR_STEP_NEW_CODE:
- bIrStatus = IR_STEP_LEAD_CODE;
- break;
- case IR_STEP_LEAD_CODE:
- if((bTimer > IR13MS0)&&(bTimer < IR14MS0))
- {
- bIrBitCounter = 0;
- bIrData = 0;
- bIrBuffer = 0;
- bIrStatus = IR_STEP_ADDR_LO;
- }
- else if((bTimer > IR11MS0)&&(bTimer < IR11MS5)) //连发状态
- {
- bIrBitCounter--;
- if(bIrBitCounter == 0)
- {
- fgIrKeyExist = TRUE;
- bIrBitCounter = IR_REPEAT_CYCLE;
- }
- bIrStatus = IR_STEP_NEW_CODE;
- }
- else
- {
- bIrStatus = IR_STEP_NEW_CODE;
- }
- break;
- case IR_STEP_ADDR_LO:
- case IR_STEP_ADDR_HI:
- case IR_STEP_CODE_NOR:
- case IR_STEP_CODE_INV:
- bIrData >>= 1;
- if((bTimer > IR2MS00)&&(bTimer < IR2MS50))
- {
- fgGetBit = TRUE;
- bIrData |= 0x80;
- }
- else if((bTimer > IR0MS90)&&(bTimer < IR1MS40))
- {
- fgGetBit = TRUE;
- }
- else
- {
- bIrStatus = IR_STEP_NEW_CODE;
- }
- if(fgGetBit == TRUE) //fgGetBit 为真,表示接收到了一个bit
- {
- bIrBitCounter++;
- if(bIrBitCounter == 8) //接收满8个bit了
- {
- bIrBitCounter = 0;
- if(bIrStatus == IR_STEP_ADDR_LO) //检查系统码
- {
- if(bIrData == IR_ADDR_LOW)
- bIrStatus = IR_STEP_ADDR_HI;
- else
- bIrStatus = IR_STEP_NEW_CODE;
- }
- else if(bIrStatus == IR_STEP_ADDR_HI) //检查系统码
- {
- if(bIrData == IR_ADDR_HIGH)
- bIrStatus = IR_STEP_CODE_NOR;
- else
- bIrStatus = IR_STEP_NEW_CODE;
- }
- else if(bIrStatus == IR_STEP_CODE_NOR)
- {
- bIrBuffer = bIrData; //保存起来,为下一步的比较做准备
- bIrStatus = IR_STEP_CODE_INV;
- }
- else if(bIrStatus == IR_STEP_CODE_INV)
- {
- bIrData ^= 0xff;
- if(bIrData == bIrBuffer) //检查正码与反码是否对应
- {
- fgIrKeyExist = TRUE; //正确接收到了按键扫描码
- bRemoteKey = pbRemoteTable[bIrData]; //根据扫描码查表得到按键码,pbRemoteTable为你的键码表格
- bIrBitCounter = IR_REPEAT_ACTIVE;
- }
- bIrStatus = IR_STEP_NEW_CODE; //为接收连发码做准备
- }
- }
- }
- break;
- default:
- bIrStatus = IR_STEP_NEW_CODE;
- break;
- }
- }
恩,正需要这个,不过我是把相关图纸一同发出对新手是更有帮助的!
好的
东西呢
