单片机串口无线通信通信

论文发表、论文指导
周一至周五
9:00&22:00
单片机与PC机的串行通信
  【摘要】 论述了一种实现单片机与PC机串行通信的软件方法,PC机利用VB6.0程序和Mscomm控件作为接口,单片机则使用汇编程序完成通信,并在通信之前使用联络信号和回应信号检测电路。此法实现简单,稳定可靠,在实际生产中应用广泛。 中国论文网 /2/view-611673.htm  【关键词】 单片机;PC机;串行通信;VB6.0;汇编程序      随着科学技术的发展,在单片机应用系统的设计中常常遇到计算机与外界的信息交换,即通信。鉴于PC机具有强大的监控和管理功能,单片机具有快速以及容易控制的特点,在实际应用中,一般都利用PC机所配置的RS-232C标准串行接口来实现应用系统与PC机之间的数据交换。Visual Basic 6.0(简称VB6.0)在通信方面提供了专门的Communications控件,即控件Mscomm,可以完成简单的串行端口通讯功能,也可以用来创建功能完备、事件驱动的高级通讯工具。可以利用VB6.0的Mscomm控件来实现PC机与多台MCS-51单片机之间的串行通信。该控件提供了一系列标准通讯命令的使用接口,利用它可以建立与串行端口的连接,并通过串行端口连接到其它仪器设备,从而发出命令、交换数据、以及监视和响应连接中发生的事件与错误。   一、系统结构设计   本系统是由一台上位PC机和若个台以M CS-51单片机为核心的下位机构成。大多数PC机都配备有串行通讯端口RS-232C,用于两台计算机间进行串行通讯,但单片机的输入、输出电平为TTL电平,与PC机的RS-232C标准串行接口的电气规范不一致,要实现单片机与PC机之间的数据通信,还必须进行电平转换,在上位PC机与下位机的连接中采用RS-232C/RS-485转换器,将PC机串口的标准由RS-232C电平信号转换成RS-485的差分信号。RS-485具用“平衡差动式”的数据传输特性,工作于半双工方式,RS-485的串行通信线路可采用最普遍的双绞线,且在抗干扰能力和带负载能力方面较其它的串行接口标准有非常明显的优势,适用于高速率和远距离的串性通信场合。PC机与多个单片机通信的电路结构图(如图1所示)。   图中的下位机是以MCS-51为核心的单片机系统,该系统由一片MCS-51外加一片256K的Eprom组成,并由外围芯片构成系统数据输入功能块、电机驱动功能块、数据输出功能块和通信功能块,其中通信功能块可选择下列三种通信方式之一,即由74LS245芯片构成的并行通信方式、由MAX232芯片构成的RS-232C串行通信方式以及由75176芯片构成的RS-485串行通信方式。   图1PC机与多个单片机通信的电路结构图   二、PC机的程序设计   VB6.省略mport=1 ;设置通讯端口号为com1   Mscomm1.setting=’1200,N,8,1’ ;设置为字符串形式,波特率为1200,无校验位,8位数据位,1位停止位   Mscomm1.portopen=打开通讯端口   (2)连接和发送缓冲区的属性设置   Inbuffersize=256 ;接收缓冲区为256个字符   Outbuffersize=2 ;发送缓冲区为2个字符   Rthreshold =6 ;每当缓冲区收到6个字符就产生oncomm事件   Sthreshold=1 ;发送缓冲区为空触发事件   Inputlern=0 ;读取接收缓冲区所有字符   (3)主程序清单   Private sub commandl_click()   Textl.text=’检查下位机的连线’   Endsub   Private sub command2_click()   Comml.Output =chr(49)   Textl.text=’1#’ ;1号下位机   Endsub   Private sub command3_click()   Comml.Output =chr(50)   Textl.text=’2#’ ;2号下位机   Endsub   Private sub command4_click()   Comml.Output =chr(51)   Textl.text=’3#’ ;3号下位机   Endsub   Private sub command5_click()   End   Endsub   Private sub comm1.省略mevent   Case comEvReceive   Dim data(100)as string   Data num>=comml. input   k=data(num)   Textl.text=k    Endselect   Endsub   三、单片机的程序设计   下位机中关于RS-485的串行通信部分采用MCS-51系列单片机的汇编语言编写。MCS-51系列单片机有一个标准的全双工串行接口,其串行控制寄存器SCON包含串行工作方式选择位、接收发送控制位以及串行口状态标志位。SCON在单片机中的地址为98H。假设MCS-51单片机从外部采集到的一组30个的数据,并存在片内RAM 20H~3DH区域中,现要求将这个数据块传送给PC机。为了保证传送的正确,在传送前应由单片机先向PC机发送联络信号#55H,PC机准确接收到后,向单片机发送回应信号#0AAH,在检验无误后,单片机才开始向PC机传送数据。对串行口的操作可分为以下四步进行:(1)串行口初始化;(2)发送联络信号;(3)接收回应信号;(4)发送数据。   汇编程序代码如下所示:   ORG0030H   START: MOVSP, #60H   MOVTMOD, #20H ;Tl工作在模式2下   MOVTH 1, #F3H   MOVTL1, #F3H ;波特率设置为1200   SETB TRl   MOVPCON, #00H ;SMOD=0   MOVSCON, #50H ;选择串行方式1   MOVR0, #20H   MOVR2, #30 ;数据个数   XX1: MOVA, #55H   MOVSBUF,A ;发送联络信号   WAITl: JBCT 1, W AIT2 ;等待发送完毕   AJMPWAIT1   WAIT2: JBC R1, READ ;等待接收完毕   AJMPWAIT2   READ:MOVA, SBUF ;接收联络信号   CJNEA,#0AAH, XX 1 ;接收数据不正确,重新开始   LOOP:MOVA,@R0   MOVSBUF,A   WAIT:JBC T1, LOOP1 ;等待发送完毕   AJMPWAIT   LOOPl:JNCR0   DJNZR2, LOOP   END   在VB6.0下实现串行通信有多种方法,除利用Windows API函数和利用Mscomm ActiveX控件外,还可通过VB调用动态链接库dll来实现,本文只介绍了如何利用Mscomm控件来实现串行通信。当前,基于VB6.0的PC机与单片机的串行通信技术在我国发展已比较成熟,应用也比较广泛。   参考文献   [1]陈立元.Visual Basic与RS232串行通信控制.北京:清华大学出版社,   [2]李朝青.PC机及单片机数据通信技术.北京:北京航空航天大学出版社,   [3]胡汉才.单片机原理及系统设计.清华大学出版社,2003   [4]李湘江.基于VB串行通信技术的应用开发.北京:机械与电子出版社,   [5]周航慈.单片机程序设计基础.北京:北京航空航天大学出版社,2003
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。& & & 按一般介绍,多机通信的主机与从机连接如图1-9所示,通过软件编程实现由主机查询、从机响应的通信方式,但这种通信方式只限于主机与从机近距离(几米)范围内。这是因为串行口TxD发出的TTL信号无论在驱动能力还是在抗干扰能力方面都不足以实现远距离串行数据传送,所以要实现单片机串行口的远距离通信(几十米到几千米),必须另辟蹊径。
远距离串行通信
1.单片机远距离串行通信电路& &
& & & 为实现单片机的远距离串行通信,在串行口TxD和RxD信号前端分别加入一差分驱动器MC3487和一差分接收器MC3486,变电平收发为差分收发。加入差分驱动和差分接收电路后的多机串行通信连接如图1- 10所示。空方框代表加入的差分驱动、接收电路。由图可知,加入差分驱动、接收器后,主机与从机的连线只剩下D+和D_两根数据线,主机与从机无需共地连接,彻底消除了远距离因地电位不等造成的影响,且简化了拉线。但值得注意的是,两根传输线要用双绞线,以更好地消除电磁干扰。接入驱动、接收电路后不影响原通信程序设计。
& & & 电路与单片机有TxD,RxD,GND三个连接信号,输出有D+和D_两个数据信号。电路中用到一个74LS04、一个MC3487差分驱动器和一个MC3486差分接收器;C1和C2分别为传输线D+和D_的,用于滤除系统高频干扰;Ri为D+信号的电平提升。MC3487和MC3486是配对的优良差分驱动、接收芯片,电气性能符合串行通信的RS - 422 A标准。市场上可以购买到,且价格不高(国产型号分别为DS3487和DS3486)。& &
& & & MC3487的引脚如图1- 12所示,真值表如表1-6所列。它是一个有三态输出的四RS -422 A传输线驱动器,脚1是第一个驱动器的输入端;脚2、脚3是第一个驱动器的、输出,输出受脚4控制。当脚4为低电平时,输出脚2、脚3呈高阻态。MC3486的引脚如它是一个有三态输出的四差分线路接收器,脚l、脚2为第一个差分接收器的反相、同相输入端;脚3为输出端,输出受脚4电平控制。当脚4接高电平时,允许输出。& &
& & & 现在来分析一下图1 - 11差分驱动接收电路的工作过程。以串行口发送数据为例,当TxD送出低电平时,经74LS04反相后变高电平加到MC3487的控制端脚4。输入端脚1固定接地,为低电平。由表1-6可知,此时输出脚2为低电平,脚3为高电平,脚2和脚3信号分别经传输线D+和D_送到远端差分驱动器、接收器。此时远端接收MC3486的脚2(对应D+)收到为低电平,脚1(对应D_)收到为高电平,即运放器同相输入端为低电平,反相输入端为高电平。所以输出脚3为低电平,也即远端单片机RxD收到的信号与发端单片机TxD发出的低电平一致。当TxD发送高电平时,经反相加在控制脚4为低电平。此时输出端脚2和脚3都呈高阻态,相当于悬空。这时远端接收因D+接有电平,故D+为高电平,而D_为低电平,也即远端接收MC3486的输入端脚2为高电平,脚1为低电平,输出脚3为高电平。由上面分析可知,远端RxD收到的信号电平完全是发送端TxD的电平,即对单片机收/发端串行通信口的电平状态不改变。因MC3487具有较强的线路驱动能力,加上MC3486的差分电平接收,大大延长了数据传输的距离,消除了共地系统的地势电位影响。&
2.计算机远距离串行通信电路&
& & & 有时多机通信系统中一端是计算机或两端都是计算机,如图1 - 14所示。通常计算机本身都带有RS - 232C串行通信口。RS - 232C串行口是电子工业协会(EIA)的一种标准串行数据通信口,在电气性能上采用负逻辑定义。逻辑1电平为-5~-15 V,逻辑O电平为+5~+15 V。但RS一232C的通信距离也不允许太远,一般要求在15 m内。为延长计算机通信距离,可像前面介绍的方法一样,在RS - 232C前加入一个232C/422A转换器,把232C电平传输变成差分驱动、接收。232C/422A转换器的电路如图1-15所示。由图可见,电路只是比前面详细介绍过的图1- 11电路多加一片MC1489和一片MC1488。MC1489是RS - 232C串行通信接收器,图1-15中它把计算机串行TxD发出的232C成TTL电平,供MC3487驱动传输;MC1488是RS - 232C串行通信发送器,图1-15中它把MC3486接收的电平转换成232C电平,送到计算机串行接收端RxD。这样接入232C/422A转换器后,计算机间变成差分线路传输,只需D+和DL两根双绞线,达到延长通信距离,消除共地地电势影响的目的。
  实际应用系统    单片机、计算机的远距离串行通信已应用在重庆市交通局的多区制、多信道集群无线通信系统中。我们将重庆市交通局组建的集群无线通信网分为四个区,覆盖全市9区、12县。每个区的总台控制中心如图1 - 16所示。总台控制中心采用STD工业控制微机为上位机,通过一块用单片机8031做成的串行通信板与各信道从机进行串行数据通信。系统中每个工作信道由一块用单片机8751做成的控制板对电台进行控制和管理,同时控制板通过单片机串行口与上位主机通信板实现串行通信,把数据送向上位STD微机进行处理,并接受上位机的命令控制。串行通信板与各信道控制板的通信就是一个典型的单片机多机通信系统,因各信道电台架设在山上,与STD工业控制微机所处的控制室相距较远(最远2~3 km),采用了上面介绍的远距离串行通信方法,通信速率取2 400 b/s,软件设计加入CRC - 16检验,自开通以来,通信网运行可靠,串行通信数据误码率极低。
