51单片机红外的遥控解码程序的编写
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }