单片机学习小组
直播中

qjqb

8年用户 1302经验值
擅长:5762
私信 关注

红外接收电路信号的调制与解调是如何完成的

怎样去设计一种红外接收电路呢?

红外接收电路的工作流程是怎样的?
红外接收电路信号的调制与解调是如何完成的?

回帖(1)

蒋荣艳

2022-2-15 10:34:23
1.红外接收电路

注意:P32同为外部中断0。
2.工作流程

3.信号的调制与解调
(1)信号的调制
通常使信号更好的被转输,发送端把基带二进制转换成脉冲信号,然后发送/

(2)解调
将脉冲信号重新转换为2进制等信号。
4.NEC协议
发送端的方波图与接收端的方波图正好相反
数据从最低位开始
5.NEC下的编码表示

(1)引导码
用于开始,先拉高9000us左右后拉低4500us左右
(2)用户码
用于查找用户,共16位。
(3)数据码
发送数据,共16位。
其中数据0为先拉高560us后拉低560us,共1125us
其中数据1为先拉高560us后拉低1680us,共2250us

所以可以用时间长短来判断为数据0/1,这里用的是外部中断0

#include
unsigned char Irtime;       //储存检测红外高低电平持续时间
unsigned char Ircord[4];    //储存解码后的四个大字节,用户码16位2字节与数据码16位2字节
unsigned char Irdate[33];   //包含起始码在内的33位,用于收集0与1的数据
bit Irok4=0;                   //解码后的4个字节数据接受完成标志位
bit Irok33=0;                     //33位数据接收完成标志位
//初始化定时器0.外部中断0,串口
void first1()
{
        TMOD |= 0x02;   //设置定时器0工作模式二。8位自动重装
        TL0 = TH0 = 0; //定时器0溢出一次,加到255个机器周期
        EA = 1;         //开启总开关
        ET0 = 1;       //定时器0开关
        TR0 = 1;       //启动定时器0
       
        IT0 = 1;        //设置外部中断0跳边沿触发方式
        EX0 = 1;        //开外部中断0中断  
        TMOD |= 0x20;   //设置定时器1工作模式二。8位zid重装
        TL1 = TH1 = 0xfd; //9600HZ
        SM1 = 1;        //设置串口工作模式1,10位异步收发
        TR1 = 1;         
}
//定时器0中断,每中断1次要256个机器周期,即277.46us
void time0() interrupt 1    //277.76us
{
        Irtime++;             //每277.46us加一次
}
//外部中断0的,由下降沿引起,读取33次脉宽
void time1() interrupt 0
{
        static unsigned char i; //用于33次数据计数
        static bit startflag ;//开始脉冲位
                if(startflag)
                {
                       
                        if(Irtime<53 && Irtime>30)  //判断引导码,就从第0位开始存
                        {
                                i = 0;
                        }
                        Irdate = Irtime;
                        Irtime = 0;
                        i++;
                        if(i==33)
                        {
                                Irok33 = 1;
                                i = 0;
                        }
                }
                else
                {
                        Irtime = 0;           //时间归0
                        startflag = 1;        //开始标志位置1
                }
}
void Ircordpro()
{
        unsigned char i,j,k;  //i控制4个字节,就控制8位,k控制33位脉宽
        k = 1;                //起始码不用,从1开始
        for(i=0;i<4;i++)
        {
                for(j=0;j<8;j++)
                {
                        if(Irdate[k]>5)   //大于5就是大于2250us,大于2250us就是数据1,位1的时间比位0时间大
                        {
                                Ircord |= 0x80;
                        }
                        if(j < 7)         
                        {
                                Ircord >>= 1;  //只能位移7次,8次数据就多移动了
                        }
                        k++;
                }
        }
        Irok4 = 1;
}
void main()
{
        unsigned char i; //计数串口发送字节
        first1();
        while(1)
        {
                if(Irok33==1)     //判断33次解码是否完成
                {
                        Ircordpro();//解码函数,存4个字节到Ircord[4]内
                        Irok33 = 0;//清33次脉宽的标志位,以便下次使用
                        if(Irok4==1)
                        {
                                for(i=0;i<4;i++)  //4个字节
                                {
                                        SBUF = Ircord;   //发送数据
                                        while(!TI);          //等待发送
                                        TI = 0;            //归0
                                }
                                Irok4==0; //清4个字节的标志位,以便下次使用
                        }
                 }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分