PIC单片机红外线遥控接收解码实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[MCD-DEMO2]PIC单片机红外线遥控接收解码实例[PIC16F877A+PICC]
//实验目的:熟悉遥控接码解码的方法
//数码管显示解码结果:高四位为用户码,低2位为按键码
//硬件要求:跳线J19接通,其他跳线断开
// 拨码开关S5、S6全部置ON
// 其他拨码开关全部置OFF
#include
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define uchar unsigned char
#define uint unsigned int
void delay(char x,char y);
#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
union {
struct {
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}oneBit;
unsigned char allBits;
} myFlag;
#define CNT2_1 myFlag.oneBit.b1
#define CNT2_2 myFlag.oneBit.b2
#define CNT2_3 myFlag.oneBit.b3
#define CNT2 myFlag .allBits
static bit FLAGS ;
static bit Bitin;
union Csr
{ unsigned long i;
unsigned char Csra[4];
}myCsra;
#define RMT RA1 // ;遥控接收输入脚位地址(RA。1)
#define BITIN 7 //遥控接收数据位位标志
uchar CNT0, CNT3,CNT4; //用户临时寄存器1--4
uint CNT1;
uchar TABADD; //数码管显示码取码用寄存器
uchar CSR0; //;遥控键码反码寄存器
uchar CSR1; //;遥控器键码寄存器
uchar CSR2; //;遥控器用户码高8位寄存器
uchar CSR3; //;遥控器用户码低8位寄存器
uchar FLAGS2; //;临时寄存器
uchar CSR2A ; //遥控接收32位数据暂存寄存器
const uchar table[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x 0a1,0x86,0x8e,};//0x00
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,
//-------------系统初始化子程序------------------------------
void initial (void)
{
PORTA=0;
ADCON1=7; // 设置RA口全部为普通数字IO口
TRISA=0x02; // 将RMT设置为输入,其它所有IO口设置为输出
TRISD=0; // ;RC口全部为输出
PORTD=0xFF; //先让数码管全部不显示
}
//--------------------------------------------------------------------------------------------
void RCV()
{
if(!RMT)
{
CNT1=640; //4*256*10us 640*16=10。24ms
CNT2=0;
//RCV1
do { // ;先检测引导码的9MS低电平_____┏┓
// ;每一个循环16US
if(RMT)
CNT2=CNT2++;
if(!RMT)
CNT2=0;
if(CNT2_2) //高电平大于8*10US=80US则为有效高电平,
break; //否则是一些干扰信号16*4=64us
} while (CNT1--); //低电平大于4*256*10US=10.24MS则是错误脉冲
//RCV2
if(CNT2_2&&(0 { //320*16=5。12ms则是错误脉冲 CNT1=480; //;3*256*10us 480*16=7.68 CNT2=0; //RCV3 //;每一个循环16US do { if(!RMT) CNT2=CNT2++; if (RMT) CNT2=0; if(CNT2_2) // 低电平大于8*10US=80US则为有效低电平,否则是一些干扰信号 break; //RCV4,否则是一些干扰信号16*4=64us // 高电平大于3*256*10US=7.68MS则是错误的 } while (CNT1--); //RCV4 if(CNT2_2 && (0 { //480-320=160 *16= 2.56ms CNT3 =32; //接收数据共32位,16位用户码,8位控制码加8位控制码的反码 //RCV5 do { CNT2=0; CNT0=86; //低电平大于256-170=86*10US=860US错误86*10 __┌┐ CNT4=200; //高电平大于256-56=200*10US=2MS错误200*10 //RCV5_HI do { //;每一个循环10US if(RMT) CNT2=CNT2++; if(!RMT) CNT2=0; if(CNT2_3) //;高电平大于8*10US=80US则为有效高电平 break; //RCV6否则是一些干扰信号16*4=64us //;低电平大于860US则是错误的 } while (CNT0--); //CV6 if((CNT0==0)||(CNT2_3==0)) break; CNT2=0; //RCV6_LO do { //┌┐__