1,制作了红外解码,将红外信号串行给电脑,用家用遥控器测试,得到的信号与NEC标准是相符的。成功。
2.制作了红外编码器,用之前的解码器测试新的编码器,开始使用PNP三极管,拉低亮起,如图,得不到预想效果,后来单独接限流和发光管,仍然得不到,电脑串行得到的是一堆乱码,而且得到的单次信号数量完全不是预想的,不就是只有3、4个高低位,不就是50多个60多个。。
3。在ISIS模拟,得到的波形十分正确,电位相反因为PNP反向输出。
4。怀疑是P0脚输出能力有限,就换到了P3.7,仍然不行。
5、百度问了,没有答案,好像别人都没有为这个问题烦恼过。
请问谁做过红外线遥控器,我怎么都搞不定了,只有来这里寻求高手帮助。
我的请求是:为啥我的程序出来的博形式正确的,可是得不到正确的真实信号呢?
ps:数码管是用来调试,运行的时候显示运行到哪个位置了,一般会停留在5,后来为了避免数码管消耗的电流将它也关闭了。我搞这个好心急啊,高手一定不怕麻烦帮帮我。
还有,利用红外发射三极管拉低测试按钮时,如果按键接触不良会瞬间产生大量的噪声编码。
虽然没用,但是附带编码器的代码:
#include <reg51.h>
// _1|P1.0 VCC | 40
// _2|P1.1 P0.0 | 39
// _3|P1.2 P0.1 | 38
// _4|P1.3 P0.2 | 37
// _5|P1.4 P0.3 | 36
// _6|P1.5 P0.4 | 35
// _7|P1.6 P0.5 | 34
// _8|P1.7 P0.6 | 33
// _9|RST P0.7 | 32
// 10|P3.0/RXD EA | 31
// 11|P3.1/TXD ALE | 30
// 12|P3.2/INT0 PSEN | 29
// 13|P3.3/INT1 P2.7 | 28
// 14P3.4/T0 P2.6 | 27
// 15|P3.5/T1 P2.5 | 26
// 16|P3.6/WR P2.4 | 25
// 17|P3.7/RD P2.3 | 24
// 18|XTAL2 P2.2 | 23
// 19|XTAL1 P2.1 | 22
// 20|GND P2.0 | 21
//FOR PRESS 定义按键
#define POWERJIDING 0xFE
#define PREVIOUS 0xFD
#define NEXT 0xFB
#define POWERHS 0xF7
#define VOLUP 0xEF
#define VOLDOWN 0xDF
#define KEY P2 定义输出数码管 现实执行位置
unsigned char keynow,keyprevious;
void KeyCheck()
{
unsigned int nk;
while(KEY==255){;}
keyprevious=KEY;
for(nk=1000;nk;nk--);
keynow=KEY;
if(keynow!=keyprevious)
{
keynow=255;
}
}
//FOR IO
sbit OutSbit=P0^0; 输出口 后来是P3……7
#define HIGH 0
#define LOW 1
//FOR T0 T1设置定时器
unsigned char WaitT0,WaitT1,Stop;
void T0T1Setup();
void T0T1Setup()
{
TMOD=0x11;
EA=1;
ET0=1;ET1=1;
TR0=0;TR1=0;
}
//使用两个定时器轮流执行,T0 永远用来定时高位低电压,T1相反
void T0Int() interrupt 1
{//the high msg low electrolevel
OutSbit=LOW;
TR1=1;
TR0=0;
TF0=0;
WaitT0=0;
}
void T1Int() interrupt 3
{//the low msg high electrolevel
OutSbit=HIGH;
TR0=1;
TR1=0;
TF1=0;
WaitT1=0;
}
//FOR SDATA 这里是我需要的遥控信号
unsigned char code msgjdhonoff[4]={0x2,0x34,0xA2,0x5D};
unsigned char code msgjdhnext[4]={0x2,0x34,0xC0,0x3F};
unsigned char code msgjdhprevious[4]={0x2,0x34,0x40,0xBF};
unsigned char code msghsonoff[4]={0x0,0xFD,0xB0,0x4F};
unsigned char code msghsvolup[4]={0x0,0xFD,0x22,0xDD};
unsigned char code msghsvoldown[4]={0x0,0xFD,0xC2,0x3D};
unsigned char code bottom[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char* msghead;
unsigned char msg[32];
unsigned char mode[11]= {18,190,35,38,142,70,66,30,2,6};
//FOR SEGMENT
void SendMsg()//发送编入MSG的信息
{
unsigned char ns=0;Stop=0;
P0=255;
TH0=0xDF;
TL0=0x99;
TH1=0xEF;
TL1=0xCC;
OutSbit=HIGH;
TR0=1;//T0 is running
WaitT0=1;//T0 is running T1setup ok
for(ns=0;ns<32;ns++)
{
while(WaitT0){;}
TH0=0xFD;
TL0=0xF9;
WaitT1=1;
while(WaitT1){;}
TH1=0xFD;
TL1=0xF9;
if(msg[ns]==1)
{
TH1=0xF9;
TL1=0xEC;
}
WaitT0=1;
}
while(WaitT0);
TH0=0xFD;
TL0=0xF9;
WaitT1=1;
while(WaitT1);
TH1=0x00;
TL1=0x00;
WaitT0=1;
Stop=1;
//Test=HIGH;
while(WaitT0);
//Test=LOW;
//Test=LOW;
}
//FOR PROGRAMESTATES
void main()
{
unsigned char nt,nm,mm;//for calc msg
T0T1Setup();
while(1)
{
P0=mode[5];
KeyCheck();
if(keynow)
{
P0=mode[4];
switch(keynow)
{
case POWERJIDING :
msghead=msgjdhonoff;
break;
case PREVIOUS :
msghead=msgjdhprevious;
break;
case NEXT :
msghead=msgjdhnext;
break;
case POWERHS :
msghead=msghsonoff;
break;
case VOLUP :
msghead=msghsvolup;
break;
case VOLDOWN :
msghead=msghsvoldown;
break;
default:
msghead=msgjdhnext;
break;
}//根据按键写入该高还是低
nm=0;
for(mm=0;mm<4;mm++)
{
for(nt=0;nt<8;nt++)
{
if(msghead[mm]&bottom[nt])
{
msg[nm]=1;
}
else
{
msg[nm]=0;
}
nm++;
}
}
ET1=1;ET0=1;
SendMsg();
ET0=0;ET1=0;
TR0=0;TR1=0;
OutSbit=LOW;
//发送完了准备下一次
}
}
}
T0和T1虽然定时精确,但是由于单片机单线程的缘故,TH- TL-的设置是需要时间的,各种FOR的布置,占用了指令时间,使你的循环和T所占用的时间各种不精确。
我用了最笨的方法,希望能奏效。
制版后会再来展示,代码太丑了,就不发了。
一周热门 更多>