久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4815|回復: 4
收起左側

單片機紅外遙控系統課程設計

[復制鏈接]
ID:463454 發表于 2019-1-8 21:16 | 顯示全部樓層 |閱讀模式
摘要

本設計采用51單片機作為遙控發射接收芯片,HS003B作為紅外一體化接收發射管,在此基礎上設計了一個簡易的智能紅外遙控系統。系統包括接收和發射兩大部分,發射部分有16個按鍵,接收部分含有8盞彩色LED燈、一片二位數碼管和蜂鳴器系統。發射部分通過鍵盤掃描判斷哪個鍵被按下,經過單片機編碼程序進行編碼,控制紅外發射電路發送信號。接收部分解碼信號,實現相應的輸出。本設計方案結合紅外遙控設計簡單、作方便、成本低廉等特點。

1 緒論

1.1課題目的和意義
隨著科技的發展,人們生活的節奏也越來越快,隨之人們對方便,快捷的要求也隨之不斷增高。遙控器的出現,在一定程度上滿足了人們這個要求。遙控器是由高產的發明家Robert Adler在五十年代發明的[1]。而紅外遙控是20世紀70年代才開始發展起來的一種遠程控制技術,其原理是利用紅外線來傳遞控制信號,實現對控制對象的遠距離控制,具體來講,就是有發射器發出紅外線指令信號,有接收器接收下來并對信號進行處理,最后實現對控制對象的各種功能的遠程控制。
紅外遙控具有獨立性、物理特性與可見光相似性、無穿透障礙物的能力及較強的隱蔽性等特點。隨著紅外遙控技術的開發和迅速發展,很多電器采用該項技術,使人們的生活更加便捷。本小組通過紅外遙控技術來控制多盞彩燈的亮滅情況,實現各種花型以及數碼管的數值顯示。通過本課題的設計,更好的理解紅外線的編碼解碼方式及其紅外遙控系統的其他工作原理。

1.2紅外線簡介
紅外線又稱紅外光波,在電磁波譜中,光波的波長范圍為0.01um~1000um。根據波長的不同可分為可見光和不可見光,波長為0.38um~0.76um的光波可為可見光,依次為紅、橙、黃、綠、青、藍、紫七種顏色。光波為0.01um~0.38um的光波為紫外光(線),波長為0.76um~1000um的光波為紅外光(線)。紅外光按波長范圍分為近紅外、中紅外、遠紅外、極紅外4類。紅外線遙控是利用近紅外光傳送遙控指令的,波長為0.76um~1.5um。用近紅外作為遙控光源,是因為目前紅外發射器件(紅外發光管)與紅外接收器件(光敏二極管、三極管及光電池)的發光與受光峰值波長一般為0.8um~0.94um,在近紅外光波段內,二者的光譜正好重合,能夠很好地匹配,可以獲得較高的傳輸效率及較高的可靠性。
1.3紅外遙控系統簡介
紅外遙控系統主要由遙控發射器、一體化接收頭、單片機、接口電路組成,遙控器用來產生遙控編碼脈沖,驅動紅外發射管輸出紅外遙控信號,遙控接收頭完成對遙控信號的放大、檢波、整形、解調出遙控編碼脈沖。遙控編碼脈沖是一組串行二進制碼,對于一般的紅外遙控系統,此串行碼輸入到微控制器,由其內部CPU完成對遙控指令解碼,并執行相應的遙控功能。使用遙控器作為控制系統的輸入,需要解決如下幾個關鍵問題:如何接收紅外遙控信號;如何識別紅外遙控信號以及解碼軟件的設計、控制程序的設計。
紅外遙控是單工的紅外通信方式,整個通信中,需要一個發射端和一個接收端。發送端采用單片機將待發送的二進制信號編碼調制為一系列的脈沖串信號,通過紅外發射管發射紅外信號。紅外接收端普遍采用價格便宜,性能可靠的一體化紅外接收頭接收紅外信號,它同時對信號進行放大、檢波、整形,得到TTL。


