学到现在开发板上没有用过的模块已经不多了;nRF24L01无线模块,AD转换,红外发射,学习了红外线的解码之后知道了遥控器的工作原理,之前以为是用不同波长的红外线表示不同的信号,现在知道了用的是大概38KHz的调频,通过载波和空闲不同时间的配合来实现传输0和1,组成引导码用户吗和按键码,很想用上红外发射管,于是先做一个能学习能发射红外线的遥控器,但是两天了,并没有做好,从目前的现象推测可能是延时函数不准确,导致红外线不能被设备识别出来,时间不多了,先继续学习别的,或许会突然灵光一现,想通解决办法了,要是有对这个项目感兴趣的可以一块讨论一下,部里的单片机有内部PWM模块,还在研究中。
定时器0用于接收时计算时间,定时器1用于产生38K载波
[mw_shl_code=c,true]
bit fashe(unsigned char yhm,unsigned char ajm)
{
bit flag = 0;
unsigned char dat;
unsigned char i;
TR1 = 1;
delayms(9);
TR1 = 0;
delayus(4500);//引导码
dat = yhm; //用户码
for (i=0;i<8;i++)
{
if(dat&1 ==1)
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(1680);//"1"
}
else
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(560);//"0"
}
dat=dat>>1;
}
dat = yhm;//用户码(有时候是反码)
for (i=0;i<8;i++)
{
if(dat&1 ==1)
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(1680);//"1"
}
else
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(560);//"0"
}
dat=dat>>1;
}
dat = ajm;//按键码
for (i=0;i<8;i++)
{
if(dat&1 ==1)
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(1680);//"1"
}
else
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(560);//"0"
}
dat=dat>>1;
}
dat = ~ajm;//按键反码
for (i=0;i<8;i++)
{
if(dat&1 ==1)
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(1680);//"1"
}
else
{
TR1 = 1;
delayus(560);
TR1 = 0;
delayus(560);//"0"
}
dat=dat>>1;
}
flag=1;
return flag;
}
/*定时器一产生38K载波*/
void Interrupt_Timer_1() interrupt 3
{
TH1 = 0xff;
TL1 = 0xdc;
PWMOUT = ~PWMOUT;
}[/mw_shl_code]
|