找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2794|回復(fù): 0
收起左側(cè)

單片機(jī)紅外收發(fā)實(shí)驗(yàn)

[復(fù)制鏈接]
ID:331855 發(fā)表于 2018-5-21 08:09 | 顯示全部樓層 |閱讀模式
紅外收發(fā)實(shí)驗(yàn)
  實(shí)驗(yàn)?zāi)康?/font>
了解紅外通信知識(shí),能夠應(yīng)用紅外線模塊進(jìn)行無(wú)線控制設(shè)計(jì)。
  實(shí)驗(yàn)設(shè)備及器材
PC                                   1臺(tái)
DP-51PROC單片機(jī)綜合仿真實(shí)驗(yàn)儀       1臺(tái)
  實(shí)驗(yàn)內(nèi)容
使用單片機(jī)的串口發(fā)送并接收數(shù)據(jù),TXD接到紅外發(fā)射管,RXD接到紅外接收頭,實(shí)現(xiàn)無(wú)線通訊。
  紅外收發(fā)原理
紅外通信是利用950nm近紅外波段的紅外線作為傳遞信息的媒體。發(fā)送端將二進(jìn)制信號(hào)調(diào)制為一系列的脈沖串信號(hào),通過紅外發(fā)射管發(fā)射紅外信號(hào)。接收端將接收到的光脈沖轉(zhuǎn)換成電信號(hào),再經(jīng)過放大,濾波等處理后送到解調(diào)電路進(jìn)行解調(diào),還原為二進(jìn)制數(shù)字信號(hào)后輸出。簡(jiǎn)而言之,紅外通信的實(shí)質(zhì)就是對(duì)二進(jìn)制數(shù)字信號(hào)進(jìn)行調(diào)制與解調(diào),以便利用紅外信道進(jìn)行傳輸。
本實(shí)驗(yàn)的紅外收發(fā)示意圖如圖4-30所示,通過硬件電路完成了對(duì)輸入數(shù)據(jù)的調(diào)制,將調(diào)制的信號(hào)轉(zhuǎn)換為光信號(hào)通過紅外發(fā)射管發(fā)送數(shù)據(jù),由紅外接收頭接收數(shù)據(jù)并完成對(duì)數(shù)據(jù)的調(diào)解。解調(diào)后的數(shù)據(jù)由單片機(jī)進(jìn)行處理。實(shí)驗(yàn)儀B2區(qū)的1/512頻率輸出端輸出用于信號(hào)調(diào)制的約為38kHz的時(shí)鐘信號(hào)。
一般紅外接收模塊的解調(diào)頻率為38kHz。當(dāng)它接收到38kHz左右的紅外信號(hào)時(shí),將輸出低電平,但連續(xù)輸出低電平的時(shí)間是有限制的,也就是說,發(fā)送數(shù)據(jù)低電平寬度是有限制的。注意發(fā)射管應(yīng)與接收頭平齊,否則接收頭可能接收不到來(lái)自發(fā)射管的反射光。
圖片1.png

  實(shí)驗(yàn)原理圖
  由于Proteus元件庫(kù)中無(wú)紅外發(fā)射和接收的仿真元件,所以該實(shí)驗(yàn)無(wú)法在Proteus軟件中仿真調(diào)試,可搭試電路直接在實(shí)物板調(diào)試。紅外收發(fā)的電路設(shè)計(jì)原理圖4-31所示。

      圖片2.png

4-31  紅外收發(fā)電路設(shè)計(jì)原理圖
圖片3.png
          紅外接收頭模塊
  實(shí)驗(yàn)步驟
  實(shí)驗(yàn)儀D3區(qū)紅外收發(fā)電路原理圖如圖4-32所示。實(shí)驗(yàn)步驟如下:
  1B2區(qū)X2插入20MHz的晶振,接上B2區(qū)的JP20號(hào)跳線。
  2)將B2區(qū)的1/512頻率輸出端接到D3區(qū)的DCLK(約為38kHz,用于信號(hào)調(diào)制)。
  3)將A2區(qū)的RXD,TXD分別連接到D3區(qū)的DRECDSEND。
  4)用短路線將D3區(qū)JP9短接(D3區(qū)電路供電電源)。
  5)將A2區(qū)的P10連接到D1區(qū)的LED1。
  6)斷開A1區(qū)JP15的跳線232RXD232TXD。
  7)下載程序并運(yùn)行,使用較厚的白紙擋住紅外發(fā)射管發(fā)射信號(hào),使其反射到接收頭,觀察LED1是否點(diǎn)亮。