2 課題方案和設計思路

2.1總體方案
    紅外遙控系統一般由紅外發射裝置和紅外接收設備兩大部分組成,圖2-1為所示為結構框圖。
                                                        

                  

圖2-1 系統結構框圖

紅外發射裝置又由鍵盤電路、紅外編碼芯片、電源和紅外發射電路組成。紅外接收設備可由紅外接收電路、紅外解碼芯片、電源和應用電路組成。

2.2紅外發射器設計2.2.1紅外發射器原理
由于指令數據時間周期較長,信號頻率很低,直接發射傳送效率和距離受限,抗干擾性差,因此,必須采用二次調制方式,將指令數據通過載波信號進行調制,形成較高頻率的復合信號,在通過紅外發射二極管產生紅外線發射出去。


圖2-2 紅外遙控發射原理框圖

2.2.2紅外編碼
紅外編碼有很多種方式,本課題采用脈沖寬度調制方案,這種遙控碼具有以下特征: 以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”。 波形如下圖。

圖2-3 位“0”和位“1”波形圖

    在此介紹較普遍使用的NEG標準。其數據格式包括引導碼、用戶碼、數據碼和數據反碼,編碼共占32位。數據反碼是數據碼反相后的編碼,編碼用于對數據的糾錯。


2.3紅外接收端設計
接收端主要包括紅外接收模塊和解調單片機。其中,紅外線接收模塊包括光電轉換放大器和解調電路。當紅外線發射信號進入模塊后,在其輸出端得到原先的數字控制編碼,再經過單片機解碼程序進行解碼,便知按下那個鍵,實現相應輸出。P0.0連接蜂鳴器系統,每成功接收到信號,蜂鳴器發出一聲響聲。P1口連接8盞彩燈,接收數據不同彩燈的花色不同,P2口、P3.0和P3.1連接一片二位數管,數碼管顯示從01到16的數值,分別對應發射部分的16個按鍵。
                                                                                    
                                                                                                           

3硬件結構設計與介紹

3.2 紅外發射電路
本遙控發射器采用脈沖寬度調制紅外遙控方式,脈沖寬度調制紅外遙控就是指令信號產生電路以不同的脈沖編碼代表不同的控制指令。
在確定選擇AT89C51作為本設計發射電路核心芯片和點觸式開關作為控制鍵后,加上一個簡單紅外發射電路和12M晶體震蕩器便可實現紅外發射。
發射部分的主要元件為紅外發光二極管。它實際上是一只特殊的發光二極管,由于其內部材料不同于普通發光二極管,因而在其兩端施加一定電壓時,它發出的便是紅外線而不是可見光。目前大量使用的紅外發光二極管發出的紅外線波長為940nm左右,外形與普通Φ5發光二極管相同,只是顏色不同[6]。
遙控發射通過鍵盤,每按下一個鍵,即產生具有不同的編碼數字脈沖,這種代碼指令信號調制在38KHz的載波上,激勵紅外光二極管產生不同的脈沖,通過空間的傳送到受控機的遙控接收器。P1口作為按鍵部分,P3.6口作為發射部分。
獨立式鍵盤可工作在查詢方式下,通過I/O口讀入鍵狀態,當有鍵被按下時I/O口變為低電平,而未被按下的鍵對應為高電平,這樣通過讀電平狀態可判斷是否有鍵按下和哪個鍵被按下。


圖3-2 紅外發射端電路         
3.3紅外接收電路設計3.3.1 紅外接收模塊
HS003B是一種常見的紅外接收模塊。紅外接收模塊內部含有高頻的濾波電路,專門用來濾除紅外合成信號的載波信號(38KHz),并送出接收到的信號。模
塊有3個引腳;引腳1(GND)為接地端;引腳2(VCC)為為電源正極;引腳3
(OUT)為數字信號輸出端。

