PIC单片机红外线遥控接收解码实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 { //┌┐__

相关文档
最新文档