欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4556|回復: 0
收起左側

uPD6121G;紅外線發射/編碼與接收/解碼

[復制鏈接]
ID:411040 發表于 2018-10-17 12:44 | 顯示全部樓層 |閱讀模式
                             值得擁有的資料
是來自平時學習積累總結的
有問題的地方肯定有的
還請大家批評指正!
紅外線信號的傳輸基于MCU的調制與解調的研究

摘要:本研究方案由發射和接收兩大部分組成
都是基于MCU實現軟件對紅外線信號調制與解調
為紅外線非定向應用奠定研究基礎
關 鍵 詞:uPD6121G;紅外線發射/編碼與接收/解碼;
Research MCU-based infrared signal transmission
           modulation and demodulation
LUOKai,HOUJian
Abstract:The program consists of transmitting and receiving two major components, are software-based MCU to achieve infrared signal modulation and demodulation.
Keywords:uPD6121G;Infrared remote launch/encoding/decoding and receiving
1 引 言
  紅外線是近距離、高速無線通信的一種手段
一直以來
紅外遙控、遙測技術在玩具、家電制造及工業測控等領域得到了廣泛的應用、室內通信的手段
紅外線具有無線電無法比擬的優勢
以前的紅外線遙控系統以定向發射、接收為主流應用
因此一般為單用戶系統
隨著非方向性發射、接收
構成系統成為了可能
之前紅外線信號都是采用固定的編碼芯片和解碼芯片實現對紅外線的編碼的調制與解調
這樣的信號無法隨用戶的需求或構成真正意義上的系統的要求變化
因此本研究方案即是:通過基于MCU及外圍器件為基礎
實現用軟件的方式對紅外線進行調制與解調的
這樣可以更好的控制紅外線信號
使設計者設計出更多與紅外線有關的無線段距離通信電路
2 系統研究方案
2.1系統總體方案
  紅外系統由發射和接收兩大部分組成
應用編/解碼專用集成電路芯片來進行控制操作
如圖1所示
發射部分包括鍵盤矩陣、編碼調制、紅外發送器;接收部分包括光、電轉換放大器、解調、解碼電路
  
  
  
  
  
  
  
     圖1 紅外線遙控系統結構圖
2.2紅外線調制與解調的介紹
紅外線調制與解調原理
    發射器專用芯片很多
根據編碼格式可以分成兩大類
這里我們以運用比較廣泛
解碼比較容易的一類來加以說明
現以日本NEC的uPD6121G組成發射電路為例說明編碼與解碼原理
當發射器按鍵按下后
即有遙控碼發出
所按的鍵不同遙控編碼不同
對應的解碼也就不同
這種遙控碼具有以下特征:
  采用脈寬調制的串行碼
以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的"0";以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的"1"
其波形如圖2所示
      
圖2 遙控碼的"0"和"1" (注:所有波形為接收端的與發射相反)
  上述"0"和"1"組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率
達到降低電源功耗的目的
然后再通過紅外發射二極管產生紅外線向空間發射
如圖3所示
      
     圖3 遙控信號編碼波形圖
  UPD6121G產生的遙控編碼是連續的32位二進制碼組
其中前16位為用戶識別碼
能區別不同的電器設備
防止不同機種遙控碼互相干擾
該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼
UPD6121G最多額128種不同組合的編碼
  遙控器在按鍵按下后
周期性地發出同一種32位二進制碼
周期約為108ms
一組碼本身的持續時間隨它包含的二進制"0"和"1"的個數不同而不同
大約在45~63ms之間
圖4為發射波形圖

      
     圖4 遙控連發信號波形
  當一個鍵按下超過36ms
振蕩器使芯片激活
將發射一組108ms的編碼脈沖,這108ms發射代碼由一個起始碼(9ms),一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數據碼(9ms~18ms)和這8位數據的反碼(9ms~18ms)組成
如果鍵按下超過108ms仍未松開
接下來發射的代碼(連發代碼)將僅由起始碼(9ms)和結束碼(2.5ms)組成
      
        圖5 引導碼                           圖6連發碼
  代碼格式(以接收代碼為準
接收代碼與發射代碼反向)
①位定義
②單發代碼格式
③連發代碼格式 注:代碼寬度算法:
16位地址碼的最短寬度:1.12×16=18ms
  16位地址碼的最長寬度:2.24ms×16=36ms