3.3.2數碼管

   表3-1 七段LED字形碼

顯示字符

共陽極

字符碼

共陰極

字符碼

0

3FH

C0H

1

06H

F9H

2

5BH

A4H

3

4FH

B0H

4

66H

99H

5

6DH

92H

6

7DH

82H

7

07H

F8H

8

7FH

80H

9

6FH

90H


                       圖3-4 二位數碼管顯示器

設計中用到型號為7SEG-MAX2-CA-BLUE的二位共陽極數碼管顯示器。它的左下側的ABCDEFG DP是LED數碼管顯示器的I/O口,是段選信號,右下側的12是它的位選信號,就是從左到右分別是第一位到第二位,段選信號與位選信號分別接到單片機的不同輸出口,例如段選信號可以接到P2口,位選信號可以接到P3.0口和P3.1口,共陽極的字形顯示代碼為:unsigned char[]={0xc0, 0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},P3.0輸出為0,P3.1輸出為1時,選中第二位,段選信號就執行從0到9的顯示,P3.0輸出為1,P3.1輸出為0時,選中第一位,段選信號就執行從0到9的顯示。
3.3.3 彩燈系統
P1口連接8盞彩燈,P1.0和P1.4連接的是LED-RED,P1.1和P1.5連接的是LED-YELLOW,P1.2和P1.6連接的是LED-GREEN,P1.3和P1.7連接的是LED-BLUE。根據接收到的信號顯示不同的花型。

                        圖3-5 彩燈系統連接圖

3.3.4蜂鳴器系統
     P0.0連接蜂鳴器系統,每成功接收到信號,蜂鳴器發出一聲響聲。
                         圖3-6 蜂鳴器系統連接圖
3.3.5紅外接收端電路圖
                   圖3-7  紅外接收端電路圖

4 軟件設計

4.1 定時/計數器功能簡介
AT89C51單片機內部設有兩個16位可編程的定時/計數器,簡稱定時器0和定時器1,分別用T0和T1表示。其功能同一般定時計數器,主要作用是:第一,作為一段特定時間長短的定時;第二,可以計算由T1或T0引腳輸入的脈沖數,前者在應用上可以產生正確的時間延遲及定時去執行中斷服務程序,而后者則是計數器或者計頻器的設計。
這兩個定時器本身有四種工作模式可供使用,如表2所示。

表4-1 四種工作模式

M1   MO

工作方式

功能說明

0     0

模式0

13位計數器

0     1

模式1

16位計數器

1     0

模式2

8位自動重裝計數器

1     1

模式3

定時器0:分成兩個8位計數器

定時器1:停止計數



4.2 遙控碼的發射
當某個操作按鍵按下時,單片機先讀出鍵值,然后根據鍵值設定遙控碼的脈沖個數,再調制成38kHz方波由紅外線發光管發射出去[13]。
通常,紅外遙控是將遙控信號(二進制脈沖碼)調制在38KHz的載波上,經緩沖放大后送至紅外發光二極管,轉化為紅外信號發射出去的。為了提高抗干擾性能和降低電源消耗,將上述的遙控編碼脈沖對頻率為38KHz(周期為26us)的載波信號進行脈幅調制(PAM),再經緩沖放大后送到紅外發光管,將遙控信號發射出去。
紅外信號發射過程:首先發射9ms高電平和4.5ms低電平的引導碼,再發送16位地址碼的前8位,16位地址碼的后8位,8位按鍵數據和8位按鍵數據反碼。
在實踐中,采用紅外線遙控方式時,由于受遙控距離,角度等影響,使用效果不是很好,如采用調頻或調幅發射接收碼,可提高遙控距離,并且沒有角度影響。
發射控制程序由主程序和鍵掃描程序、編碼發送程序組成,在主程序中,采用鍵掃描子程序完成各個按鍵的功能,遙控發射主程序的流程圖
(a)紅外發射主程序流程圖            (b)紅外數據發送子程序流程圖
                 圖4-1紅外發射端程序流程圖