& & & 以上所介绍的单片机、计算机远距离串行通信方法不失为一种简便、可行的方法。利用现成的集成芯片,采用最经济的双线传输,解决了远距离数据交换的问题。它具有抗电磁干扰能力强,速率高,误码率低,彻底摆脱了公共地电势电平影响等优点;其缺点是数据传输只能以半双工方式进行,即不能同时收/发,当距离更远(万米以上)时,恐怕就只能改用其他传输方法了,如加,利用现行电话线进行传输等方法。
&&&&&往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&) 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
教你如何使用Labview与单片机通信(串口)
下载积分:1000
内容提示:教你如何使用Labview与单片机通信(串口)
文档格式:PDF|
浏览次数:938|
上传日期: 12:32:07|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
教你如何使用Labview与单片机通信(串口)
关注微信公众号1 #include&reg52.h&
3 //------------------串口通信协议-----------------//
客户端数据包格式解释(长度恒为15):
例如:A01_fmq_01Off___#
A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)
01-----设备代号
fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部
#---------数据包的结束标记
服务器端数据包格式解释(长度恒为15):
例如:A02_SenT010250#
A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)
02-----设备代号
SenT010250--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部
#---------数据包的结束标记
19 char buf_string[16];
//定义数据包长度为15个字符
20 #define deviceID_1Bit '0'
//用于串口通信时,定义本地设备ID的第1位
21 #define deviceID_2Bit '2'
//用于串口通信时,定义本地设备ID的第2位
22 #define datapackage_headflag 'A'
//用于串口通信时,定义数据包头部的验证标记
24 char DataPackage_DS18B20[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','S','e','n','T','X','X','X','X','X','X','#'};
25 char HeartBeat[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','B','e','a','t','X','X','X','X','X','X','#'};
26 //----------------------------------------------//
27 /*******************************
MCU:89C52RC
11.0592MHz
31 //11.0592MHz 0xd0 1200bps
32 //12MHz 0xcc 1200bps
33 //11.0592MHz 0xfa 9600bps
34 //0xf4 11.0592MHz
0xf3 12MHz 4800bps
35 //均在SMOD=1的情况下(波特率倍增模式)
36 *******************************/
37 //串口发送函数
38 void PutString(unsigned char *TXStr)
while(*TXStr!=0)
while(TI==0);
50 //串口接收函数
51 bit ReceiveString()
char * RecStr=buf_
char num=0;
unsigned char count=0;
*RecStr=SBUF;
if(num&14)
//数据包长度为15个字符,尝试连续接收15个字符
while(!RI)
if(count&130)return 0;
//接收数据等待延迟,等待时间太久会导致CPU运算闲置,太短会出现"数据包被分割",默认count=130
73 //定时器1用作波特率发生器
74 void Init_USART()
SCON=0x50;
//串口方式1,使能接收
TMOD|=0x20;
//定时器1工作方式2(8位自动重装初值)
TMOD&=~0x10;
PCON|=0x80;
//提高串口中断优先级
//开启串口中断使能
88 //比较指令头部
89 bit CompareCMD_head(char CMD_head[])
unsigned char CharN
for(CharNum=0;CharNum&4;CharNum++)
//指令长度为10个字符
if(!(buf_string[CharNum+4]==CMD_head[CharNum]))
//指令头部匹配失败
//指令头部匹配成功
101 //比较指令尾部(start:从哪里开始比较,quality:比较多少个字符,CMD_tail[]:要比较的字符串)
102 bit CompareCMD_tail(unsigned char start,unsigned char quality,char CMD_tail[])
unsigned char CharN
for(CharNum=0;CharNum&CharNum++)
if(!(buf_string[start+CharNum]==CMD_tail[CharNum]))
114 bit Deal_UART_RecData()
//处理串口接收数据包函数(成功处理数据包则返回1,否则返回0)
//PutString(buf_string);
if(buf_string[0]==datapackage_headflag&&buf_string[14]=='#')
//进行数据包头尾标记验证
switch(buf_string[1])
//识别发送者设备ID的第1位数字
switch(buf_string[2])
//识别发送者设备ID的第2位数字
if(CompareCMD_head("Ligt"))
//判断指令头部是否为"Ligt"
//下面是指令尾部分析
switch(buf_string[8])
switch(buf_string[9])
if(CompareCMD_tail(10,3,"Off"))
//A03_Ligt01Off_#
//要执行的代码140
if(CompareCMD_tail(10,3,"On_"))
if(CompareCMD_head("SenT"))
if(CompareCMD_head("jdq_"))
if(CompareCMD_head("Try!"))
183 /************************
185 ************************/
186 //串口中断服务函数-----------
187 void USART() interrupt 4
//标志位TI和RI需要手动复位,TI和RI置位共用一个中断入口
if(ReceiveString())
//数据包长度正确则执行以下代码
Deal_UART_RecData();
//数据包长度错误则执行以下代码
//LED1=~LED1;
//接收并处理一次数据后把接收中断标志清除一下,拒绝响应在中断接收忙的时候发来的请求
201 /***************************
203 ***************************/
204 void main()
Init_USART();
//PutString(buf_string);//空格20H,回车0DH
这个模块代码用于快速实现可扩展的串口通信
尊重作者的劳动,转载请记得注明来源:http://www.cnblogs.com/weifeng727/p/5617924.html
阅读(...) 评论()没有更多推荐了,
不良信息举报
举报内容:
串行通信总结(实现两个单片机之间的通信)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 串口通信的接收与发送 的文章

 

随机推荐