找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3223|回复: 18
收起左侧

关于MCU红外发射和接收能不能同时完成?

  [复制链接]
ID:134430 发表于 2020-11-5 11:05 | 显示全部楼层 |阅读模式
设计一个产品,其中用到红外开关,为防止干扰,采用红外一体头,为使程序简单,红外发射采用555产生38k载波,发射数据由单片机p10口提供,红外接收由外中断(p32)实现,原理图如下: 截图00.png

现在的问题是:不能接受。
分析:接收头正常(能接收一般遥控器的信号),红外发射管好像正常(检测到红外光),555可能正常(3端有高电平输出),
          可能是数据传输的问题:从程序分析,555调制发射应该是可以的,但是一旦外中断发生(此处是发射管的漫反射光被反射到接收管),
          中断程序开始执行,发射程序中止,因此中断程序不能接受到数据,只能接收到38k载波。
请问各位大侠:像这样的用一块单片机同时完成红外的发射和接收,能行吗?有什么办法实现本项目的红外开关目的?谢谢!
下面贴出程序的相关部分:
截图01.png


截图02.png 截图03.png
截图04.png
截图05.png
截图06.png



回复

使用道具 举报

ID:134430 发表于 2020-11-5 15:33 | 显示全部楼层
补充说明:发送数据里的4个数据是固定码,代替32位设备码和键码
回复

使用道具 举报

ID:283954 发表于 2020-11-5 23:45 | 显示全部楼层
既然是自己发自己收就不一定要照着别人的格式,你可以让发射管发射固定的38k间歇信号,比如10MS开,10MS关,接收管分析接收信号的周期,若符合就不是干扰信号,而产生间歇信号可以用单片机的一个定时器来完成,而且是用中断来控制,该定时器的中断权位比P3.2高,因此在P3.2中断期间输出信号不会中断。若还有其他定时器可用,应该用来产生38K信号直接输出到发射管,不必用555IC。
回复

使用道具 举报

ID:134430 发表于 2020-11-6 08:57 | 显示全部楼层
dalaoshi 发表于 2020-11-5 23:45
既然是自己发自己收就不一定要照着别人的格式,你可以让发射管发射固定的38k间歇信号,比如10MS开,10MS关 ...

谢谢了!但是,用定时器产生38k信号不是需要频繁中断吗?能否提供一个程序参考一下?再次谢谢!
回复

使用道具 举报

ID:134430 发表于 2020-11-6 09:08 | 显示全部楼层
dalaoshi 发表于 2020-11-5 23:45
既然是自己发自己收就不一定要照着别人的格式,你可以让发射管发射固定的38k间歇信号,比如10MS开,10MS关 ...

我最主要的疑问是:一个单片机能否实现红外的发和收?按君所言,定时器产生38k信号,在接收管接收时这个38k信号已经发送完毕,如何才能收到?这是我最不懂的地方。
回复

使用道具 举报

ID:382699 发表于 2020-11-6 10:18 来自手机 | 显示全部楼层
P1口好像漏了上拉电阻,那样的话555第4脚一直都是低电平,不能工作了!
回复

使用道具 举报

ID:573999 发表于 2020-11-6 10:18 | 显示全部楼层
理论上说是不能同时的,但芯片接收和发射用的时间特别短毫秒级的,给人的感觉像同时处理的,接收一般用定时器捕获或中断做接收。
回复

使用道具 举报

ID:283954 发表于 2020-11-6 14:09 | 显示全部楼层
STC12单片机有定时器输出口,定时器可以自己重装,有需要可以开中断,但产生38k无需中断。
再开一个定时器T1定时10ms, 这个要中断,每次中断反转TR0。
跑的时候,若TR0为1,接收管输入端产生中断,进入测量脉载波长度程序,过程中T1发生中断将TR0置0,载波消失,即获得载波长度,若与10ms相符则非干扰,大概是这样。


AUXR EQU 8EH
WAKE_CLKO EQU 08FH   

ORG 0000H

MOV WAKE_CLKO,#00000001B      ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
MOV AUXR, #11111100B              ;T0x12,T1x12,UART_M0x6,BRTRUN,S2SMOD,BRTx12,EXTRAM,S1BRS
MOV TMOD, #00100010B            ;TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
                                                ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)

MOV TL0, #111                 ;Tx12 111=38.2K OUTPUT AT P3.4
MOV TH0, #111
SETB TR0                         ;RUN T0
回复

使用道具 举报

ID:311846 发表于 2020-11-6 17:16 | 显示全部楼层
此时有个示波器你就比较好解决问题了,收发端口是否正常就可以检测出来,考虑中断是否会影响发数据,有没有办法避免,然后就是最好先用两个单片机先验证收发数据都可以了,再看怎么整合在一个单片机验证
回复

使用道具 举报

ID:134430 发表于 2020-11-10 10:44 | 显示全部楼层
感谢大家的指导!
我重新写了程序,自定义了协议,用555连续发送1、0码,接收端接收到一组1、0,即算成功。
程序在keil 上运行看不出毛病,但是搭实际电路,总不成功。
555的电阻电容参数根据555的软件求得,通过手工计算也对,因为没有示波器,不能最终验证38k。
现将程序和电路图贴出,请大家看看毛病在哪里?


/*------- 用555发生38k载波的红外发射、接收实验程序 -------------

        At89s52/STC89c52RC + 555 + (f=12)
       
        自定义红外协议:连续发送1,0,    1:10ms高电平,0:10ms低电平
                        接收端只要接收到一组1,0即算成功。
       
        555提供38k载波,
       
        发射管处于常发射状态,所以程序中没有发射函数.
       
        工作过程:发射管接收管处于漫反射状态,发射管不停地发射1、0,
                  当有物体将红外光反射到接收管时,外中断启动接收程序。
                  
//-------------------------------------------------------------*/

#include <reg52.h>

#define uchar unsigned char
#define uint16 unsigned int

sbit ir_se                =P1^0;
sbit ir_re      =P3^2;                //receive 接收,  接收管输出,与外中断复用!
#define ir_re_H                ir_re==1
#define ir_re_L                ir_re==0

sbit Led                =P3^3;                //代表具体应用

bit re_OK;                                        //接收成功标志

//------函数声明-------------
void Sever();
void ir_receive();


//==============================
void main()
{
        Sever();
        while(1)
        {        //主程序处于等待外中断(p32==0)
                if(re_OK==1)                //接收成功
                {
                        re_OK=0;
                        Led=0;
                }
//                EX0=1;
        }
}

//----------中断服务程序----------
void Sever()                                   
{
        //----- 定时器初始化 -----                          
    TMOD=0x21;              //定时器0工作方式1; (定时器1工作方式2: 暂不用)
          
        //----- 定时器0 :1ms计时,晶振=12 ----
    TH0=0xfc;               
    TL0=0x18;                                 
    ET0=1;                  //允许定时器0 中断
    TR0=1;                  //开定时器0中断, 本定时器常开!!

        //----- 外中断初始化 -----
    EX0=1;                  //允许外中断 0中断
        IT0=1;                  //外中断 0下降沿触发
//        PX0=1;                  //外中断 0优先

        //----- 开总中断 -----
    EA=1;                               
}


//----- 定时器0中断:红外发射管发射计时 -----
uchar  msForIr_se=0;                       
uchar  msForIr_re=0;

void Timer0() interrupt 1              
{
    TH0=0xfc;                                        //1ms 定时,初值
    TL0=0x18;

        msForIr_se++;
        if(msForIr_se>=10)
        {
                ir_se=~ir_se;
                msForIr_se=0;
        }
        msForIr_re++;                       

}

//========= 红外接收:外中断0 中断服务程序 (p32)============
void Extern0() interrupt 0      
{
        ir_receive();
}


//-------红外接收函数-------------

void ir_receive()
{
        uchar i;

        EX0=0;
        msForIr_re=0;                                //低电平开始计时

        for(i=2;i>0;i--)
        {
                while(ir_re_L);                        //等待高电平
                if(msForIr_re>=8)                //检查高电平之前的低电平持续时间,
                                        //每个1,0码发送时间但是10ms,所以这里取8ms
                {
                        msForIr_re=0;                //高电平开始计时

                        while(ir_re_H);                //等待低电平
                        if(msForIr_re>=8)        //检查低电平之前的高电平持续时间,
                        {
                                msForIr_re=0;        //低电平开始计时
                                re_OK=1;                //高、低电平都接收到
                        }
                }
                if(re_OK==1)                        //只要接收到一组1,0,就终止程序
                        break;
        }
        EX0=1;                                                //重开中断
}