4.3 紅外接收
紅外遙控解碼程序主要工作為等待紅外線信號出現,并跳過引導信號,搜集連續32位的編碼數據,并存入內存的連續空間。其位信號判別的原則是:以判斷各個位的波寬信號來決定高低信號(0或1)。
位解碼原理如下:
  • 解碼為0:高電平寬度0.56ms+低電平寬度0.56ms。
  • 解碼為1:高電平寬度0.56ms+低電平寬度1.68ms。
編碼數據讀取后,經過單片機將編碼數據與鍵盤代碼進行比對,即可解調出具體的按鍵值,便可知按下哪個鍵,而做出相應的控制處理,完成紅外遙控的動作。

  • 紅外接收主程序流程圖         (b)紅外接收中斷子程序流程圖
                 圖4-2 紅外接收端程序流程圖

5 課程設計總結和心得

這次課程設計耗用了1個星期的心血,從一開始的確定課題,到后來的資料查找、理論學習,再有就是調試和測試過程,這一切都使我的理論知識和動手能力進一步提高。
通過本次紅外系統的設計,我大有收獲。從得到題目到查找資料,從proteus仿真的調試到失敗后再一次全部重新開始……在這一個充滿挑戰伴隨挫折,充滿熱情伴隨打擊的過程中,我感觸頗深,它已不僅是一個對我的學習知識情況和我的應用動手能力的檢驗,而且還是對我的鉆研精神,面對困難的心態,做事的毅力和耐心的考驗。我在這個過程中深刻的感受到了做課程設計的意義所在。這個課題的根本技術就是單片機控制技術,加部分外圍電路來實現一些復雜的功能。可以根據要求改變軟件來實現功能的更新和擴展。
本課題的重點、難點是:
(1) 考慮電路實現原理以及與單片機的接口;
(2) 紅外發送與接收技術;
   通過完成本課題,我了解并掌握了紅外遙控技術的基本理論知識,更深入的掌握單片機在實際電路中的開發和應用。為以后從事單片機軟硬件產品的設計開發打下了一定的基礎,培養了從事產品研發的信心。

6 參考文獻

[1]單片機原理與應用及C51程序設計,夏維成 楊加國 編著,清華大學出版社。
[2] C語言程序設計(第三版),譚浩強 編著,清華大學出版社。
[3] 單片機系統設計與仿真—基于Proteus,肖婧 編著, 北京航空航天大學出版社。
[4] DIY玩轉51單片機, 王守中 編著,電子工業出版社。                                                                                                      
[5] 單片機側控技術應用實例解析, 許江淳 陳顯寧 陳焰 付麗霞 編著,中國電力出版社。
[6] 單片機接口模塊應用與開發實例詳解, 薛小玲 劉志群 賈俊榮 編著, 北
京航空航天大學出版社

  • 附錄

附錄1 Proteus仿真圖


附錄2 發射程序   





