分给我,我给你调试通过之源程序(C),先附一张图实物图!
270531131@qqcom
已将红外相关附件发送于你,请查收!
如若还有不明白,请再EMAIL我!建议你先看看关于NEC协议!
另说明:我发给你的,没有经过自制联机测试的源码,若有实物调试时通不过也就是单片机工作的晶振频率采用问题!请将你在调试过程中所遇到的具体问题发给我,知无不言!
建议发送部分采用221184晶振(若用较低频率若是12T单片机,可能会导致发送错误:中断时间13US才能产生38KHZ载波,而MCU处理其他问题仅12US时间),而接收部分可选用110592MHz
这就是一个红外解码程序,按标准来做就行了。普及一下红外解码知识:
采用脉宽调制的串行码,以脉宽为0565ms、间隔056ms、周期为1125ms的组合表示二进制
的"0";以脉宽为0565ms、间隔1685ms、周期为225ms的组合表示二进制的"1,;上述"0"和
"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,;达到降低电源功耗的
目的。然后再通过红外发射二极管产生红外线向空间发射,;遥控编码是连续的32位二进制码
组,其中前16位为用户识别码,能区别不同的电器设备,;防止不同机种遥控码互相干扰。该
芯片的用户识别码固定为十六进制01H;后16位为8位 *** 作码(功能码)及其反码。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码
由一个起始码(9ms),一个结果码(45ms),低8位地址码(9ms~18ms),高8位地址码
(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超
过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(25ms)
组成。
解码的关键是如何识别"0"和"1",接收端而言,"0"是056ms的高+056ms的低。"1"是168ms
的高+056ms的低。所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,
056ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须
比056ms长些,但又不能超过112ms,否则如果该位为"0",读到的已是下一位的高电平,因此
取(112ms+056ms)/2=084ms最为可靠,一般取084ms左右均可。
做为刷新的零点。转速不是绝对稳定的,延时不是绝对准确的。无论程序执行到哪里,只要收到信号就会以此为零点开始刷屏,物理位置不会变。
旋转led是由直流电机的高速旋转,带动了若干个LED,由单片机芯片控制LED的亮灭,利用人眼的视觉暂留原理,从此就可以在空中形成各种图案。
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。
1、你是准备用红外线进行数据传输还是控制?如果是数据传输为什么不用串行口呢?如果是控制的话,就是一体接收头一接收到38K红外线输出脚为低电平,你可以参考一下,对应发送38K红外线的控制如何。
2、一体接收头接收到的38K红外线,其输出脚是输出低电平,而不是对应的38K的方波,这点你要搞清楚,38K红外线是调制波,主要是增加红外线发射距离,一体接收头只认38K红外线,超过他的功率频率,一体接收头是没有反应的。简单的讲,一体接收头只接收38K红外线,对其他红外线不敏感。不能被38Khz迷惑了。
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//数组,用于存储红外编码
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延时x014ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/LCD部分/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0; //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/main()/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}
IE = 0x81; //开中断
TCON = 0x01;//脉冲负边沿触发
while(1);
}
/红外中断/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0; //关闭中断
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳过9ms前导低电平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳过45ms的前导高电平
delayms(1);
while(!IR) //跳过056ms的低电平
delayms(1);
while(IR)
{
TimeNum++; //计时高电平时间从而判断读取的是0还是1
delayms(1);
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8014ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新开启外部中断
}
利用定时器定时13US中断一次,将红外发射管状态取反一次,形成38KHZ调制波,另外一个定时器负责定时056或165ms决定是否发射红外线
单片机要用高速的(如提高晶振频率或采用1T单片机),不然定时13US太短了,单片机还要进行其它判断,可能会受影响
以上就是关于有哪位大侠做过S51单片机 红外发射,38Khz一体化接收的题目不给小弟研究下。全部的内容,包括:有哪位大侠做过S51单片机 红外发射,38Khz一体化接收的题目不给小弟研究下。、这是一段51单片机的红外遥控代码,主要就是用了遥控器上的三个键。看不懂呀,求大神帮助注释或解释下、基于51单片机的旋转led屏中,红外接收管还有红外发射管的作用是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)