圖片4.png



  實(shí)驗(yàn)參考程序
1.匯編語(yǔ)言參考程序清單
   LED_CON   BIT      P1.0
    COUTE     DATA    40H
    ORG       0000H
    LJMP      MAIN
    ORG       0100H
MAIN:
    MOV      SP,#60H
    MOV      SCON,0X50
    MOV      TMOD,#0x20
    MOV      TH1,0xFA
    SETB      TR1
MAINLOOP:
    MOV      COUTE,#0
    MOV      R7,#50
LOOP1:
MOV     SUBF,#0x5A
JNB       TI,$
CLR       TI
NOP
NOP
JB        R2,LOOP2
SJMP      LOOP3
LOOP2:
    CLR       RI
    MOV      A,SUBF
    CJNE      A,#05AH,LOOP3
    INC       COUTE
LOOP3:
    DJNZ      R7,LOOP1
    MOV      A,COUTE
    SETB      C
    SUBB      A,#30
    JC        CLR_LED
    CLR       LED_CON
    SJMP      DELAY
CLR_LED:
    SETB      LED_CON
DELAY:
    MOV      R6,#200
DELAY1:
    MOV      R5,#200
    DJNZ      R5,$
    DJNZ      R6,DELAY1
    SJMP      MAINLOOP
END     
2.C語(yǔ)言參考程序清單
#include<reg51.h>
#define uint8 unsigned char
#define uint16 unsigned int
sbit LED_CON P1^0;                //定義LED控制口
//************向串口發(fā)送一字節(jié)數(shù)據(jù)*************//
// 人口參數(shù):dat要發(fā)送的數(shù)據(jù)
//********************************************//
void UART_SendByte(uint8 dat)
{  SBUF=dat;                          //發(fā)送數(shù)據(jù)
   while(0==TI);                   //等待發(fā)送完畢
      TI=0;                        //清零TI標(biāo)志
}
//************接收一字節(jié)串口數(shù)據(jù)************//
//入口參數(shù):dat接受變量的地址指針
//出口參數(shù):返回0表示沒有數(shù)據(jù),返回1表示接收到數(shù)據(jù)
//*****************************************//
uint8 UART_RcvByte(uint8 *dat)
{
   if(0==RI) return(0);       //若沒有接收到數(shù)據(jù)則返回0
      *dat=SUBF;                   //取得接受的數(shù)據(jù)
   RI=0;                              //清除RI標(biāo)志
   return(1);
}
//************串口初始化***********************//
//模式為1位起始位,8位數(shù)據(jù)位,1位停止位,波特率為9600
//晶振為11.0592MHz,使用T1作為波特率發(fā)生器
//********************************************//
void UART_Tnit(void)
{
   SCON=0x50;
   TMOD=0x20;
   TH1=0xFA;
   TR1=1;
}
//**************主函數(shù)************************//
//初始化串口后不斷地發(fā)送及接收數(shù)據(jù),若接收到所發(fā)送的數(shù)據(jù)則點(diǎn)亮LED
//*******************************************//
int main(void)
{
   uint8 i;
   uint16 j;
   uint8 rcv_dat;
   uint8 count;
UART_Tnit();
   while(1)
   { count=0;                    // 計(jì)數(shù)變量清零
      for(i=0;i<50;i++)       //發(fā)送及接收50個(gè)數(shù)據(jù)
      { UART_SendByte(0x5A);
if(UART_RcvBYTE(&rcv_dat)!=0)
{
if(0x5A==rcv_dat) count++;   //若接收的數(shù)據(jù)為0x5A
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表