单片机实现段距离无线传输

发布者:楼高峰最新更新时间:2016-09-07 来源: eefocus关键字:单片机  段距离  无线传输 手机看文章 扫描二维码
随时随地手机看文章
在一些特殊的应用场合,单片机通信不能采用有线数据传输方式,而需要采用短距离的无线数据传输方式。短距离的无线传输具有抗干扰能力强、可靠性高、安全性好、受地理条件限制少、安装灵活等优点,可以利用单片机和专用无线传输芯片实现简单的短距离无线传输方案,硬件部分包括单片机端和PC机端,实现单片机和PC机间的数据传输。

 

主要器件:

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_SEND     0x33

#define REQ_RESEND  0x66

#define SEND_OVER    0x99      

 

//为简化起见,假设了7位固定的采集数据

#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();                       // 清除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 ;          

}

关键字:单片机  段距离  无线传输 引用地址:单片机实现段距离无线传输

上一篇:单片机实现485总线现场监测系统
下一篇:单片机实现点对点的数据传输-串口通讯

推荐阅读最新更新时间:2024-03-16 15:08

51单片机学习历程《二》——数码管的显示
数码管的使用非常广泛,有段锁存和位锁存,段锁存来显示你想显示的数字,位锁存用来定位某个数码管,这样就能被你控制显示花样的东西了,非常有趣! 实例一: 八个数码管从左到右分别显示0,1,2,3.。。。,7。 示例二:电话号码滚动显示
[单片机]
51<font color='red'>单片机</font>学习历程《二》——数码管的显示
自动驾驶、无线传输,汽车电子发展的终极是什么?
自动驾驶汽车、内嵌安全功能、平板显示器(FPD)链路、发动机启停系统以及更多设计想法在不远的将来都将被汽车所采用,这些功能将进一步增强人们的驾驶和娱乐体验,并超越亨利福特当初最狂热的梦想。 不久前,我遇到两位睿智和富有远见的TI公司汽车部门员工,与他们就快速增长的汽车电子领域的未来进行了讨论。全球汽车通信部门的Sonya Terry把我介绍给了汽车解决方案营销经理Fern Yoon,我们之间进行了极富信息量和创造性的会谈。FPD链路是我们就近期发展讨论的中心话题。 为什么是FPD链路? 这种链路可以实现整个车辆内的高速视频、音频和数据传输,如图1所示。 图1:FPD链路在新的汽车电子架构中有着极好的前景。 显示接口和
[嵌入式]
AVR单片机控制RTL8019AS实现以太网接口设计
简介:本文介绍了一种利用AVR单片机实现以太网接口电路的方法,硬件电路少,结构简单,使用方便。 随着互联网的迅速发展,各种家电设备、仪器仪表也在逐步走向网络化,以便共享网络信息资源、远程监控等,这也是嵌入式系统发展的趋势。而以太网作为目前应用最为广泛的局域网,在工业自动化和过程控制领域得到了越来越多的应用,因此,对于大量存在的8位微控制器而言,实现以太网通信具有重要的实际意义。现在应用较多的是基于51内核单片机的上网方案,由于处理能力的限制,要实现较复杂的网络传输和控制有点困难。本系统采用ATMEL公司的高性能单片机Mega64和10Mb/s以太网控制芯片RTL8019AS实现了以太网接口,详细介绍了硬件电路的连接以及嵌入 式
[单片机]
AVR<font color='red'>单片机</font>控制RTL8019AS实现以太网接口设计
基于P87LPC764型单片机的延时型漏电继电器设计
摘要:介绍以P87LPC764型单片机为核心的延时型漏电继电器设计方案。该方案可供用户选择实现额定动作电流和5倍额定动作电流下不同的延时动作时间,并有重合闸设定选择功能。解决了以往传统分立元件带来的延时时间离散性大且不实现的弊端。 关键词:延时时间 漏电继电器 单片机 设计 1 引言 漏电继电器是一种可在被保护线路漏电电流达到设定值(额定动作电流IΔ)后切断被保护线路供电电源的保护装置。漏电信号的检测由零序电流互感器来完成,它可将检测到的被保护线路的漏电电流转换成毫伏级的交流电压信号,再通过信号整流、放大和滤波得到一个直流电压,然后配合相应的控制电路来驱动执行回路,以实现切断保护线路供电电源的控制目的。简单的实现过程是信号
[单片机]
HOLTEK HT66FM5230 直流变频BLDC专用MCU
Holtek针对单相/三相直流无刷马达控制领域,推出DC-FAN风扇专用Flash版本的MCU HT66FM5230。HT66FM5230支持三相BLDC马达应用与单相BLDC马达应用,控制方案可完整支持方波与弦波方案,其中方波控制可支持霍尔(Hall Sensor)与无霍尔(Sensor-less)方案。搭载3对10-bit PWM脉波宽度调变控制输出,具互补式、Dead Time的PWM输出,与Polarity IO极性调整。有鉴于直流无刷马达的控制,需要有一回馈信号侦测过电流及过电压保护机制,HT66FM5230整合了OCP电路搭配ADC的整合使用,即可控制马达运转平顺及达到保护直流马达的功能。 HT66FM
[单片机]
HOLTEK HT66FM5230 直流变频BLDC专用<font color='red'>MCU</font>
格州电子:从电力线载波市场的弱点切入
  一个在RF领域深耕多年的朋友告诉我:最近做了一个用于工厂的无线传输仪表方案。这个工厂的环境比较复杂,无线技术安装方便的优势显得尤为突出。   但提及电力抄表时,他却毫不犹豫地选择了电力线载波抄表。“功率小了会受到影响,功率大了价格又高,”精于技术的他首先考虑的是可实现性。事实也确实如此。上海格州电子有限公司FAE经理苑维旺也告诉EEWORLD,国家无线电委员会不允许使用大功率无线基站做无线抄表,这样无线技术的传输距离会很短,一个楼可能就会把要传输的信号屏蔽掉。   而行业标准则是更大的挑战。无线抄表形成规模如果没有行业标准来约束,使用器件就会比较杂,多品牌的恶性成本竞争,必然是产品的功能和质量大打折扣,规模越大,恶性循环越
[工业控制]
80C51单片机对压力测量控制系统的设计
1 引言 目前我国发展煤炭生产机械化发展迅速。综采设备的应用,是提高效率、改善安全状况的措施。 影响开机率的一个主要因素是支架对工作面的顶板控制的好坏,因此,对综采工作面进行矿压监测与控制是很有必要的。要做到这一点,首先需要对井下工作面的液压支架的实际工作状况进行监测,通过对检测数据处理、分析,评定其效果,并采取相应措施,以提高开机率、提高产量。本文以监测综采液压支架的压力为研究内容,开发了一套基于单片机的压力测量控制系统。 2 压力测量控制系统功能设计 压力测量控制系统用于监测支架压力, 每台测量控制系统配有四只传感器, 可分别通过高压油管连接支架的立柱、平衡千斤顶, 前探梁千斤顶的油压腔。压力测量控制系统接收到通讯测量
[单片机]
80C51<font color='red'>单片机</font>对压力测量控制系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved