本帖最后由 erhohen 于 2013-10-12 09:24 编辑
#include "pic.h"
#define IR GP3
#define LED GP1
#define PWM GP2
char IR_CODE[4]={0};
void main()
{
TRIS=0b00001000; //设定IR作输入,其余作输出
OPTION=0b00000000; //利用内部时钟TRM0
OSCCAL=0b00000000; //
//LED=1; 目前已经把这个注释掉了,程序正常。
//但是 如果初始化了这个的话,if(0==LED) PWM=0; 这句就只执行一瞬间;这是为何???!!
while(1)
{
//******************************************************红外解码开始*****************
if(0==IR)
{
unsigned int i,j,n,m;
i=0; j=0; n=0; m=0;
for(i=0;i<9;i++) //延时882微秒后判断是否出现高电平如果有就退出解码程序,(882us就出现高电平说明是干扰信号)
{//重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
for(j=0;j<65;j++);// 延时0.882ms
if(1==IR) return;
}
//=======以上完成对遥控信号的9ms的初始低电平信号的识别======================
while(0==IR);//等待高电平避开9毫秒低电平引导脉冲
//=======延时4.74毫秒避开4.5毫秒的结果码====================================
for(j=0;j<351;j++); //延时
//==============到此为止,已跳过13.5ms的引导码=====================
//===============下面开始解码=====================================
for(n=0;n<4;n++)
{
for(m=0;m<8;m++)
{
while(0==IR);
for(i=0;i<65;i++);// 延时0.882ms
IR_CODE[n]>>=1;
if(0==IR){
IR_CODE[n]=IR_CODE[n]|0x00; }
if(1==IR){ for(i=0;i<74;i++); //延时1ms
IR_CODE[n]=IR_CODE[n]|0x80;}
}
}
//====解码结束,得到【用户码】【用户反码】【操作码】【操作反码】=====
if(0x46==IR_CODE[2]){LED=1;} //接收的操作码为16进制的46则LED亮
if(0x15==IR_CODE[2]){LED=0;} //接收的操作码为16进制的46则LED灭
}
//******************************************************红外解码结束*****************
if(0==LED) PWM=0; //为什么:如果初始化 “LED=1;” 的话这句会不起作用,或者说起了一瞬间的作用而已
if(1==LED) PWM=1;
}
} |