單(dan)片機(ji)如(ru)何實現短距離的無(wu)線數(shu)據(ju)傳輸
時間:2018-07-26 來(lai)源(yuan):未知
單片機如(ru)何實現短距離的(de)無線(xian)數據傳輸
單片機(ji)如何實現短(duan)距(ju)離的(de)無(wu)線(xian)(xian)數據傳(chuan)輸(shu)?在一些(xie)特殊的(de)應用(yong)中,單片機(ji)通信不能使用(yong)有線(xian)(xian)數據傳(chuan)輸(shu),但需要短(duan)距(ju)離無(wu)線(xian)(xian)數據傳(chuan)輸(shu)。短(duan)距(ju)離無(wu)線(xian)(xian)傳(chuan)輸(shu)具(ju)有抗干擾能力強(qiang)、可靠性高、安(an)全性好、受地理條件限制少、安(an)裝(zhuang)靈活等(deng)優點。它(ta)可以利用(yong)單片機(ji)和專(zhuan)用(yong)無(wu)線(xian)(xian)傳(chuan)輸(shu)芯片實現簡單的(de)短(duan)距(ju)離無(wu)線(xian)(xian)傳(chuan)輸(shu)方案。硬件部(bu)分包括MCU端和PC端,實現單片機(ji)與PC機(ji)之間的(de)數據傳(chuan)輸(shu)。
主要器件:
1、 單(dan)(dan)片(pian)(pian)機端:AT89C52單(dan)(dan)片(pian)(pian)機芯片(pian)(pian),用于(yu)控制無線模塊的發(fa)射和(he)接受(shou);PTR2000無線數據傳輸模塊,使用了433MHz IGM頻(pin)段,是真正的單(dan)(dan)片(pian)(pian)UHF無線收發(fa)一體(ti)芯片(pian)(pian),可以(yi)和(he)單(dan)(dan)片(pian)(pian)機的串口直(zhi)接相連。
2、 PC端(duan):PTR2000無線數據傳輸模塊;TTL電平(ping)(ping)轉(zhuan)換RS-232電平(ping)(ping)芯片MAX202。
試驗流(liu)程電(dian)路圖:

單片機端:

PC端:

試(shi)驗程序(xu)代碼(ma):
//wireless.h程序
#ifndef _WIRELESS_H // 防止(zhi)wireless.h被重復(fu)引用(yong)
#define _WIRELESS_H
#include // 引(yin)用標準庫的(de)頭文件
#include
#define uchar unsigned char
#define uint unsigned int
#define REQ_SEND 0x33
#define REQ_RESEND 0x66
#define SEND_OVER 0x99
//為簡化起見(jian),假設了7位固定的(de)采集數(shu)據
#define DATA0 0x10
#define DATA1 0x20
#define DATA2 0x30
#define DATA3 0x40
#define DATA4 0x50
#define DATA5 0x60
#define DATA6 0x70
sbit TXEN = P2^0;
sbit CS = P2^1;
sbit PWR = P2^2;
void ClearT_buf(); // 清(qing)除t_buf函數
void ClearR_buf(); // 清除r_buf函數(shu)
void Delay5ms(); // 延(yan)時5ms
void GetData(); // 采集數(shu)據
void Send(); // 采集并(bing)發送函數
void SendOver(); // 通知(zhi)PC機(ji)發送結束(shu)函數
xdata uchar Flag_StartRec = 0 ; //開(kai)始接受數(shu)據標(biao)志位
xdata uchar Flag_ReqSend = 0 ; //請(qing)求發(fa)送標志位
xdata uchar Flag_ReqReSend = 0 ; //請求重發標志(zhi)位
xdata uchar Flag_Delay5ms = 1 ; //延時(shi)5ms標志
xdata uchar Data[7]; //采集的7個字節(jie)數據
xdata uchar tCount = 0 ;
xdata uchar t_buf[11]; // 1開始字(zi)節"$",1長度字(zi)節LEN,
// 7字(zi)節數據,1校驗(yan)和字(zi)節,
// 1 結(jie)束字節"*"
xdata uchar rCount = 0 ;
xdata uchar r_buf[5]; // 1開始字(zi)節(jie)"$",1長度字(zi)節(jie)LEN,
// 1字(zi)節指(zhi)令,1校(xiao)驗(yan)和字(zi)節,
// 1 結束(shu)字節"*"
#endif
//wireless.c程序
#include "wireless.h"
/* 定時器0中(zhong)斷服務子程序 */
void timer() interrupt 1 using 2
{
Flag_Delay5ms = 0;
TH0 = -5000/256;
TL0 = -5000%256;
}
void main(void)
{
ClearT_buf();
ClearR_buf();
TXEN = 0; //初(chu)始為接收狀(zhuang)態
PWR = 1; //正(zheng)常工作模式
CS = 0; //選擇頻道0
EA=0;
/* 11.0592MHz下,設置串行口9600波(bo)特率,工作方式1
8位(wei)(wei)(wei)數據(ju)位(wei)(wei)(wei),1位(wei)(wei)(wei)停(ting)止位(wei)(wei)(wei),無奇偶校驗,*/
TMOD = 0x21; //定(ding)時器1工作模(mo)式1,定(ding)時器0工作模(mo)式2
SCON = 0x50; //串行(xing)口工作方式1,REN=1
PCON = 0x00; //SMOD=0
TL1 = 0xfd;
TH1 = 0xfd;
TR1=1; //定時器(qi)1開始計時
PT0 = 1; //定時(shi)器0高優先級
TH0 = -5000/256; //5ms
TL0 = -5000%256;
IE = 0x90; //EA=1,ES=1:打開串(chuan)口中斷
while (1)
{
if (Flag_ReqSend) //收(shou)到“請求發送”指(zhi)令
{
TXEN = 1; //改變為發射(she)狀態
Delay5ms(); //延時5ms
GetData(); //采集數據
Send(); //發送
Flag_ReqSend = 0;
SendOver(); //通(tong)知PC機發送結束
TXEN = 0; //重設(she)為接收(shou)狀態
}
else if (Flag_ReqReSend) //收(shou)到“請求重發(fa)”指令
{
TXEN = 1; //改變為發(fa)射狀態
Delay5ms(); //延時5ms
Send(); //重發
Flag_ReqReSend = 0;
SendOver(); //通知PC機(ji)發送結(jie)束
TXEN = 0; //重設為接收(shou)狀(zhuang)態
}
}
}
接上篇程序:
/* 串(chuan)口中斷服務子程序 */
void serial ( ) interrupt 4 using 1
{
RI = 0 ;
/* 判斷(duan)是否收到字符'$',其數值為0x24,置開(kai)始接收標志位*/
if ((!Flag_StartRec) && (SBUF == 0x24))
{
Flag_StartRec = 1;
}
if (Flag_StartRec)
{
if (rCount <5)
{
r_buf[rCount] = SBUF;
rCount ++;
}
/* 判(pan)斷是否收(shou)到字符'*',其(qi)數值為0x2A,根據接(jie)收(shou)的指令設置相應標志位*/
if ((r_buf[rCount -1] == 0x2A)||(rCount == 5))
{
rCount = 0;
Flag_StartRec = 0;
if (r_buf[2] == REQ_SEND) //收到(dao)“請求發(fa)送”指令
{
Flag_ReqSend = 1;
}
if (r_buf[2] == REQ_RESEND) //收(shou)到“請(qing)求重發”指令
{
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;
}
//采(cai)集數據函數經過簡(jian)化處理,取(qu)固定的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;
}
//單片機端發送數(shu)據(ju)函數(shu)
void Send(void)
{
uchar xdata j = 0;
uchar xdata len = 0;
uchar xdata CheckSum = 0 ;
t_buf[0]=0x24; //起始位
t_buf[1]=0x07; //7個(ge)數據字節
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; //校驗(yan)和字(zi)節(jie)
t_buf[10] = 0x2A; //停止位
for (j=0;j++;j<11)
{
TI =0 ;
SBUF = t_buf[j];
while ( TI ==0 );
TI =0 ;
}
}
//通知PC機端發送結束函數(shu)
void SendOver(void)
{
TI =0 ;
SBUF = 0x24;
while ( TI ==0 );
TI =0 ;
SBUF = 0x01;
while ( TI ==0 );
TI =0 ;
SBUF = SEND_OVER; //通(tong)知PC機端(duan)“發送結束”
while ( TI ==0 );
TI =0 ;
SBUF = 0x99; //校(xiao)驗和字節(jie)
while ( TI ==0 );
TI =0 ;
SBUF = 0x2A;
while ( TI ==0 );
TI =0 ;
}

