打印

求救!红外发射,多大晶振能产生准确的38KHZ呢?

[复制链接]
15036|57
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚刚着手研究红外发射与接收,几乎阅览了网络的资料,然后用两个单片机分别做了一个发射器和接收器来测试一下,就是当接收端接收到发射过来的信号led灯就会亮,但是没有反应,不知道是发射端还是接收端的问题,发射端我使用12MHZ的晶振,不知道使用多大为好?请大家帮帮忙,受限于智力问题,自己研究了很久还没有学会红外,如果有成功的例子就更好了,谢谢各位大侠,江湖救急。!!

相关帖子

沙发
长安1号| | 2010-11-8 16:03 | 只看该作者
“不知道是发射端还是接收端的问题,发射端我使用12MHZ的晶振,不知道使用多大为好?”建议用示波器先量测一下发射端的载波频及波形是否正确,然后确认一下接收端,个人认为与晶振没有太多关系,合适就好

使用特权

评论回复
板凳
5号工作室|  楼主 | 2010-11-8 17:31 | 只看该作者
2# 长安1号 我的红外接收时1838B,也就是三条腿的那个,它不是要接收38K才能设别为高低电平吗?

使用特权

评论回复
地板
coody| | 2010-11-8 17:50 | 只看该作者
这个不用那么准确,即使是遥控器也不是刚好38K,一般是36~40KHZ都没有任何问题,接收头是有带宽的

使用特权

评论回复
5
5号工作室|  楼主 | 2010-11-8 18:30 | 只看该作者
4# coody 我用12MHZ晶振,中断程序如下:
TMOD=0x02;//定时器工作方式为2

TH0=0xf3;

TL0=0xf3;
频率大概为38461KHZ,不知道这是否合理,接收端用一个LED指示,但是没有反应。

使用特权

评论回复
6
ji_dan| | 2010-11-8 20:27 | 只看该作者
还没有研究过红外~~~

使用特权

评论回复
7
Jack602| | 2010-11-8 20:53 | 只看该作者
LZ..我也想学红外..帮顶一下...

使用特权

评论回复
8
wangyy608| | 2010-11-8 22:13 | 只看该作者
先检查发射的频率,再看接收端的波形 1# 5号工作室

使用特权

评论回复
9
oufuqiang| | 2010-11-8 22:55 | 只看该作者
8051输出频率与定时器值查找小工具 易语言开发的,可能会报毒。

寻找定时器值.rar

248.14 KB

使用特权

评论回复
10
coody| | 2010-11-8 23:05 | 只看该作者
LZ,目前市场上大部分的红外一体化接收头都是“脉冲型”的,即不能接收连续的38KHZ,以前我在大虾论坛发过相关的说明。

使用特权

评论回复
11
5号工作室|  楼主 | 2010-11-9 13:58 | 只看该作者
9# oufuqiang 软件比较好用,但是360报危险。

使用特权

评论回复
12
5号工作室|  楼主 | 2010-11-9 14:01 | 只看该作者
10# coody 在其它论坛查看一下,确实如此,脉冲型的,只能接收间歇的38K信号,如果接收连续的38K信号,则几百ms后会一直保持高电平,除非距离非常近(二三十厘米以内)
说的是间隔几百毫秒,但是我的没有超过一百毫秒呢。会不会接收端的接收频率要求很准确呢?

使用特权

评论回复
13
诺慷电子| | 2010-11-9 16:07 | 只看该作者
跟晶振关系不大!~~  主要是你的发码和解码!~~

使用特权

评论回复
14
匠人粉丝团| | 2010-11-9 17:01 | 只看该作者
建议用示波器看发射端,是不是是38K的载波;若是,就再看接收端,是否有高低电平信号出来。
38K也不是非要38的,还有就是,占空比设置,是否符合要求。

使用特权

评论回复
15
5号工作室|  楼主 | 2010-11-9 19:03 | 只看该作者
13# 诺慷电子 这就是说发什么频率都可以,就要接收端的时间一致就可以了??

使用特权

评论回复
16
5号工作室|  楼主 | 2010-11-9 19:14 | 只看该作者
14# 匠人粉丝团 个人爱好研究,还没有示波器呢。
占空比应该没有错,就是1:1和1:3分别代表1和0的那个。
还有,可以额外问一个问题吗?听说stc的新型单片机的PWM功能可以产生38K,请问如何设置呢?

使用特权

评论回复
17
baud8o8| | 2010-11-9 20:09 | 只看该作者
:lol

使用特权

