精华内容
下载资源
问答
  • 下面分别介绍这几种编码方式。 (1) 不归零编码 不归零编码在一个比特时间内电平保持不变,这种编码方式容易实现。 缺点是:存在直流分量,传输中不能使用变压器;不具备自同步机制,传输时必须使用同步。

    数据编码是指通信系统中以何种物理信号的形式表达数据。目前在汽车网络中常用的编码方式有:不归零编码(NRZ)、曼切斯特编码(Manchester)、可变脉宽调制(VPW)、脉宽调制(PWM)等。下面分别介绍这几种编码方式。

    (1) 不归零编码

    不归零编码在一个比特时间内电平保持不变,这种编码方式容易实现。

    缺点是:存在直流分量,传输中不能使用变压器;不具备自同步机制,传输时必须使用外同步。

    (2) 曼切斯特编码

    在改编码方式中,将时间划分成等间隔的小段,每个小段代表一个比特。同时,每个小段时间又分成两半,前半个时间段表示所传输比特值得反码,后半段表示传输比特值本身。因此,在一个比特的时间段的中心点上总有一次电平转变,所以和脉宽调制编码一样,此类编码也不需要传输同步信号。

    (3) 可变脉宽调制编码

    在该编码中,每位数据由两个连续跳变的时间和电平共同决定,并且两位连续比特的电平是不相同的。

    (4) 脉宽调制编码

    在该编码中,每位数据有PWM信号的占空比决定。PWM信号的频率决定了位传输速率,而相应的脉冲宽度决定了传输数据的值。通常占空比为1/3时表示传输的值为逻辑“1”,占空比为2/3时表示传输的值为逻辑“0”。因此,传输数据的每一位内必定有一次电平的转变,故该类编码携带有信号传输的同步信息,不需要另外传输同步信号。

    展开全文
  • 红外遥控解码程序

    2018-06-15 15:07:00
    红外接收有几种统一编码方式,采样哪种编码方式取决于遥控器使用芯片,接收头收到都是一样。 电视遥控器使用是专用集成发射芯片来实现遥控码发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号...

     

    红外接收头的型号有很多HS0038 VS838等 功能大致相同,只是引脚封装不同。

    红外接收有几种统一的编码方式,采样哪种编码方式取决于遥控器使用的芯片,接收头收到的都是一样的。

    电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放大、驱动红外发射管将信号发射出去。不同公司的遥控芯片,采样的遥控码格式也不一样,较普遍的有两种,一种NEC标准,一种是PHILIPS标准。

    NEC标准:遥控载波的频率为38KHz(占空比1:3)当某个键按下时,系统首先发射一个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。
    一个完整的全码 = 引导码 +用户码 +用户码 + 数据码 + 数据码 + 数据反码。

    其中,引导码高电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为用户识别码,能区别不同的红外遥控设备,以防止不同的机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行上面动作的判断。

    连发代码是在持续按键时发送的码。它告知接收端。某键是在被连续的按着。

    NEC标准下的发射码表示
    发射数据0时用”0.56ms高电平 + 0.565ms低电平 = 1.125ms”表示;
    数据1用”高电平0.56ms + 1.69ms = 2.25ms”表示。
    遥控器发射信号:

     

     

    需要注意的是:当一体化接收头收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以一体化接收头输出的波形和发射波形是反向的

    PHILIPS标准:
    载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。
    一个全码 = 起始码’11’ +控制码 + 用户码 + 用户码
    数据0用“低电平1.778ms + 高电平1.778ms”表示;
    数据1用“高电平1.778ms + 低电平1.778ms”表示。
    连续码重复延时114ms。

    所谓的解码就是一个区分脉冲宽度的过程。红矮信号的0和1是通过脉冲持续时间的长短来区分的,

    我的遥控器使用的是NEC标准的WD6122芯片,遥控器编码如下:

     

    以下是我用1602显示红外接收头接收到编码的程序:
    ①这个是对1602操作的函数

    ------------------------------------------------*/
    #include "1602.h"
    #include "delay.h"
    
    #define CHECK_BUSY
    
    
    sbit RS = P2^4;   //定义端口 
    sbit RW = P2^5;
    sbit EN = P2^6;
    
    #define RS_CLR RS=0 
    #define RS_SET RS=1
    
    #define RW_CLR RW=0 
    #define RW_SET RW=1 
    
    #define EN_CLR EN=0
    #define EN_SET EN=1
    
    #define DataPort P0
    
    /*------------------------------------------------
                  判忙函数
    ------------------------------------------------*/
     bit LCD_Check_Busy(void) 
     { 
    #ifdef CHECK_BUSY
     DataPort= 0xFF; 
     RS_CLR; 
     RW_SET; 
     EN_CLR; 
     _nop_(); 
     EN_SET;
     return (bit)(DataPort & 0x80);
    #else
     return 0;
    #endif
     }
    /*------------------------------------------------
                  写入命令函数
    ------------------------------------------------*/
     void LCD_Write_Com(unsigned char com) 
     {  
    // while(LCD_Check_Busy()); //忙则等待
     DelayMs(5);
     RS_CLR; 
     RW_CLR; 
     EN_SET; 
     DataPort= com; 
     _nop_(); 
     EN_CLR;
     }
    /*------------------------------------------------
                  写入数据函数
    ------------------------------------------------*/
     void LCD_Write_Data(unsigned char Data) 
     { 
     //while(LCD_Check_Busy()); //忙则等待
     DelayMs(5);
     RS_SET; 
     RW_CLR; 
     EN_SET; 
     DataPort= Data; 
     _nop_();
     EN_CLR;
     }
    
    
    /*------------------------------------------------
                    清屏函数
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     LCD_Write_Com(0x01); 
     DelayMs(5);
     }
    /*------------------------------------------------
                  写入字符串函数
    ------------------------------------------------*/
     void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
     {     
     if (y == 0) 
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
     else 
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
     while (*s) 
        {     
     LCD_Write_Data( *s);     
     s ++;     
        }
     }
    /*------------------------------------------------
                  写入字符函数
    ------------------------------------------------*/
    /* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
     {     
     if (y == 0) 
        {     
        LCD_Write_Com(0x80 + x);     
        }    
     else 
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
     LCD_Write_Data( Data);  
     }*/
    /*------------------------------------------------
                  初始化函数
    ------------------------------------------------*/
     void LCD_Init(void) 
     {
       LCD_Write_Com(0x38);    /*显示模式设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38);  
       LCD_Write_Com(0x08);    /*显示关闭*/ 
       LCD_Write_Com(0x01);    /*显示清屏*/ 
       LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x0C);    /*显示开及光标设置*/
       }
    

     

     

    ②延时函数

    #include "delay.h"
    /*------------------------------------------------
     uS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
     长度如下 T=tx2+5 uS 
    ------------------------------------------------*/
    void DelayUs2x(unsigned char t)
    {   
     while(--t);
    }
    /*------------------------------------------------
     mS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编
    ------------------------------------------------*/
    void DelayMs(unsigned char t)
    {
    
     while(t--)
     {
         //大致延时1mS
         DelayUs2x(245);
         DelayUs2x(245);
     }
    }

     

     

    ③以下是主函数

    #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    #include"1602.h"
    #include"delay.h"
    
    sbit IR=P3^2;  //红外接口标志
    
    char code Tab[16]="0123456789ABCDEF";
    /*------------------------------------------------
                    全局变量声明
    ------------------------------------------------*/
    
    unsigned char  irtime;//红外用全局变量
    
    bit irpro_ok,irok;
    unsigned char IRcord[4];
    unsigned char irdata[33];
    
    unsigned char TempData[16];
    /*------------------------------------------------
                      函数声明
    ------------------------------------------------*/
    void Ir_work(void);
    void Ircordpro(void);
    
    /*------------------------------------------------
                      定时器0中断处理
    ------------------------------------------------*/
    
    void tim0_isr (void) interrupt 1 using 1
    {
      irtime++;  //用于计数2个下降沿之间的时间
    }
    
    /*------------------------------------------------
                      外部中断0中断处理
    ------------------------------------------------*/
    void EX0_ISR (void) interrupt 0 //外部中断0服务函数
    {
      static unsigned char  i;             //接收红外信号处理
      static bit startflag;                //是否开始处理标志位
    
    if(startflag)                         
       {
        if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                            i=0;
                irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                irtime=0;
                i++;
                 if(i==33)
                    {
                     irok=1;
                     i=0;
                    }
              }
         else
            {
            irtime=0;
            startflag=1;
            }
    
    }
    
    /*------------------------------------------------
                    定时器0初始化
    ------------------------------------------------*/
    void TIM0init(void)//定时器0初始化
    {
    
      TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
      TH0=0x00; //重载值
      TL0=0x00; //初始化值
      ET0=1;    //开中断
      TR0=1;    
    }
    /*------------------------------------------------
                      外部中断0初始化
    ------------------------------------------------*/
    void EX0init(void)
    {
     IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
     EX0 = 1;   //使能外部中断
     EA = 1;    //开总中断
    }
    /*------------------------------------------------
                      键值处理
    ------------------------------------------------*/
    
    void Ir_work(void)
    {
           TempData[0] = Tab[IRcord[0]/16];   //处理客户码
           TempData[1] = Tab[IRcord[0]%16];
           TempData[2] = '-';
           TempData[3] = Tab[IRcord[1]/16];   //处理客户码
           TempData[4] = Tab[IRcord[1]%16];
           TempData[5] = '-';
           TempData[6] = Tab[IRcord[2]/16];   //处理数据码
           TempData[7] = Tab[IRcord[2]%16];
           TempData[8] = '-';
           TempData[9] = Tab[IRcord[3]/16];   //处理数据反码
           TempData[10] = Tab[IRcord[3]%16];
    
           LCD_Write_String(5,1,TempData);
    
           irpro_ok=0;//处理完成标志
    
      }
    /*------------------------------------------------
                    红外码值处理
    ------------------------------------------------*/
    void Ircordpro(void)//红外码值处理函数
    { 
      unsigned char i, j, k;
      unsigned char cord,value;
    
      k=1;
      for(i=0;i<4;i++)      //处理4个字节
         {
          for(j=1;j<=8;j++) //处理1个字节8位
             {
              cord=irdata[k];
              if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
                 value|=0x80;
              if(j<8)
                {
                 value>>=1;
                }
               k++;
             }
         IRcord[i]=value;
         value=0;     
         } 
         irpro_ok=1;//处理完毕标志位置1
    }
    
    /*------------------------------------------------
                        主函数
    ------------------------------------------------*/
    void main(void)
    {
     EX0init();            //初始化外部中断
     TIM0init();           //初始化定时器
    
     LCD_Init();           //初始化液晶
     DelayMs(20);          //延时有助于稳定
     LCD_Clear();          //清屏
    
     LCD_Write_String(0,0,"www.doflye.net");
     LCD_Write_String(0,1,"Code:");
    
     while(1)//主循环
       {
        if(irok)                        //如果接收好了进行红外处理
          {   
           Ircordpro();
           irok=0;
          }

     

    
    
        if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
          {
           Ir_work();
          }
       }
    }


    转载于:https://www.cnblogs.com/fengliu-/p/9187382.html

    展开全文
  • 红外遥控系统原理附51单片机软件解码程序

    万次阅读 多人点赞 2016-04-11 00:36:44
    红外接收有几种统一编码方式,采样哪种编码方式取决于遥控器使用芯片,接收头收到都是一样。电视遥控器使用是专用集成发射芯片来实现遥控码发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号发射...

    红外接收头的型号有很多HS0038 VS838等 功能大致相同,只是引脚封装不同。

    红外接收有几种统一的编码方式,采样哪种编码方式取决于遥控器使用的芯片,接收头收到的都是一样的。

    电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放大、驱动红外发射管将信号发射出去。不同公司的遥控芯片,采样的遥控码格式也不一样,较普遍的有两种,一种NEC标准,一种是PHILIPS标准。

    NEC标准:遥控载波的频率为38KHz(占空比1:3)当某个键按下时,系统首先发射一个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。
    一个完整的全码 = 引导码 +用户码 +用户码 + 数据码 + 数据码 + 数据反码。
    红外接收编码

    其中,引导码高电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为用户识别码,能区别不同的红外遥控设备,以防止不同的机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行上面动作的判断。

    连发代码是在持续按键时发送的码。它告知接收端。某键是在被连续的按着。

    NEC标准下的发射码表示
    发射数据0时用”0.56ms高电平 + 0.565ms低电平 = 1.125ms”表示;
    数据1用”高电平0.56ms + 1.69ms = 2.25ms”表示。
    遥控器发射信号:
    遥控器发射信号

    一体化接收头接收到信号

    需要注意的是:当一体化接收头收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以一体化接收头输出的波形和发射波形是反向的

    PHILIPS标准:
    载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。
    一个全码 = 起始码’11’ +控制码 + 用户码 + 用户码
    数据0用“低电平1.778ms + 高电平1.778ms”表示;
    数据1用“高电平1.778ms + 低电平1.778ms”表示。
    连续码重复延时114ms。

    所谓的解码就是一个区分脉冲宽度的过程。红矮信号的0和1是通过脉冲持续时间的长短来区分的,

    我的遥控器使用的是NEC标准的WD6122芯片,遥控器编码如下:
    遥控器键位编码

    以下是我用1602显示红外接收头接收到编码的程序:
    ①这个是对1602操作的函数

    ------------------------------------------------*/
    #include "1602.h"
    #include "delay.h"
    
    #define CHECK_BUSY
    
    
    sbit RS = P2^4;   //定义端口 
    sbit RW = P2^5;
    sbit EN = P2^6;
    
    #define RS_CLR RS=0 
    #define RS_SET RS=1
    
    #define RW_CLR RW=0 
    #define RW_SET RW=1 
    
    #define EN_CLR EN=0
    #define EN_SET EN=1
    
    #define DataPort P0
    
    /*------------------------------------------------
                  判忙函数
    ------------------------------------------------*/
     bit LCD_Check_Busy(void) 
     { 
    #ifdef CHECK_BUSY
     DataPort= 0xFF; 
     RS_CLR; 
     RW_SET; 
     EN_CLR; 
     _nop_(); 
     EN_SET;
     return (bit)(DataPort & 0x80);
    #else
     return 0;
    #endif
     }
    /*------------------------------------------------
                  写入命令函数
    ------------------------------------------------*/
     void LCD_Write_Com(unsigned char com) 
     {  
    // while(LCD_Check_Busy()); //忙则等待
     DelayMs(5);
     RS_CLR; 
     RW_CLR; 
     EN_SET; 
     DataPort= com; 
     _nop_(); 
     EN_CLR;
     }
    /*------------------------------------------------
                  写入数据函数
    ------------------------------------------------*/
     void LCD_Write_Data(unsigned char Data) 
     { 
     //while(LCD_Check_Busy()); //忙则等待
     DelayMs(5);
     RS_SET; 
     RW_CLR; 
     EN_SET; 
     DataPort= Data; 
     _nop_();
     EN_CLR;
     }
    
    
    /*------------------------------------------------
                    清屏函数
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     LCD_Write_Com(0x01); 
     DelayMs(5);
     }
    /*------------------------------------------------
                  写入字符串函数
    ------------------------------------------------*/
     void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
     {     
     if (y == 0) 
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
     else 
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
     while (*s) 
        {     
     LCD_Write_Data( *s);     
     s ++;     
        }
     }
    /*------------------------------------------------
                  写入字符函数
    ------------------------------------------------*/
    /* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
     {     
     if (y == 0) 
        {     
        LCD_Write_Com(0x80 + x);     
        }    
     else 
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
     LCD_Write_Data( Data);  
     }*/
    /*------------------------------------------------
                  初始化函数
    ------------------------------------------------*/
     void LCD_Init(void) 
     {
       LCD_Write_Com(0x38);    /*显示模式设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38);  
       LCD_Write_Com(0x08);    /*显示关闭*/ 
       LCD_Write_Com(0x01);    /*显示清屏*/ 
       LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x0C);    /*显示开及光标设置*/
       }
    

    ②延时函数

    #include "delay.h"
    /*------------------------------------------------
     uS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
     长度如下 T=tx2+5 uS 
    ------------------------------------------------*/
    void DelayUs2x(unsigned char t)
    {   
     while(--t);
    }
    /*------------------------------------------------
     mS延时函数,含有输入参数 unsigned char t,无返回值
     unsigned char 是定义无符号字符变量,其值的范围是
     0~255 这里使用晶振12M,精确延时请使用汇编
    ------------------------------------------------*/
    void DelayMs(unsigned char t)
    {
    
     while(t--)
     {
         //大致延时1mS
         DelayUs2x(245);
         DelayUs2x(245);
     }
    }

    ③以下是主函数

    #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    #include"1602.h"
    #include"delay.h"
    
    sbit IR=P3^2;  //红外接口标志
    
    char code Tab[16]="0123456789ABCDEF";
    /*------------------------------------------------
                    全局变量声明
    ------------------------------------------------*/
    
    unsigned char  irtime;//红外用全局变量
    
    bit irpro_ok,irok;
    unsigned char IRcord[4];
    unsigned char irdata[33];
    
    unsigned char TempData[16];
    /*------------------------------------------------
                      函数声明
    ------------------------------------------------*/
    void Ir_work(void);
    void Ircordpro(void);
    
    /*------------------------------------------------
                      定时器0中断处理
    ------------------------------------------------*/
    
    void tim0_isr (void) interrupt 1 using 1
    {
      irtime++;  //用于计数2个下降沿之间的时间
    }
    
    /*------------------------------------------------
                      外部中断0中断处理
    ------------------------------------------------*/
    void EX0_ISR (void) interrupt 0 //外部中断0服务函数
    {
      static unsigned char  i;             //接收红外信号处理
      static bit startflag;                //是否开始处理标志位
    
    if(startflag)                         
       {
        if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                            i=0;
                irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                irtime=0;
                i++;
                 if(i==33)
                    {
                     irok=1;
                     i=0;
                    }
              }
         else
            {
            irtime=0;
            startflag=1;
            }
    
    }
    
    /*------------------------------------------------
                    定时器0初始化
    ------------------------------------------------*/
    void TIM0init(void)//定时器0初始化
    {
    
      TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
      TH0=0x00; //重载值
      TL0=0x00; //初始化值
      ET0=1;    //开中断
      TR0=1;    
    }
    /*------------------------------------------------
                      外部中断0初始化
    ------------------------------------------------*/
    void EX0init(void)
    {
     IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
     EX0 = 1;   //使能外部中断
     EA = 1;    //开总中断
    }
    /*------------------------------------------------
                      键值处理
    ------------------------------------------------*/
    
    void Ir_work(void)
    {
           TempData[0] = Tab[IRcord[0]/16];   //处理客户码
           TempData[1] = Tab[IRcord[0]%16];
           TempData[2] = '-';
           TempData[3] = Tab[IRcord[1]/16];   //处理客户码
           TempData[4] = Tab[IRcord[1]%16];
           TempData[5] = '-';
           TempData[6] = Tab[IRcord[2]/16];   //处理数据码
           TempData[7] = Tab[IRcord[2]%16];
           TempData[8] = '-';
           TempData[9] = Tab[IRcord[3]/16];   //处理数据反码
           TempData[10] = Tab[IRcord[3]%16];
    
           LCD_Write_String(5,1,TempData);
    
           irpro_ok=0;//处理完成标志
    
      }
    /*------------------------------------------------
                    红外码值处理
    ------------------------------------------------*/
    void Ircordpro(void)//红外码值处理函数
    { 
      unsigned char i, j, k;
      unsigned char cord,value;
    
      k=1;
      for(i=0;i<4;i++)      //处理4个字节
         {
          for(j=1;j<=8;j++) //处理1个字节8位
             {
              cord=irdata[k];
              if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
                 value|=0x80;
              if(j<8)
                {
                 value>>=1;
                }
               k++;
             }
         IRcord[i]=value;
         value=0;     
         } 
         irpro_ok=1;//处理完毕标志位置1
    }
    
    /*------------------------------------------------
                        主函数
    ------------------------------------------------*/
    void main(void)
    {
     EX0init();            //初始化外部中断
     TIM0init();           //初始化定时器
    
     LCD_Init();           //初始化液晶
     DelayMs(20);          //延时有助于稳定
     LCD_Clear();          //清屏
    
     LCD_Write_String(0,0,"www.doflye.net");
     LCD_Write_String(0,1,"Code:");
    
     while(1)//主循环
       {
        if(irok)                        //如果接收好了进行红外处理
          {   
           Ircordpro();
           irok=0;
          }
    
        if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
          {
           Ir_work();
          }
       }
    }
    展开全文
  • 通信系统设计

    2019-01-16 09:42:50
    着重关注模拟通信系统中的调制解调系统基本原理以及抗噪声性能,并在MATLAB软件平台上仿真实现几种常见的调制方式。最常用最重要模拟调制方式是用正弦波作为载波幅度调制和角度调制。通信系统一般模型实现...
  • 对ISAR干扰有效方式是欺骗干扰。但是,传统欺骗干扰技术(如有源、无源诱饵)对成像雷达是无效,因为这些干扰仅使普通雷达产生虚假目标位置参数(如目标方位角、仰角、目标距离和速度等),而不能改变...
  • 目前最常见的几种无线通信系统,除了蓝牙系统不用OFDM,第四代移动通信(4G)的两种标准LTE和WiMAX都使用这种调制方式【注一】,取代了第三代中使用的CDMA。目前已经非常普及的无线局域网标准(I

    原文地址:http://blog.sciencenet.cn/blog-309766-504056.html

    在以前的讲座中,我们介绍了无线电信号调制的基本原理,有关数字传送速度极限的香农定理,以及为了实现香农极限而发明的种种信道编码方式。在本文中,我们来介绍一种独特的,也是当前最流行的调制方式:OFDM。目前最常见的几种无线通信系统,除了蓝牙系统不用OFDM外,第四代移动通信(4G)的两种标准LTE和WiMAX都使用这种调制方式【注一】,取代了第三代中使用的CDMA。目前已经非常普及的无线局域网标准(IEEE802.11)也采用OFDM【注二】。

    OFDM的全名非常拗口:正交频分复用调制(Orthogonal Frequency-Division Modulation)。它是最新出现的调制方式,目前还有很多研究论文发表。但看了以下的介绍后,你会同意:其实它的原理并不深奥,反而是简化通信系统的一个好办法呢!

    在详细谈OFDM之前,让我们先复习一下第一讲中讲过的调制的基本概念。调制就是根据要传送的数据来改变发射的电波(称为载频)的幅度和相位,以达到传送信息的目的。每个调制的单位称为波特(baud)每个波特控制一段时间的载频。这个时间的倒数也就是单位时间里传送的波特数,称为波特率。经过调制的载波称为信号。

     

    信号可以表达为一个随时间变化的量,也可以用它的频率分量(称为频谱)来表达。这两种表达通过傅立叶变换而联系在一起。傅立叶变换本身就是个奇妙无穷的数学工具。在这里只能列举几个以下要用到的性质。首先,时间信号的变化速度(一般来说正比于波特率)正比于频谱的宽度(称为带宽)。这就是第一讲中提到的那奎斯特定理。其次,一个信号在时间上的延迟,等价于在它的频谱上加一个与频率成正比的相位差。而这后一点,正是OFDM用以简化通信系统的妙方。

     

    复习完之后,我们需要引进一个以前没有讨论过的问题:信道。信道(channel)是指信号从发射器到接收器之间经历的变化。在以前的讲座中,我们都采用最简单的信道:信号除了被加上一个随机噪声以外,没有任何变化。但实际的无线信道通常不是如此。发射器发出的电波除了直接传播到接收器外,还可以通过大楼,高山和其他物体的反射和散射而到达接收器。这些通过不同路径传播的电波使得接收器里产生了多个“版本”的信号,他们之间有相对的时间延迟。这样,前一个波特“迟到”的版本就会叠加在后一个波特上,而造成干扰,称为多路径干扰。更要命的是,这样的干扰与噪声不同,不能用增加信号功率的方法来克服,因为干扰本身就是信号造成的,它的强度随着信号功率的增加而增加。这很像我们在一间空屋子里说话,由于回音,使我们说的话变得含混不清。

    多路径干扰很久前就引起了人们的注意。在上世纪六十年代,人们发明了“判决反馈均衡器(Decision Feedback Equalizer,DFE)”,被认为是纠正多路径干扰的最优方法。它是利用两个滤波器来抵消多路径的干扰。但是这个方法与信道编码一起使用时相当困难。在九十年代以后信道编码的增益大大增加(见第三讲),也使得DFE的使用更加受限。

    另一个对付“多路径”的思路,就是降低波特率。当一个波特的时间长度远远大于多路径之间的相对延迟时,这种延迟就不重要了。这就像在有回音的时候说话,我们会自觉不自觉地放慢速度一样。当然降低了波特率,数据传送的速度也就低了。这个代价可是太大了。但是且慢!根据前面说到的奈奎斯特定理,波特率低了,信号的带宽就窄了。也就是说,同样的频率范围以前传送一路信号的,现在可以传送多路信号了。这样数据传送速度不就又回来了吗?理论上的确是这样。可是在实际上,信号的频谱并不是出了带宽范围就降到零的,而是有个逐渐降低的范围(称为副瓣,sidelobe)。所以为了避免相互干扰,各个信号的频率范围之间要留出一定的保护间隔。而这就降低了频率使用的总体效率,从而降低了数据传送速度。

     

    幸好,傅立叶变换的理论告诉我们,在一定的条件下,虽然有副瓣的存在,但相邻频道的干扰可以是零,即使没有保护间隔。这就是OFDM中那个O(正交)的含义。于是,把整个频率范围分为多个子频道的思路,就带来了OFDM这种新的调制方法。更幸运的是:由于一种名为“快速傅立叶变换(FFT)”的算法,使得这种调制可以高效率地实现。

     

    OFDM是1970年代正式提出的。在上世纪八十,九十年代被应用于有线数字通信(那里也有信道延迟带来的问题)。在有线宽带接入技术ADSL和HDSL中就是使用这种调制方式(被称为数字多频,DMT)。在九十年代后逐步开始OFDM在无线领域的应用,而终于在今天成为局域网和第四代移动网的主流技术。

     

    在发射端,OFDM信号是这样形成的。被调制的数字被分成很多数据流,每个用来调制一个子载频。(调制的方法可以是在第一讲中谈到的任何一种方法,但通常都使用正交幅度(QAM)调制。)在每个调制周期,每个子载频产生一个复数值(即被调制过的振幅和相位)。这组代表频谱的复数值经过反傅立叶变换,就形成时间域上的一段信号(我们称为一个OFDM符号)。在接收端,信号经历相反的过程:一个OFDM符号经过傅立叶变换变成频率域上的一组复数。每个复数经过解调,恢复被传送的数字。

     

    上面说到,由于每个子频道的波特率(也就是OFDM符号传送的速度)很低,多路径之间的相对延迟对它造成的干扰很小。事实上,数学上可以证明,多路径干扰在一个OFDM符号内部的效果只是把每个子频道上的复数乘以一个复数因子。(这是因为前面说的,一个信号在时间上的延迟,等价于在它的频谱上加一个与频率成正比的相位差。)这在接收端可以很容易修正过来。但是,多路径之间的延迟会造成OFDM符号之间的干扰,也就是前一个OFDM符号的信号由于延迟而与后一个符号混在一起。为此,需要在OFDM符号之间加入“安全间隔”,其长度大于多路径延迟的最大值。由于OFDM符号本身可以很长(原始的波特率乘以子载频的数目),这个“安全间隔”对传送效率的影响是很小的。有了安全间隔后,OFDM完全消除了多路径干扰。【注三】

    除了上面介绍的对付多路径造成的干扰外,OFDM还给在频率上控制传送信号带来很大的方便。例如,如果在某些频率上遇到强烈的干扰,OFDM系统可以在相应的子载频采用抗干扰能力更强的调制方式,或者干脆不用那些子载频而把有限的发射功率用到别的频率上。反之,为了避免干扰其它窄频的用户,OFDM也可以“关闭”一段子载频而在其它频率上通信。在多用户分享频道的情况下,OFDM更有其优势。这时,我们称之为正交频分多址(Orthogonal Frequency-division multiple access, OFDMA)。在这种制式下,我们可以把不同的子载频分配给不同的用户。这种分配不影响发射和接收端的基本设置所以可以快速改变。因此,系统可以根据实时的数据量随时调整资源配置,而且可以根据各个用户信道的情况分配给他们条件最好(衰减最小,噪声最小)的频段。

    当然从理论上说, OFDM并非革命性的进展。它的性能与其他调制方式在理论上是一样的。上面说到的种种功能,其他调制方式也能做到。但在实践上,OFDM对这些功能的支持要容易得多。特别值得一提的是,当采用多天线通信技术(下一讲要介绍)时,不用OFDM的话处理多路径问题会非常复杂。在这种情况下,OFDM几乎是唯一现实的选择了。

     

    当然,OFDM也有自己的问题。对无线通信的应用来说,最主要的问题是它发射端功耗比较大。在其他的调制方式中,每个波特的最大电压都是有绝对限度的,不会比平均高出多少。但OFDM相当于是把很多经过调制的子载频加在一起。当它们相位都一致的时候,总电压就会很大。所以发射器的放大器就要留出很大的余量来对付这种偶然发生的“超大电压”,因而增加功率消耗。正因为此,在LTE标准中,上行信号(由手机发射)就不采用OFDM,而采用另一种类似的调制方式,来降低功耗。另一个问题是OFDM对于信号频率的漂移非常敏感,因为它使用频宽很窄的子载频。而在移动通信中,由于多普勒效应,不仅存在着整体的频率漂移,而且在多路径情况下每个路径的频率变化都可能不一样。这个问题是可以通过信号处理来改善的,但由此带来的复杂性就部分抵消了OFDM的优势。

     

    我查了一下最近五年内出版的数字通信教科书,居然有一大半没有涵盖OFDM的内容。而今天数字通信的工作岗位中,大概有80%必须与OFDM打交道。从这个对比中可以看出OFDM是一个迅速发展的领域。希望这篇文章,能让你觉得它不再那么陌生。

     
    【后记】:感谢dsp2008对于中文译名的指正,文中已经修改。

     

    【注一】严格说来LTE标准还不算4G,它的下一代LTE Advanced才算。但这两者在调制方式上是一样的。

    【注二】WiMAX和802.11都有几种调制方式。但最新的和目前普遍用的是OFDM。

    【注三】通常这个安全间隔中所发射的并不是零,而是重复上一个OFDM符号的一部分。这涉及到傅立叶变换的特殊性质,这里就不细说了。

    展开全文
  • 机器人循线算法原理与实践 1.[硬件基本构架] 对于机器人循线为了获得场地上白线黑线信息硬件结构一般有如下几种 种类 红外对管阵列采取这种方式的机器人比较多尤其在各种机器人竞赛中几乎 是标准配置但是这种...
  • 第1章 概述 问题1-1:“主机”和“计算机”一样不一样?...问题6-10:网络前缀是指网络号字段(net-id)中前面的几个类别比特还是指整个的网络号字段? 问题6-11:有的书(如[COME01])将IP地址分为前缀和后缀两大部分...
  • 对于机器人循线为了获得场地上白线黑线信息硬件结构一般有如下几种种类 1)红外对管阵列采取这种方式的机器人比较多尤其在各种机器人竞赛中几乎是标准配置但是这种技术有一个致命弱点就是对于场地光线干扰...
  • 3.2.1 几种常用三态逻辑编/解码芯片及其典型应用电路 3.2.2 三态逻辑编/解码器在PC机与单片机通信中应用 3.2.3 三态逻辑编/解码器在信号检测系统中应用 3.3 红外遥控技术 3.3.1 红外遥控原理 3.3.2 红外...
  • 再次,在传统 PI 调节器基础上,给出了几种用 DSP 完成 PI 算法方 法,通过和 DSP 自身特点相结合,本文最终选择用增量式 PI 算法。并给出了 系统控制软件总体结构。 最后,基于DSP(TMS320LF2407A)完成...
  • 其特点是能以脉冲和连续两种方式工作。 激光器种类 3、半导体激光器。用半导体作为激光器工作物质。其最大特点是体积小、种类多、效率高、使用方便。 4、染料激光器。工作物质是有机染料。其特点是工作波长...
  • 这样无论采用何种方式,只要完成一次测量即可,频率计自动开 始下一个测量循环,因此该频率计具有连续测量功能,同时实现量程自动转 换。 数字频率计硬件框图如图2.1 所示。 由此可以看出该频率计主要由八部分...
  • 构建了在强背景光大气湍流信道模型下基于强度检测脉冲位置调制(PPM)方式的室外长距离可见光分集接收系统模型,在十微瓦功率背景光噪声下,实现了800 Mb/s PPM 信号仿真系统传输。基于此系统分别研究对比了最大比...
  • 数字通信原理与技术(扫描版PDF)

    热门讨论 2010-03-01 20:40:45
    2. 5 通信中常见的几种噪声 2. 5. 1 白噪声 2. 5. 2 高斯噪声 2. 5. 3 高斯型白噪声 2. 5. 4 窄带高斯噪声 2. 5. 5 余弦信号加窄带高斯噪声 2. 6 信道容量的概念 本章小结 思考与练习 第3章 模拟信号的数字传输 3. 1...
  • 无线通信原理与应用(第一版) 中文版

    千次下载 热门讨论 2011-05-01 21:35:17
    1.4.4 常用的几种移动电话系统的比较 1.5 蜂窝无线电和个人通信的发展趋势 问题与练习 第2章 关于蜂窝的概念:系统设计基础 2.1 概述 2.2 频率复用 2.3 信道分配策略 2.4 切换策略 2.4.1 优先切换 ...
  • 无线通信原理与应用第二版中文版

    千次下载 热门讨论 2010-10-31 20:52:41
    1.4.4 常用的几种移动电话系统的比较 1.5 蜂窝无线电和个人通信的发展趋势 问题与练习 第2章 关于蜂窝的概念:系统设计基础 2.1 概述 2.2 频率复用 2.3 信道分配策略 2.4 切换策略 2.4.1 优先切换 ...
  • 几种重要配置文件.......................................................................................................26 三.Linux下常用工具软件......................................................
  • 3.4 一多台单片机通信方式  3.5 用VB通信控件开发微机与单片机串行通信程序  3.6 RS—485收发器及组网中有关问题  3.7 新型数字通信接口  3.8 Caller ID来电号码显示器...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    项目相当繁多,以HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK产品为例最主要的几项如下:  接续性测试:检测每一根I/OPIN内接的保护用二极管是否功能无误。  功能测试...
  • 问题4-10:网络前缀是指网络号字段(net-id)中前面的几个类别位还是指整个的网络号字段? 问题4-11:有的书(如[COME06])将IP地址分为前缀和后缀两大部分,它们和网络号字段及主机号字段有什么关系? 问题4-12:IP...
  • (6) 经过 (4) and (5) 以后, cFos/cFosSpeed 就会纪录那条 ADSL 特性参数, 详细参数可用 cFos 控制台, 然后键入 cfo speed (cFos) or spd speed (cFosSpeed) 指令看到, 参数大概有吧, 不仅仅只是单纯上传...
  • 2004-2010软考程序员真题

    热门讨论 2012-09-27 12:33:00
     56、在word视图方式下,可以显示分页效果  A)普通 B)大纲 C)页面 D)主控文档  57、在word编辑状态,执行"文件"菜单中"保存"命令后将所有打开文档存盘  A)将所有打开文档存盘  B)只能将当前...
  • 2.2数字补偿器实现中的几个问题 2.3用TMS32010来实现补偿器和 滤波器 2.4TMS320系列DSP外围接口考虑 3TMS32010DSP在速率积分陀螺伺服稳 定系统中的应用 3.1系统描述 3.2系统模型与控制补偿 3.3数字控制器的...
  • 资源利用效率提高主要是针对几种典型业务场景对资源分配机制进行了改进,包括针对VoIP业务和Always Online业务所做优化,分解为CPC(连续分组连接)和CEI-FACH增强两个特性;传输时延优化主要体现在系统架构...
  • 资源利用效率提高主要是针对几种典型业务场景对资源分配机制进行了改进,包括针对VoIP业务和Always Online业务所做优化,分解为CPC(连续分组连接)和CEI-FACH增强两个特性;传输时延优化主要体现在系统架构...
  •  如果用户以硬件路由器(或FireWall)为出口上Internet,为实现“通过一台机器监控整个网络”目的,通常采用下面几种手段:  1.在网关处添加共享式HUB(集线器),Internet出口网络线和监控机网络线均接入HUB。  ...
  • 会计理论考试题

    2012-03-07 21:04:40
    6.为了以最佳方式、最少重复,为多种应用服务,把数据集中起来以一定组织方式存在计算机的外存储器中,就构成 __D___ 。 A、FoxBASE B、DOS C、数据库管理系统 D、数据库 7.用紧急启动盘(ESD)启动计算机后,屏幕...
  • 德力西产品说明.pdf

    2019-10-10 18:41:58
    调制方式 空间电压矢量 控制方式 V/F控制、开环矢量控制、闭环矢量控制 频率设定分辩率 数字量 : 0.01 Hz 模拟量 : 0.05 Hz / 50 Hz,输出频率范围: 0 – 400 Hz ...
  • 1.2.5MCS-51单片机复位状态及几种复位电路设计 1.2.6存储器、特殊功能寄存器及位地址空间 1.2.7输入/输出(I/O)口 1.3MCS-51单片机指令系统分析 1.3.1指令系统寻址方式 1.3.2指令系统使用要点 1.3.3指令...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

外调制的几种方式