51单片机红外的遥控解码程序的编写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

#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;

}

相关文档
最新文档