评论回复
18
5号工作室|  楼主 | 2010-11-13 11:13 | 只看该作者
现在把晶振改为24MHZ,单片机为STC89C52RC,发射部分和接收部分都是用单片机做;
发射部分:
#include<reg52.h>
sbit TR_DATA=P3^5;//定义发射端口
sbit key=P2^3;
void delay_ms(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=218;y>0;y--);
}
void TransData(unsigned char _data)//发送数据(_data为要发送的8为数据)
{
        unsigned char i;
        TR0=1;//启动38KHZ脉冲
        delay_ms(9);
        TR0=0;//关闭脉冲
        TR_DATA=0;//红外发射管输出0
        delay_ms(5);//5毫秒低电平
        for(i=0;i<8;i++)
        {
        //下面为要发送的数据“1”,1毫秒38KMZ,和1毫秒低电平
                TR0=1;//启动38KMHZ
                delay_ms(1);//一毫秒
                TR0=0;//关闭
                TR_DATA=0;//红外管输出0
                if(_data&(1<<i))delay_ms(1);//关键点!
                //_data是准备要发送的8位数据,1“与”的位置就是要发送的数据
                else delay_ms(3);//否则发送0,即低电平发送3毫秒
        }
        //以下为结束时序
        TR0=1;//先发送5毫秒38K
        delay_ms(5);
        TR0=0;//关闭
        TR_DATA=0;//发射管输出0
}
void main()
{
        unsigned char key;
        TMOD=0x02;//定时器工作方式为2
        TH0=0xe6;
        TL0=0xe6;
        EA=1;
        ET0=1;
        key=1;
        while(1)
        {
                TR_DATA=0;
                if(key==0)
                {
                delay_ms(3);
                if(key==0)
                {
                TransData(1);//把“1”转化为0000 0001发送过去
                while(!key);
                }
                }
        }
}
void T0_interrupt() interrupt 1//定时器0产生38K方波        (中断部分由质疑,因为改为12MHZ)
{
        TR_DATA=~TR_DATA;//不断取反
        TR0=1;
}
接收部分:
#include<reg52.h>
sbit RE_DATA=P2^6;
sbit LED=P2^7;//红外测试LED
unsigned char  Recived_Data = 0;//接收脚
void delay_ms(unsigned int  n)//0.5毫秒
{
    unsigned int i=106;
    for(;n>0;n--)
        {
            while(i--);
                i=106;
        }
}
void CheckRE(void)
{
    unsigned char i;
        Recived_Data = 0;
    delay_ms(3);          //延迟1.5ms
        if(RE_DATA==1)return; //没有出现足够的9ms低电平出错
        delay_ms(14);                  //延迟7 ms,再加上前面的1.5ms达到延迟8.5ms
        if(RE_DATA==1)return;  //高电平,没达到9ms的低电平时间,出错

        while(!RE_DATA);      //等待出现5ms高电平的开始信号,即等待RE_DATA=1
        delay_ms(3);          //延迟1.5ms
        if(RE_DATA==0)return; //没到5 ms就出现低电平,出错返回
        delay_ms(6);          //延迟3 ms,加上前面的1.5ms达到延迟4.5ms
        if(RE_DATA==0)return; //低电平没达到5ms出错

        while(RE_DATA);                  //等待出现低电平,即等待数据发送
        for(i=0;i<8;i++)
        {
            while(!RE_DATA);    //等待出现低电平,即等待1ms的38KHz脉冲
                delay_ms(3);      //延迟1.5ms(加上其他指令接近2ms即接收信号0所经历的时间)
                                  //由于发送的时候硬件把电平反相了,所以解码的时候也要反相处理相处理
                if(RE_DATA==0)    //RE_DATA==0即下一位数据信号已来到,接收到的信号是接收信号"0"该位就是则红外发射发射的发射信号"1"
                {                                 
                     Recived_Data|=(1<<i); /*注意!!是或等于,把接收回来的数据再反相处理,反反得正,变为按键值*/
                }
                else        //1.5ms后仍是高电平即下一信号还没有来即接收信号是1,就是发射信号0                 
                {
                     while(RE_DATA);//等待出现低电平即等待数据0发送完毕
                }
        }
        while(!RE_DATA);
}
//主函数
void main()
{
        unsigned int n=0;
        RE_DATA=1;
    while(1)
          {
            
              while(RE_DATA);//等待出现低电平---由于发送时经过反相所以等待的是低电平
                   CheckRE();         //解码
                   if(Recived_Data==1)//反相为1111 1110
                  LED=0;//led发亮
                  else LED=1;//否则熄灭
          }


}
怎么也找不到错误,还是有请大家帮帮忙吧~~

使用特权

评论回复
19
老鱼探戈| | 2010-11-13 13:10 | 只看该作者
38k的红外线跟震荡频率没多大关系(只要不是太低)
一般都是用中断做,把中断溢出时间定为13us。中断一次取反一次IO就可以了。

注意在不发射38k时,在这段程序禁止,否则。。。。。。你应该知道的

使用特权

评论回复
20
5号工作室|  楼主 | 2010-11-13 18:13 | 只看该作者
19# 老鱼探戈 我试过了,本来用12MHZ产生中断,实验一下不行,改为24MHZ更准确的中断,程序如上面已发,但是还是不行,我主要用来验证一下是否能工作,发送部分为发送数字“1”过去,接收部分看是否能接收到1,接到就灯亮,接不到就不亮,研究了很久都找不出原因来,近乎崩溃了,唉~~~还是请大家帮帮忙吧。感谢,感谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

144

帖子

1

粉丝