新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機實現段距離無線傳輸

        單片機實現段距離無線傳輸

        作者: 時間:2016-11-18 來源:網絡 收藏
        在一些特殊的應用場合,單片機通信不能采用有線數據傳輸方式,而需要采用短距離的無線數據傳輸方式。短距離的無線傳輸具有抗干擾能力強、可靠性高、安全性好、受地理條件限制少、安裝靈活等優點,可以利用單片機和專用無線傳輸芯片實現簡單的短距離無線傳輸方案,硬件部分包括單片機端和PC機端,實現單片機和PC機間的數據傳輸。

        本文引用地址:http://www.104case.com/article/201611/315971.htm

        主要器件:

        1、單片機端:AT89C52單片機芯片,用于控制無線模塊的發射和接受;PTR2000無線數據傳輸模塊,使用了433MHz IGM頻段,是真正的單片UHF無線收發一體芯片,可以和單片機的串口直接相連。

        2、PC端:PTR2000無線數據傳輸模塊;TTL電平轉換RS-232電平芯片MAX202。

        試驗流程圖:


        試驗電路圖:

        單片機端:

        PC端:

        試驗程序代碼:

        //wireless.h程序

        #ifndef_WIRELESS_H//防止wireless.h被重復引用

        #define_WIRELESS_H

        #include //引用標準庫的頭文件

        #include

        #define uchar unsigned char

        #define uint unsigned int

        #define REQ_SEND0x33

        #define REQ_RESEND0x66

        #define SEND_OVER0x99

        //為簡化起見,假設了7位固定的采集數據

        #define DATA00x10

        #define DATA10x20

        #define DATA20x30

        #define DATA30x40

        #define DATA40x50

        #define DATA50x60

        #define DATA60x70

        sbit TXEN = P2^0;

        sbit CS = P2^1;

        sbit PWR = P2^2;

        void ClearT_buf();//清除t_buf函數

        void ClearR_buf();//清除r_buf函數

        void Delay5ms();//延時5ms

        void GetData();//采集數據

        void Send();//采集并發送函數

        void SendOver();//通知PC機發送結束函數

        xdata uchar Flag_StartRec = 0 ;//開始接受數據標志位

        xdata uchar Flag_ReqSend = 0 ;//請求發送標志位

        xdata uchar Flag_ReqReSend = 0 ;//請求重發標志位

        xdata uchar Flag_Delay5ms = 1 ;//延時5ms標志

        xdata uchar Data[7];//采集的7個字節數據

        xdata uchar tCount = 0 ;

        xdata uchar t_buf[11];// 1開始字節"$",1長度字節LEN,

        // 7字節數據,1校驗和字節,

        // 1結束字節"*"

        xdata uchar rCount = 0 ;

        xdata uchar r_buf[5];// 1開始字節"$",1長度字節LEN,

        // 1字節指令,1校驗和字節,

        // 1結束字節"*"

        #endif

        //wireless.c程序

        #include "wireless.h"

        /*定時器0中斷服務子程序*/

        void timer() interrupt 1 using 2

        {

        Flag_Delay5ms = 0;

        TH0 = -5000/256;

        TL0 = -5000%256;

        }

        void main(void)

        {

        ClearT_buf();

        ClearR_buf();

        TXEN = 0;//初始為接收狀態

        PWR = 1;//正常工作模式

        CS = 0;//選擇頻道0

        EA=0;

        /* 11.0592MHz下,設置串行口9600波特率,工作方式1

        8位數據位,1位停止位,無奇偶校驗,*/

        TMOD = 0x21;//定時器1工作模式1,定時器0工作模式2

        SCON = 0x50;//串行口工作方式1,REN=1

        PCON = 0x00;//SMOD=0

        TL1 = 0xfd;

        TH1 = 0xfd;

        TR1=1;//定時器1開始計時

        PT0 = 1;//定時器0高優先級

        TH0 = -5000/256;//5ms

        TL0 = -5000%256;

        IE = 0x90;//EA=1,ES=1:打開串口中斷

        while (1)

        {

        if (Flag_ReqSend)//收到“請求發送”指令

        {

        TXEN = 1;//改變為發射狀態

        Delay5ms();//延時5ms

        GetData();//采集數據

        Send();//發送

        Flag_ReqSend = 0;

        SendOver();//通知PC機發送結束

        TXEN = 0;//重設為接收狀態

        }

        else if (Flag_ReqReSend)//收到“請求重發”指令

        {

        TXEN = 1;//改變為發射狀態

        Delay5ms();//延時5ms

        Send();//重發

        Flag_ReqReSend = 0;

        SendOver();//通知PC機發送結束

        TXEN = 0;//重設為接收狀態

        }

        }

        }

        接上篇程序:

        /*串口中斷服務子程序*/

        void serial ( ) interrupt 4 using 1

        {

        RI = 0 ;

        /*判斷是否收到字符$,其數值為0x24,置開始接收標志位*/

        if ((!Flag_StartRec) && (SBUF == 0x24))

        {

        Flag_StartRec = 1;

        }

        if(Flag_StartRec)

        {

        if(rCount <5)

        {

        r_buf[rCount] = SBUF;

        rCount ++;

        }

        /*判斷是否收到字符*,其數值為0x2A,根據接收的指令設置相應標志位*/

        if ((r_buf[rCount -1] == 0x2A)||(rCount== 5))

        {

        rCount= 0;

        Flag_StartRec = 0;

        if (r_buf[2] == REQ_SEND)//收到“請求發送”指令

        {

        Flag_ReqSend = 1;

        }

        if (r_buf[2] == REQ_RESEND)//收到“請求重發”指令

        {

        Flag_ReqReSend = 1;

        }

        }

        else

        ClearR_buf();

        }

        }

        void ClearT_buf(void)

        {

        uchar xdata k ;

        for (k=0;k++;k<11)

        {

        t_buf[k] = 0;

        }

        }

        void ClearR_buf(void)

        {

        uchar xdata k ;

        for (k=0;k++;k<5)

        {

        r_buf[k] = 0;

        }

        }

        void Delay5ms(void)

        {

        TR0=1;

        ET0=1;

        while( Flag_Delay5ms);

        ET0 = 0;

        TR0 = 0;

        Flag_Delay5ms = 1;

        }

        //采集數據函數經過簡化處理,取固定的7個字節數據

        void GetData(void)

        {

        Data[0]=DATA0;

        Data[1]=DATA1;

        Data[2]=DATA2;

        Data[3]=DATA3;

        Data[4]=DATA4;

        Data[5]=DATA5;

        Data[6]=DATA6;

        }

        //單片機端發送數據函數

        void Send(void)

        {

        uchar xdata j = 0;

        uchar xdata len = 0;

        uchar xdata CheckSum = 0 ;

        t_buf[0]=0x24;//起始位

        t_buf[1]=0x07;//7個數據字節

        len=t_buf[1];

        CheckSum = CheckSum + len;

        for ( j=0;j++;j

        {

        t_buf[j+2] = Data[j];

        CheckSum = CheckSum + t_buf[j+2];

        }

        t_buf[9] = CheckSum;//校驗和字節

        t_buf[10] = 0x2A;//停止位

        for (j=0;j++;j<11)

        {

        TI =0 ;

        SBUF = t_buf[j];

        while ( TI ==0 );

        TI =0 ;

        }

        }

        //通知PC機端發送結束函數

        void SendOver(void)

        {

        TI =0 ;

        SBUF = 0x24;

        while ( TI ==0 );

        TI =0 ;

        SBUF = 0x01;

        while ( TI ==0 );

        TI =0 ;

        SBUF = SEND_OVER;//通知PC機端“發送結束”

        while ( TI ==0 );

        TI =0 ;

        SBUF = 0x99;//校驗和字節

        while ( TI ==0 );

        TI =0 ;

        SBUF = 0x2A;

        while ( TI ==0 );

        TI =0 ;

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 河北省| 宁化县| 霞浦县| 平定县| 祥云县| 乌拉特后旗| 卢湾区| 遵化市| 惠安县| 双牌县| 昌宁县| 海伦市| 怀远县| 永州市| 封开县| 内黄县| 林州市| 衢州市| 高碑店市| 徐水县| 达日县| 吴忠市| 蕉岭县| 合肥市| 康马县| 湖北省| 岱山县| 临夏县| 登封市| 新平| 宜城市| 宜兰县| 桃江县| 新乐市| 蓬莱市| 柳州市| 彭阳县| 和田县| 读书| 逊克县| 和龙市|