易知8位數據代碼及其8位反代碼的寬度和不變:
  (1.12ms+2.24ms)×8=27ms
∴32位代碼的寬度為(18ms+27ms)~(36ms+27ms) 1. 解碼的關鍵是如何識別"0"和"1"
從位的定義我們可以發現"0"、"1"均以0.56ms的低電平開始
不同的是高電平的寬度不同
"0"為0.56ms,"1"為1.68ms,所以必須根據高電平的寬度區別"0"和"1"
如果從0.56ms低電平過后
開始延時
0.56ms以后
若讀到的電平為低
說明該位為"0"
反之則為"1"
為了可靠起見
延時必須比0.56ms長些
但又不能超過1.12ms,否則如果該位為"0"
讀到的已是下一位的高電平
因此取(1.12ms+0.56ms)/2=0.84ms最為可靠
一般取0.84ms左右均可
    根據碼的格式
應該等待9ms的起始碼和4.5ms的結果碼完成后才能讀碼
2.2.1紅外線調制的硬件實現
    發射部分包括單片機最小系統、鍵盤矩陣、555紅外發射電路
他們一起構成了紅外線獨立發射電路
如圖7所示
"0"和"1"組成的32位二進制碼經555芯片電路產生的38kHz的載頻進行二次調制以提高發射效率
達到降低電源功耗的目的
然后再通過紅外發射二極管產生紅外線向接收端發射信號



圖7 紅外線獨立發射電路
2.2.2紅外線調制的軟件實現
  通過定時器的方式對紅外數據進行軟件編碼
再調制到載波發送出去
  
//本程序對應11.0592M晶振//
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IR=P1^6;          //定義發射端口
sbit speak=P1^1;
bit flag,f2,f4,f8,f16,f32;
uchar irtime=0,key;         //定義計時變量、鍵盤取值變量
void delay(uint ms) // 毫秒級延時(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}
/*******************定時器0方式2初始化函數***************/
void initT0()
{
  TMOD=0x02;        //方式2
  TF0=0;         //清溢出標志
  ET0=1;         //使能定時器0中斷
  TH0=0;         //賦初值
  TL0=0;
  EA=1;          //開總中斷
//  TR0=1;         //啟動定時
}            

/********************定時器0中斷服務函數****************/
void Timer0() interrupt 1  using 1
{
  irtime++;         //中斷計數
  switch(irtime)
   {
    case 2:f2=1;break;      //高0.56ms標志位
case 4:f4=1;break;      //低0.56ms標志位
case 8:f8=1;break;      //地1.68ms標志位
case 16:f16=1;break;     //高4.5ms標志位
case 32:f32=1;break;     //低4.5ms標志位
}
}      

/*********************鍵盤掃描函數*********************/
//uchar void keyscan(void)   //鍵盤掃描函數
使用行列反轉掃描法
void keyscan()
{
     
/*
uchar cord_h,cord_l;                    //行列值中間變量
P3=0x0f;                                  //行線輸出全為0
cord_h=P3&0x0f;                           //讀入列線值
if(cord_h!=0x0f)                          //先檢測有無按鍵按下
{
  delay(400);                              //去抖
  if(cord_h!=0x0f)
  {
    cord_h=P3&0x0f;                        //讀入列線值
    P3=cord_h|0xf0;                        //輸出當前列線值
    cord_l=P3&0xf0;                        //讀入行線值
    return(cord_h+cord_l);                 //鍵盤最后組合碼值
   }
  }return(0xff);                           //返回該值     */
key=0xeb;
flag=1;            //得到按鍵值就置標志位
   }
/*********************引導碼發送函數*******************/
void sendstart()
{
   IR=1;

while(!f16);IR=0;f16=0;        //高電平4.5ms
while(!f32);IR=1;irtime=0;f32=0;      //低電平4.5ms
       f2=0;           //清零標志位
    f4=0;
    f8=0;
  }

/*******************8位數據發送函數********************/
void sendnum(uchar t)
{
uchar b=0,i;
   //  t=key;
for(i=0;i<8;i++)           //發送8位數據
  {
   
     b=t&0x01;        //取出地i位
     t=t>>1;
    if(b==0)          //為1時發送
      {
        IR=1;
     while(!f2);IR=0;f2=0;     //等待時間 完成  0.56ms
     while(!f4);IR=1;irtime=0;f4=0;   //0.56ms
     }
    else          //為0時發送
       {
        IR=1;
     while(!f2);IR=0;f2=0;     //等待時間完成0.56ms
     while(!f8);irtime=0;IR=1;f8=0;    //1.68ms
  f4=0;         //清標志
     }
   }
}

/*********************終止碼發送函數*******************/
/*void sendend()           //終止碼自由定義
{
sendnum(0x0f);           
  }   */

/*******************16位客戶地址碼發送函數********************/
void sendadd()           //客戶地址碼自由定義
{
sendnum(0xfb);
sendnum(0xed);
}

/*********************編碼發送函數********************/
void send()
{
   TR0=1;              //啟動定時
while(flag)
{
   sendstart();                //發送起始碼
   sendadd();             //發送客戶地址碼
   sendnum(key);         //發送數據碼
   sendnum(~key);           //發送數據反碼
   //sendend();            //發送終止碼
   irtime=0;
   flag=!flag;
  }
TR0=0;                  //關閉定時
}

/*********************主函數**********************/
void main()
{
  IR=0;
// P1=0;            //復位后賦初值
  initT0();           //調用定時器0初始化函數

while(1)           //進入循環
實時監控
   {
keyscan();          //調用鍵盤掃描函數
send();           //調用編碼發射函數
     
  }
}
2..2.3紅外線解調的硬件實現
  一體化紅外線接收器是一種集紅外線接收和放大于一體
不需要任何外接元件
就能完成從紅外線接收到輸出與TTL電平信號兼容的所有工作
而體積和普通的塑封三極管大小一樣
它適合于各種紅外線遙控和紅外線數據傳輸
它主要包括了收部分包括光、電轉換放大器、解調、解碼電路
如圖8所示

圖8 紅外線接收電路
2.2.4紅外線解調的軟件實現
  這是一個用紅外線控制數碼管顯示的樣例 (部分C程序)
.
  void Ir_work(void)//紅外鍵值散轉程序
  {
       switch(IRcord[2])//判斷第三個數碼值
          {
    case fe:P1=0xfe;break;//1 顯示相應的按鍵值
    case fd:P1=0xfd;break;//2
    case fb:P1=0xfb;break;//3
    case f7:P1=0xf7;break;//4
    case ef:P1=0xef;break;//5
    case df:P1=0xdf;break;//6
    case bf:P1=0xbf;break;//7
    case 7f:P1=0x7f;break;//8
    }
    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
      {
             value=value|0x80;
   }
          else
      {
             value=value;
   }
          if(j<8)
      {
    value=value>>1;
   }
           k++;
         }
     IRcord=value;
     value=0;     
     } irpro_ok=1;//處理完畢標志位置1
   
}
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定時器0
P2=0x00;//1位數碼管全部顯示
while(1)//主循環
   {
    if(irok)
   {   
    Ircordpro();//碼值處理
     irok=0;
   }
    if(irpro_ok)//step press key
   {
    Ir_work();//碼值識別散轉
     }
   }
}
3 總結
  單片機控制的紅外線通信系統具有硬件簡單、成本低廉、編程方便、通信可靠性高的特點
實現了通信雙方非接觸式的數據傳送
這種方案也可用于其它遙控、遙測應用場合
實際應用證明,該系統具有很好的適用性、擴展性與靈活性,能滿足大部分紅外傳輸系統的要求
  參 考 文 獻
   [1]張毅剛.單片機原理與應用設計.電子工業出版社,2008:32-42
     [2]郭天祥.新編51單片機C語言教程.電子工業出版社,2009.56-78
     [3]張天凡.51單片機C語言開發詳解.電子工業出版社,2008.112-148
     
     









回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表