下面是电路图,发送的数据由p10提供,分别接与1、2、3、4处试验,都不能成功
截图07.png

回复

使用道具 举报

ID:450849 发表于 2020-11-10 11:32 | 显示全部楼层
wh8010jky 发表于 2020-11-6 09:08
我最主要的疑问是:一个单片机能否实现红外的发和收?按君所言,定时器产生38k信号,在接收管接收时这个3 ...

完全可以做到,最主要的是你发射和接受不能用堵塞式延时。
回复

使用道具 举报

ID:841476 发表于 2020-11-10 12:54 | 显示全部楼层
楼上说得对:理论上说是不能同时的,但芯片接收和发射用的时间特别短毫秒级的,给人的感觉像同时处理的,接收一般用定时器捕获或中断做接收。其实实际上没有做到同时,但对人来说也差不多了
回复

使用道具 举报

ID:283954 发表于 2020-11-10 16:09 | 显示全部楼层
你得首先确定555发射的38K信号能让P3.2产生中断,反射式红外线距离是很短的,用万用表量一下P3.2脚就能看出,或者在中断入口处点亮一颗LED指示灯也能测出。
回复

使用道具 举报

ID:134430 发表于 2020-11-16 19:04 | 显示全部楼层
本帖最后由 wh8010jky 于 2020-11-17 00:14 编辑

最近,一直做红外发射接收的试验,今天终于成功了,现将结果公布:
一、程序:
截图03.png


截图04.png


截图05.png


截图06.png


二、电路图:

截图01.png

电路图中元件的说明:
发射管电阻:500~700,这里选用680时,工作电流2.5mA,作用距离20cm,
                     电阻太小,电流很大,并且直接干扰接收管,出现“没有遮挡物,一体头就收到信号”。
555的电阻实际是7.93k,  和18.73k

三、体会:
用一块单片机实现红外的发射和接收是不可行的。(上面的例子单片机没有干预红外发射)
原因是单片机不能同时控制发射和接收过程,有朋友认为红外发射和接收都是ms级的,
人根本感觉不到,这是对的,但是单片机能感觉到,红外光从发射管到接收管的时间是什么级的
大家有概念,当接收管启动时发射管已经停止,先前发射的红外光早已飞到无限远,
如果一直有遮挡物在适当位置,由于接收程序滞后,接收管未启动,红外光也“失效”了。
试验中写过用两块单片机分别控制发射和接收程序,试验很成功,但将两个程序结合由一块单片机
控制就失败了,具体以后再发布。

以上认识如有不当,请指正,并希望看到更多的方案。

感谢各位参与本帖讨论,从讨论中吸取了各位的经验!










评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:134430 发表于 2020-11-17 01:25 | 显示全部楼层
wh8010jky 发表于 2020-11-16 19:04
最近,一直做红外发射接收的试验,今天终于成功了,现将结果公布:
一、程序:

刚刚觉得程序还可简化,现将简化后的程序贴出 截图07.png


截图08.png


截图09.png

回复

使用道具 举报

ID:89515 发表于 2020-11-17 08:54 来自手机 | 显示全部楼层
没这样做过,但是理论上是可行的。38khz频率,周期26us可以执行很多指令。使用32位单片机(8位高速也行),用两个定时器来做应该可行。如果模拟nec协议,脉宽是100us级的就更没问题了。用接收数据的定时器控制发送数据的定时器,考虑优先级,接收数据脉宽范围,时间精度等。
回复

使用道具 举报

ID:685385 发表于 2020-11-17 08:56 | 显示全部楼层
这是NEC协议,你程序代码的时间设置不对,就是判断时间,你多测试几次就可以了,重要的是你的载波发生一定要正确
回复

使用道具 举报

ID:342954 发表于 2020-11-17 09:46 | 显示全部楼层
程序设计思想问题,发送和接收用中断,
回复

使用道具 举报

ID:342954 发表于 2020-11-17 09:47 | 显示全部楼层
接收时,脉充宽度,做一个容差
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表