#include <REG51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define SBM   0x80              
#define m9    (65536-9000)                    
#define m4_5  (65536-4500)                    
#define m1_6  (65536-1630)                    
#define m_65  (65536-580)                    
#define m_56  (65536-560)                    
#define m40   (65536-40000)      
#define m56   (65536-56000)      
#define m2_25 (65536-2250)      
sbit IR  = P3^6;                                                         
sbit LED = P3^7;                                                      
uchar KEY(void);
void  SanZhuan(void);
void  ZZ(uchar x);
void  Z0(uchar temp);
void  TT0(bit BT,uint x);
void  YS(uchar time);
void main(void)
{ TMOD = 0x01;        
  IR=1;                                                         
  while(1)
  {SanZhuan();}
}
uchar KEY(void)
{uchar H,L;           
H=0;
L=0;
P1 = 0xf0;           
if(P1!= 0xf0)        
   { YS(10);           
    if(P1!=0xf0)   
      {H  = P1&0xf0;
       P1 = 0x0f;   
       L  = P1&0x0f;  
      }
              return (H+L);
   }
  return 0;
}
void SanZhuan(void)
{ uchar v;
v = KEY();
switch(v)
{case 0x77:ZZ(0x01);v=0;break;            
  case 0xb7:ZZ(0x02);v=0;break;                           
  case 0xd7:ZZ(0x03);v=0;break;                           
  case 0xe7:ZZ(0x04);v=0;break;                           
  case 0x7b:ZZ(0x05);v=0;break;                           
  case 0xbb:ZZ(0x06);v=0;break;                           
  case 0xdb:ZZ(0x07);v=0;break;                           
  case 0xeb:ZZ(0x08);v=0;break;                           
  case 0x7d:ZZ(0x09);v=0;break;                           
  case 0xbd:ZZ(0x10);v=0;break;                           
  case 0xdd:ZZ(0x11);v=0;break;            
  case 0xed:ZZ(0x12);v=0;break;                           
  case 0x7e:ZZ(0x13);v=0;break;                           
  case 0xbe:ZZ(0x14);v=0;break;                           
  case 0xde:ZZ(0x15);v=0;break;                           
  case 0xee:ZZ(0x16);v=0;break;                           
  default:v=0;
}
}
void ZZ(uchar x)
{ TT0(1,m9);                              
  TT0(0,m4_5);                    
  Z0(SBM);                                                                                                                                                                                                                    
  Z0(~SBM);
  Z0(x);
Z0(~x);
TT0(1,m_65);
  TT0(0,m40);
  while(KEY())
   {  TT0(1,m9);
      TT0(0,m2_25);
      TT0( 1,m_56);
      TT0(0,m40);
                 TT0(0,m56);
                 LED = !LED;                                                                                       
    }
LED = 1;                              
}
void Z0(uchar temp)
{ uchar v;
  for (v=0;v<8;v++)                  
       {    TT0(1,m_65);                                          
                                          if(temp&0x01) TT0(0,m1_6);
                                          else   TT0(0,m_56);   
                                          temp >>= 1;               
        }   
}
void TT0(bit BT,uint x)
{
  TH0 = x>>8;                        
  TL0 = x;
  TF0=0;                                                
  TR0=1;                                                
  if(BT == 0) while(!TF0);            
  else while(1)                                          
         {
                              IR = 0;
                              if(TF0)break;
                    if(TF0)break;
                              IR = 1;
                      if(TF0)break;
                       if(TF0)break;
                       if(TF0)break;
                              if(TF0)break;
                       if(TF0)break;
                       if(TF0)break;
                       if(TF0)break;
                       if(TF0)break;
                       if(TF0)break;
                              if(TF0)break;
                            }
  TR0=0;                                                
  TF0=0;                                                
IR =1;                                                
}
void YS(uchar time)
{   uchar i,j;
              for(i=0; i<time; i++)
     for(j=0; j<247; j++)_nop_();
}





附錄3 接收程序





#include<reg51.h>
sbit IRIN=P3^2;
sbit SPK=P0^0;
sbit RELAY=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
unsigned char IRDATA[7];
unsigned char tab[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};
unsigned char X1,X2;
void IRZ();
void XSQ();
void main()
{ EA=1;
EX0=1;
IT0=1;
P1=0xff;
P2=0xc0;
P3_0=0;
P3_1=0;
SPK=1;
IRIN=1;
IRZ();
XSQ();
}
void delay(unsigned char x)
{ unsigned char i;
while(x--)
{for(i=0;i<10;i++){}}
}
void fs_d()
{unsigned char i;
for(i=0;i<100;i++)
{delay(4);
SPK=~SPK;
}
SPK=1;
}
void IR_IN() interrupt 0 using 0
{ unsigned char j,k,n=0;
EX0=0;
delay(20);
if(IRIN==1)
   {EX0=1;
   return;
}
while(!IRIN){delay(1);}
for(j=0;j<4;j++)
{for(k=0;k<8;k++)
{while(IRIN) {delay(1);}
while(!IRIN) {delay(1);}
while(IRIN)
{delay(1);
  n++;
  if(n>=30)
{ EX0=1;
  return;}
}
IRDATA[j]=IRDATA[j]>>1;
if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
n=0;}
}
if(IRDATA[2]!=~IRDATA[3])
{EX0=1;
return;
}
else {}
fs_d();
EX0=1;
}
void XSQ()

