文档库 最新最全的文档下载
当前位置:文档库 › 终于独自完成了,红外遥控解码程序的C编写

终于独自完成了,红外遥控解码程序的C编写

终于独自完成了,红外遥控解码程序的C编写
作者:Tony 时间:2008-6-3 22:04:39


嘿嘿,经过半天的奋斗,终于独自完成了红外的遥控解码程序的编写。

下面把这次红外编程的解码的经历简要的写一下,以便以后回顾总结:

红外遥控过程是这样的:红外遥控器的矩阵键盘按键,接着专用芯片编码调制然后红外发射;红外接受头经过光电放大,解调,最后解码编程。
我的遥控专用芯片是UPD6122G- 001.解码晶振是455kHz,调制载波频率是455kHz/12=38kHz。此外调制信号是PWM进行调制的,0是脉冲波形
位0.5625ms的高电平跟0.5625ms的低电平组成,1则是0.5625ms的高电平跟1.6785ms的低电平组成。跟其他通用的波形一样,有键按下时,先
是9ms的高电平的起始码,接着是一个4.5ms结果码,接下来就是数据了。用户码的高8位,用户码的低8位,8位数据码,8位数据反码,最后还
有一个停止位。如果按键一直没松,则接下来就只是发送起始码(9ms高电平),接着是一个2.2ms的低电平,再接着是一个停止位。

我的红外接在单片机p3.7引脚上面,从网上收集了一些程序,基本上如同一则,汇编编写,跟外部中断还有关系。于是便萌生了自己写一下的
想法。我的思路是用定时器进行计数,然后编程。刚开始编写程序是,由于忘了对定时器的标志位进行置为,结果定时中断根本就没有执行,
手头上又没有用仿真芯片,搞得我下载调试了十来次才发现了这个问题。还有一个问题刚开始遥控能够解码的时候,可是一直按某个键,你按
一次,她就变化一次,搞得我很是郁闷,差点儿没晕过去。怎么找都不知道问题的所在,心里不断地打算放弃,不过最后还是坚持了下来,原
来电路的实际解码电平跟资料上是相反的。遥控器的实际电平由高变低,而电路板上却是由低变高。这点确好相反。

总结:一要自信,二要坚持,才有可能完成你想做的事件。

/**********************************************
程序设计: 彭森
编写时间:2007-8-13
**********************************************/


#include"reg51.h"
#include"2-16.h"
#include"address.h"

//需要显示的信息
uchar code hello[] = "Hello,PengSen!";

//变量
uchar data psCount; //定时器计数器
uchar data i;
uchar data j;
uchar data temp;
uchar data dp[4]; //用来保存红外遥控的码值
uchar data dp2[12];//用来显示红外遥控的码值

sbit HW = P3^7;

void delay(unsigned int y);

void main()
{
//初始化
initlcd();
dp[0] = 0x0;
dp[1] = 0x0;
dp[2] = 0x0;
dp[3] = 0x0;

TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式

TH1 = 0xfe; //定时500uS
TL1 = 0x33;

TCON = 0x01;
IE = 0x80;
TR1 = 1;
printf(hello,13);
while(1)
{
//报文头

ET1 = 0;
psCount = 0;
while(HW == 1); //初始状态下,红外输出脚一直是高电平,等待遥控按键
ET1 = 1;
while(HW == 0);
if( psCount > 17)//0.5* 17 = 8.5ms约为9.0ms
{
ET1 = 0;
psCount = 0;
ET1 = 1;
while(HW == 1);
if(psCount > 5) //超过0.5*5 = 2.5毫米,检查一下遥控命令是不是连发,不是则执行下面的程序
{
ET1 = 0;
psCount = 0;
dp[0] = 0x0;
dp[1] = 0x0;
dp[2] = 0x0;
dp[3] = 0x0;
//数据
for(i = 0 ; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
while(HW == 0);
ET1 = 0;
psCount = 0;
ET1 = 1;
while(HW == 1);
if(psCount > 2)//根据波形长度判定码值为0或1
temp = 0;
else
temp = 1;
dp[i] |= (temp<}

}

}
}
//停止位
while(HW == 1);
//数据显示
delay(20);
dp2[0] = dp[0]/100 + 0x30;
dp2[1] = dp[0]%100/10 + 0x30;
dp2[2] = dp[0]%10 + 0x30;
dp2[3] = dp[1]/100 + 0x30;
dp2[4] = dp[1]%100/10 + 0x30;
dp2[5] = dp[1]%10 + 0x30;
dp2[6] = dp[2]/100 + 0x30;
dp2[7] = dp[2]%100/10 + 0x30;
dp2[8] = dp[2]%10 + 0x30;
dp2[9] = dp[3]/100 + 0x30;
dp2[10] = dp[3]%100/10 + 0x30;
dp2[11] = dp[3]%10 + 0x30;
printf(dp2,12);
delay(20);
}
}

//延时子程序
void delay(unsigned int y)
{
uchar x;
for(;y!=0;y--)for(x=200;x!=0;x--);
}

//定时器1中断
void timer1() interrupt 3
{


psCount++;

TH1 = 0xfe; //定时500uS
TL1 = 0x33;

}


-------------------------------------------------------------------------------------------------------------------------------------------------------------------

相关文档
相关文档 最新文档