{ while(1)
{ X1 = IRDATA[2]/16;
  X2 = IRDATA[2]%16;
  P3_0=1;P3_1=1;P2=tab[X1];P3_0=1;delay(200);
  P3_0=1;P3_1=0;P2=tab[X2];delay(200);
}
}
void IRZ()
{ while(1)
   {
    switch(IRDATA[2])
              {   case 0x01:{P1=0xee;break;}
                 case 0x02:{P1=0xdd;break;}
      case 0x03:{P1=0xbb;break;}
        case 0x04:{P1=0X77;break;}
                    case 0x05:{P1=0xf0;break;}
        case 0x06:{P1=0x0f;break;}
                  case 0x07:{P1=0xaa;break;}
                 case 0x08:{P1=0x55;break;}
        case 0x09:{P1=0xe7;break;}
                case 0x10:{P1=0xdb;break;}
        case 0x11:{P1=0xbd;break;}
                 case 0x12:{P1=0x7e;break;}
        case 0x13:{P1=0xc3;break;}
        case 0x14:{P1=0x3c;break;}
        case 0x15:{P1=0x00;break;}
        case 0x16:{P1=0xff;break;}
    }
              X1 = IRDATA[2]/16;
    X2 = IRDATA[2]%16;
   P2=tab[X2];P3_1=1;delay(10);P3_1=0;
     P2=tab[X1];P3_0=1;delay(10);P3_0=0;
              }
}

完整的Word格式文檔51黑下載地址:
單片機課程設計.doc (500.5 KB, 下載次數: 40)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:442132 發表于 2019-1-15 17:50 | 顯示全部樓層
nice,值得參考
回復

使用道具 舉報

ID:187359 發表于 2019-11-3 13:49 | 顯示全部樓層
Nice,值得借鑒
回復

使用道具 舉報

ID:452928 發表于 2019-11-24 20:20 | 顯示全部樓層
兄弟,你這proteus仿真程序和.HEX文件能不能發一下呢
回復

使用道具 舉報

ID:493097 發表于 2019-11-25 11:29 | 顯示全部樓層
看看先~~~~~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99这里只有精品视频 | 最新av在线播放 | 欧美一区免费 | 欧美国产精品一区二区三区 | 国产精品a久久久久 | 色婷婷av一区二区三区软件 | 日韩精品免费视频 | 国产在线精品一区二区三区 | 成人日韩| 成人日b视频 | 成人毛片网站 | 在线观看免费黄色片 | 精品在线一区 | 国产一二三视频在线观看 | www在线视频 | 人人干人人超 | 男女视频在线免费观看 | 亚洲色欲色欲www | 人人干在线视频 | 国产精品麻 | 国产一区二区 | 天堂素人约啪 | 成人字幕网zmw | 99精品欧美一区二区三区综合在线 | www312aⅴ欧美在线看 | 蜜桃视频在线观看免费视频网站www | 蜜月va乱码一区二区三区 | 亚洲小说图片 | 在线观看午夜视频 | 亚洲欧美激情精品一区二区 | 欧美日韩一区二区三区四区 | 午夜精品久久久久久久久久久久 | 天堂av中文在线 | 久久国产精品99久久久久久丝袜 | 天天综合久久 | 中文字幕第三页 | 国产精品大片在线观看 | 精品无码久久久久久国产 | 麻豆久久久久久久 | 国产精品久久久久久久久久三级 | 国产日韩欧美激情 |