基于VC和单片机的上下位机串口通讯系统设计

基于VC和单片机的上下位机串口通讯系统设计
基于VC和单片机的上下位机串口通讯系统设计

基于VC和单片机的上下位机串口通讯系统设计

摘要

论文详细介绍了单片机做下位机与VC设计的上位机进行通信的软硬件实现。在硬件设计中,下位机采用AT89C52单片机系统与上位机系统通过RS-232串行通信端口进行互连,采用MAX232电平转换器完成双向电平转换功能。单片机系统接收由上位机传输过来的PID参数并在LED数码管上显示,同时可通过按键分别对参数进行加减操作,把修改后的PID参数再传给上位机。在软件设计中,上位机采用Visual Studio 2008中的MFC编写上位机的界面程序。上位机可以显示测量数据,调节阀门开度,设定PID参数并可将参数传给下位机,也可接收下位机发送的PID参数。

关键词:单片机;VC;串口通信;PID参数。

目录

第1章前言 (3)

第2章总体设计方案 (4)

2.1 上位机程序设计 (4)

2.1.1 面向对象的程序设计 (4)

2.1.2 Windows应用程序 (5)

2.1.3 Windows消息机制 (5)

2.1.4使用MFC程序设计 (6)

2.2上位机串口编程 (7)

2.2.1串口介绍 (7)

2.2.2使用串口控件方法 (7)

2.3下位机设计介绍 (8)

2.3.1单片机的通信方式 (8)

2.4上下位机通信协议 (10)

第3章硬件设计 (12)

3.1 单片机的选择 (12)

3.2 电平转换器MAX232 (12)

3.3 74LS164LED驱动芯片 (12)

3.4 LED显示器 (13)

3.4.1 LED显示器工作原理 (13)

3.4.2 LED显示器接口 (13)

第4章软件设计 (14)

4.1上位机编程方案选择 (14)

4.1.1上位机软件流程图 (14)

4.1.2上位机程序设计 (16)

4.2 下位机编程方案选择 (22)

4.2.1上位机软件流程图 (22)

4.2.2下位机程序设计 (24)

第5章总结 (34)

参考文献 (35)

附录A (36)

附录B (38)

第1章前言

随着计算机技术尤其是单片微型机技术的发展,单片机被广泛应用在工业控制系统中。单片机具有体积小、价格低廉、开发应用方便、可应用于恶劣工业环境的特点,在分布式控制系统中多采用单片机进行数据采集和现场控制。由于单片机的计算能力有限,难以进行复杂的数据处理,因此在功能复杂的控制系统中常采上位机下位机系统,单片机用作下位机进行数据采集和设备控制,而PC机用做上位机进行复杂的数据处理和对单片机的控制。

现代信息网络技术的一个突出特点,就是使工业控制系统中的所有设备连接成网,从而在一个核心软件管理下工作,形成一个有机的整体。这种整体网络方式在现代工业控制系统具有传统独立控制系统所无法比拟的先进性,不仅能极大地提高工业设备的生产效率,还可以大大提高系统的安全性和可靠性。

在单片机的输入输出控制中,除直接接上小键盘和LCD显示屏等方法外,一般都通过串口和上位机PC进行通信。这样不仅能够实现远程控制,而且能够利用PC机强大的数据处理功能以及友好的控制界面。在一般的利用PC机对单片机进行控制的场合,都是采用Windows作为上位机的平台,其优点是界面友好,编程和操作都比较容易。因此研究PC机与单片机串行通信具有重要的现实及工业意义。

第2章总体设计方案

本课程设计中,开发上位机程序使用的开发环境是WIN7系统下用微软的VS2008集成开发环境,所用语言为C++。主要任务是界面设计和串口通信的实现,以及由下位机上传的水位数据的图形显示。

下位机部分,开发所使用的集成环境为keil4,使用编程语言为C语言。下位机主要实现的功能是收发数据,即与上位机进行通信。通信的内容有PID参数的下传与显示,阀门开度的下传,以及水位数据上传给上位机。

其中上下位机通信采用的是异步串行通信。通过RS—232和modbus协议完成数据通信的过程。其流程图如图2.1所示。

图2.1 总体设计方案流程图

2.1 上位机程序设计

2.1.1 面向对象的程序设计

这次开发所使用C++就是一种面向对象的编程语言,VisualStudio2008就是开发Windows程序最主要的集成开发环境之一,它不仅是C++语言的集成开发环境,还与Win32紧密相连,因此,VisualStudio2008可以完成各种应用程序开发,从底层的软件到顶层面向用户的软件。使用VisualStudio2008环境开发应用程序缩短了开发时间,且界面友好,易于操作。

在开发Windows应用程序时,主要使用Windows提供的Windows API 即应用程序接口函数,或者是Microsoft提供的MFC 即微软基础类库。其中使用API 开发Windows应用程序,我们需要大量的调用系统的API函数,而使用MFC实现同样的功能,系统会通过封装的方式提供给我们现成的功能模块调用,甚至大量的代码将由编译器自己生成。省去了程序员大量的编写代码的时间,提高了编写Windows应用程序的效率。是程序员专注于手中将要实现的任务,而非相对底层的实现机制。这样更有利于开发出大型的,面向对象的应用程序。

2.1.2 Windows应用程序

由于要开发的上位机需要与有良好的人机界面,这样就需要开发一个具有图形窗口的应用程序。

在Windows图形操作系统下,窗口程序是基于事件驱动的,也就是说用户可能随时发出各种消息,而每当一个操作完成,窗口程序也要完成相应的处理功能。这与DOS下顺序执行的操作方式有很大的不同。一个完整的窗口程序如图2.2。

图2.2应用程序窗口

2.1.3 Windows消息机制

Windows程序启动后,执行特定的任务,其中最重要的是创建应用程序的主窗口,这个主窗口需要自己的代码来处理Windows发送给它的信息,所以Windows 程序是通过来自操作系统的消息来处理用户的输入。Windows中的大部分消息是严格定义的,而且适用于所有的程序。例如,当创建一个窗口时,发送一个WM_CREAT消息;当用户按下鼠标左键时,会发送一个 WM_LBUTTONDWON消息。Windows还对选定的窗口发送 WM_COMMAND消息,以响应用户菜单的选择、对话框按钮的单击等操作,用户也可以定义自己的消息,并且能够由程序发送到桌面的任何窗口,接收响应。

Windows对消息的处理过程为:Windows在系统内部有一个消息队列,当输入设备有所动作的时候,Windows都会产生响应的记录放在系统的消息队列里,而每个记录中包含了消息的类型、发生的位置和发生的时间。同时,Windows为

每个程序维护一个消息队列,Windows检查系统消息队列里的应用程序消息发生的位置,进而送到相应的窗口中去。

2.1.4使用MFC程序设计

MFC中的类的名称都是以C为开头的,如果需要定义自己的类或者根据MFC 库的基类派生新类时要使用相同的约定。这样更有助于程序的理解。而变量的命名需要使用匈牙利命名法。这样可以是代码更加容易阅读。

MFC中如果要得到完整的应用程序,只需要从MFC中派生两个类即可:应用程序类和窗口类。

CWinApp类对任何使用MFC编写的Windows程序来说都很重要,该类包括的对象包括启动、初始化、运行和关闭应用程序所需的一切代码。

MFC应用程序与用户交互的界面被称作框架窗口,因此,需要为应用程序从MFC 类CFrameWnd中派生一个窗口类,而此类提供了创建和管理应用程序窗口所需的一切。

MFC程序的结构包括两个面向应用的实体——文档和视图。

文档是给予应用程序中与用户交互的数据集合的名称。文档类是从MFC的库中的CDocument类派生的,需要添加数据成员来存储应用程序需要的数据,还要添加成员函数来支持对数据的处理。

视图总是与特定的文档对象相关。视图对象可以提供一种机制来显示文档中存储的部分或全部数据。视图定义了在窗口中显示的数据的方式以及与用户交互的方式。与定义的文档方式类似,自己的视图类是通过CView类派生出来的。显示视图的窗口框架被称为框架窗口。视图实际上是在自己的、完全充满框架窗口的客户区窗口中显示的。

文档对象可以拥有任意多个与其相关的视图对象。各个视图对象可以提供文档数据或文档子集的不同表示方法。

MFC提供了使文档与其视图相结合,以及使各个框架窗口与当前的活动视图相结合的机制。文档对象自动维护着指向相关视图的指针列表,而视图对象拥有存储相关文档对象的指针的数据成员。各个框架窗口都存储着一个指向当前活动视图对象的指针。文档、视图和框架窗口之间的协作,是由另一个名为文档模版的MFC类的对象安排的。这些指针使一种类对象的函数成员可以访问另一种类对

象的公有数据或接口中的函数成员。

应用MFC编程时使用的到的功能组件:

(l)应用程序向导(Appwizard)。Appwizard是一个标准的C++源代码生成器。它通过一系列的对话框来提示用户输入所需创建的程序的信息。然后APPWizard 生成一些文件,这些文件构成程序的框架。由APPwizard生成的程序是一个基本的Windows程序,它生成的是基本代码,用户应在此基础上完善自己内容。

(2)类向导(Classwizard)。Classwizard是一个交互式工具,主要进行类代码的维护。用来建立新的类,定制类,把消息映射为类成员函数,或者把控制框映射为类变量成员。在开发程序时,可用Classwizard建立程序所需要的类,包括消息处理和消息映射例程(用于定位处理消息的代码)。

(3)资源视图(ResourceView)。ResourceView包含了项目中所有的层次列表,用于编辑和管理应用程序中用到的各种可视元素,包括快捷键、对话框、图标、菜单、字符串、工具栏等。

(4)类视图(ClassView)。ClassView用于显示项目中所有的类信息,主要是定制现有的类和建立新的类,并在每个类中,显示了成员函数和成员变量,还可以完成添加、删除、定位的功能。

(5)文件视图(FileView)。FileView视图同ClassView非常相似,将项目中的所有文件(C++源文件、头文件、资源文件、Help文件等)以视图的形式分类显示。在视图中可以显示和编辑源文件和头文件。

2.2上位机串口编程

2.2.1串口介绍

经过多年的发展,现今已经形成了许多串行通信接口的标准。其中本次课程设计用到的RS-232标准是美国EIA(电子工业联合会)与BELL公司一起开发的通信协议。它适合于数据传输速率在0—20000bit/s的范围内通信。

目前比较常用的串口有9针串口(DB9)和25针串口(DB25),近距离通信可以直接将通信接口用相应的线缆直接相连。

2.2.2使用串口控件方法

在win32环境中,实现串口编程一般可以通过两种方法实现:一是使用Windows 提供的API函数。另一种是使用MSComm ActiveX 串口通信控件来实现。

API函数的使用为编程提供了最大的灵活性,可以直接的组织自己需要的串口模式。而使用MSComm Active控件则更为方便简洁。

通信的方法主要有两种:事件驱动的方法和查询法。

串口控件的主要属性、事件及方法:

CommPort:表示通信的端口名。

Setting :设置波特率、校验位、数据位、停止位。

PortOpen:用于打开和关闭串口。

OutBufferSize:设置并返回缓冲区的大小。

InBufferSize:设置并返回接收缓冲区的大小。

Rthreshold:设置并返回接收时产生OnComm事件数。

CommEvent:只要由通信错误或事件发生时都会产生Oncomm事件。

2.3下位机设计介绍

下位机是用单片机实现的PID水位调节器。下位机的主要职责是接收上位机下传的命令设置相应的PID参数,并且实时将水位信息反馈给上位机,以实现水位信息的记录。下位机除了完成PID,水位数据的传输与处理,同时还应该具有对PID参数的设置功能。

在下位机以单片机为核心的系统里,本设计所要实现的数据传输功能同时也利用了MAX232芯片。单片自身的RX与TX引脚直接与MX232相连,再通过线缆与上位机连接。单片机的串口是以全双工异步通信模式通信的。

2.3.1单片机的通信方式

所谓的串行通信方式主要有两种:即异步通信和同步通信。

异步通信是起止式传输,它是利用起止方法来保持收发双方同步的。

a)每次只能传输一个编码字符,可以连续发送多个字符,可以随即进行单独发送。

b)起始位表示字符传输的开始,长度为1bit;停止位表示字符传输的结束,长度1bit,1.5bit,2bit。

c)发送端数据格式如图2.3所示:

其中空闲位可有可无。有空闲位时,若空闲位为“1”,线路处于等待状态。存在空闲位正是异步通信的特征之一。

图2.3发送端数据格式数据格式

在帧格式中,一个字符由4个部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位“0”,然后是5~8位的数据(规定低位在前,高位在后),接下来的奇偶校验位(可省略),最后是停止位“1”。起始位“0”信号只占用一位,用来通知接收设备一个待接收的字符开始到来,线路上在不传送字符时应保持为“1”。接收端不断检测线路的状态,若连续为“1”以后又侧到一个“0”,就知道发来一个新字符,应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。

起始位后面紧接着就是数据位,它可以是5~8位。奇偶校验只占一位,但在字符中也可以规定不同奇偶校验位,则这时这一位就可省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址、数据等)。

停止位用来表征字符的技术,它一定是高电位(逻辑“1”)。停止位可以是1位,1.5位或2位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一个字符做好准备——只要再收到“0”就是新的字符的起始位。若停止位以后不是紧接着传送下一个字符,则让线路上保持为“1”。

d)接收端:通过检测起始位和停止位来判断新近到达的字符,保持收发双方每传输一个字符就重新校验一次同步关系,不易造成时钟误差。

e)应用:低速传输系统,因为其传输效率较低,如传输一个ASCⅡ码,数据代码7位,1位起止位,2位停止位,1位校验位,其效率7/(7+1+1+2)≈64%且字符之间还可能有空隙。

异步传输是字符内的同步,字符间的异步。

图2.4 ASCII 码模式

同步传输不是以字符而是以数据块为传输单位,其传输速率较高。同步通信中,在数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。

a)每次传输多个字符(数据块)且它们之间没间隙以及起始位,停止位。 b)保持收发同步,在数据块之前加上前文,在数据之后加上后文——帧(frame )。 c)接收端:检测帧中的前文和后文(特定的标志序列)保持与发送端同步。 d)数据格式:前文和后文的具体格式视传输控制规程而定,有面向字符与面向比特型两种方案。

e)同步传输每次传送的是一个完整的数据帧,发送端无需在字符间加入附加位和间隙,因而同步传输的效率比异步传输的效率高。但由于收发双方需建立准确的同步关系,所以实现起来比较复杂。 2.4上下位机通信协议

通过RS —232,modbus 协议将上下位机连接起来。Modbus 协议介绍: Modbus 是由Modicon (现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。

当在Modbus 网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus 协议发出。在其它网络上,包含了Modbus 协议的消息

下位机

任意间隔

任意间隔

任意间隔

转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

Modbus特点:

(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus 的产品超过600种。

(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。

(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。Modbus传输模式:

Modbus中一般使用两种传输模式:RTU模式和ASCII模式。

当采用ASCII模式通信时,在消息中的每个字节都作为2个ASCII字符传送。这种格式的优点是字符发送的时间间隔可达到1s而不产生错误,缺点是通信速率较慢。

当采用RTU模式时,消息发送至少以3.5个字符时间的停顿间隔开始,其优点是数据用二进制表示,通信速度较快。两种通信模式格式如图2.5所示:

图2.5 ASCII模式和RTU模式

第3章硬件设计

3.1 单片机的选择

本设计采用的是AT89C52单片机,AT89C52是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。它是一种高效微控制器,因为它更经济实惠,用起来灵活方便,而且习惯了用这种型号的单片机,所以选择AT89C52单片机。

3.2 电平转换器MAX232

本设计采用MAX232芯片进行电平转换,MAX232芯片是美信公司专门为电脑的RS232标准串口设计的接口电路,使用+5V单电源供电,它的作用就是完成TTL 电平与RS232电平的转换。PC机的串行口采用的是标准的RS 232接口,单片机的串行口电平是FTL电平,而TTL电平特性与RS 232的电气特性不匹配,因此为了使单片机的串行口能与RS 232接口通信,必须将串行口的输入/输出电平进行转换。通常用MAX232芯片来完成电平转换。

3.3 74LS164LED驱动芯片

74LS164是常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。当80C52单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS164等总线驱动器。当片选端CE低电平有效时,DIR=“0”,信号由B向A传输;DIR=“1”,信号由A向B传输;当CE为高电平时,A、B均为高阻态。其原理图如图3.1所示。

图3.1 74ls164原理图

3.4 LED显示器

3.4.1 LED显示器工作原理

LED显示是用发光二极管显示字段的显示器件,也称数码管,其外形结构如图3.1所示,由图可知它由8个发光二极管构成,通过不同的组合可用来显示0-9、A-F及小数点。

图3.2 数码管原理图

LED显示器一般分为共阴极和共阳极两种,共阴极是将8个发光二极管的阴极连接在一起作为公共端,而共阳极则是将8个发光二极管的阳极连在一起作为公共端[8],其构成如图3.2所示。

3.4.2 LED显示器接口

在单片机系统中,LED显示接口一般采用静态驱动和动态扫描两种驱动方式。静态驱动方式工作原理是每一个LED显示器有一个I/O端口驱动,亮度大,占用I/O端口多,显示位数多时很少采用;动态扫描驱动方式的工作原理是将多个显示器的段码同名端连接在一起,位码分别控制,利用眼睛的余晖暂留效应,分别显示。动态扫描驱动方式下,只要保证一定的显示频率,看起来的效果和一直显示是一样的。

第4章软件设计

软件设计主要分为两大部分:上位机部分和下位机部分。上位使用面向对象的C++语言写成,下位机用面向过程的C语言写成。

4.1上位机编程方案选择

本设计采用VC来实现编程,上位机与单片机进行通信的程序编写可用VB、VC等软件。由于VB作为面向对象的编程工具不够完全,效率比VC低,提供的命令语言环境较弱,通过串口设备一次最多只能交换16B的数据,对较大数据量的传输存在很大的局限性,很难实现较为复杂的数据处理,VC是一种功能强大的面向对象的Windows编程开发平台。VS2008的优点是界面简洁,占用资源少,操作方便。所以本设计采用VC作为串口编程工具。

4.1.1上位机软件流程图

上位机软件流程图如图4.1所示

图4.1 上位机控制流程图

4.1.2上位机程序设计

上位机程序界面图示:

图4.2 上位机控制程序界面图

串口参数设定菜单实现程序:

图4.3 串口参数设定菜单

串口参数设置代码实现:

由于要设置的串口参数较多,所以设计为在弹出的对话框中完成对串口参数的设置:

图4.4 串口参数设置对话框

当在串口参数设置菜单选项鼠标左击后,程序将发出一条处理命令的消息。添加相应的事件处理程序可以用事件处理程序向导。调用事件处理程序向导如图4.5所示。

图4.5 用事件处理向导添加事件处理程序

将事件处理向导程序添加的消息响应函数添加在CUpperComView这个类中,当鼠标左击后发出系统命令,这样便在CUpperComView这个类中调用OnSetCommDlg这个成员函数。

OnSetCommDlg成员函数的实现代码如下:

void CUpperComView::OnSetCommDlg()

{

// TODO: 在此添加命令处理程序代码

//m_ComName = ComSetDlg.m_ComName;

if( IDOK == ComSetDlg.DoModal() )

{

m_ComName = ComSetDlg.m_ComName+1;

if( 0 == ComSetDlg.m_ParityBit)

{

m_ParityBit="E";

}

else

{

if( 1 == ComSetDlg.m_ParityBit)

{

m_ParityBit="O";

}

else

{

m_ParityBit="N";

}

}

if( 0 == ComSetDlg.m_BaudRate)

{

m_BaudRate="4800";

}

else

{

if( 1 == ComSetDlg.m_BaudRate)

{

m_BaudRate="9600";

}

else

{

m_BaudRate="19200";

}

}

if( 0 == ComSetDlg.m_StopBit)

{

m_StopBit="1";

}

else

{

m_StopBit="2";

}

if( 0 == ComSetDlg.m_DataBit)

{

m_DataBit="7";

}

else

{

m_DataBit="8";

}

}

m_ComVal = m_BaudRate +","+m_ParityBit +"," + m_DataBit + "," + m_StopBit;

}

同样打开和关闭串口的源程序如下所示:

串口打开程序实现函数:

void CUpperComView::OnMenuOpenCom()

{

// TODO: 在此添加命令处理程序代码

if(m_cCom.get_PortOpen()) //如果发现串口本来是打开的,则关闭串口m_cCom.put_PortOpen(FALSE);

m_cCom.put_CommPort(m_ComName); //选择COM3端口

m_cCom.put_InputMode(1); //输入方式为二进制方式

m_cCom.put_InBufferSize(1024); //设置输入缓冲区

m_cCom.put_OutBufferSize(512); //设置输出缓冲区

m_cCom.put_Settings(m_ComVal);//波特率,无校验,数据位,停止位

if(!m_cCom.get_PortOpen())

{

m_cCom.put_PortOpen(TRUE); //打开串口

m_cCom.put_RThreshold(1); //每当接收缓冲区有个字符则接收串口数据

m_cCom.put_InputLen(0); //设置当前缓冲区长度为

m_cCom.get_Input(); //预读缓冲区以清除残留数据

AfxMessageBox(_T("串口打开成功!"));

}

else

AfxMessageBox(_T("打开端口失败!"),MB_ICONSTOP,0);

}

串口关闭程序实现函数:

void CUpperComView::OnCloseCom()

{

// TODO: 在此添加命令处理程序代码

if(m_cCom.get_PortOpen()) //如果发现串口本来是打开的,则关闭串口m_cCom.put_PortOpen(FALSE);

}

PID参数设置:

上位机的PID参数设置是在客户区内的视图完成的,主要由3个文本框和一个确定按钮实现的。当在PID参数设置框内输入响应的参数后,点击确定按钮,便可以将PID参数下传这下位机。PID参数调节区如图4.6所示:

组态王与单片机多机串口通信的设计方案

组态王与单片机多机串口通信的设计 1 引言 随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。现在组态软件繁多,比如KingVieW(组态王>、MCGS、W inCC等。KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成本。而单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。 2 组态王与单片机的串口通讯方法 目前,组态王与单片机的通信多是通过动态数据交换(DDE>或通过自己开发通讯驱动程序完成。DDE是Windows平台上的一个完整的通信协议,组态王通过该协议与其他应用程序交换数据。但不可靠和非实时。而自己开发通讯驱动程序会带来设计困难,增加系统开发周期,可行性不高。组态王专门提供一种与单片机多机串口通信方法,可满足大多数系统需求。 3 PC机与单片机的硬件接口电路 图1为上位PC机与下位单片机80C51的连接电路。PC机与单片机本身都自带串行通讯接口,但由于在分布式系统中PC机与各单片机的分布不集中,不能利用RS-232通讯传输,只能改用RS-485。RS-485采用差分式传输信号,最大传输距离为1 219 m.最大传输速率为10 Mb/s.对同时出现的两条信号线A、B的干扰有较强的抑制能力。当两条线绞在一起时,被通信各种分布参数耦合过来的干扰信号可平均地分配到这两条线上,因此对RS-485的差分式传输线路而言,用双绞线可获得较强的抗干扰能力。RS-485采用二线与四线平衡传输方式,二线制可实现真正的多点双向通信,但需要在传输线上接电阻(约120 Ω>。

基于单片机的数据串口通信研究

龙源期刊网 https://www.360docs.net/doc/c09920702.html, 基于单片机的数据串口通信研究 作者:蒋信 来源:《电子技术与软件工程》2016年第06期 摘要科技的发展日新月异,机电一体化的发展对自动化系统的可靠性提出了更高的要 求,在这样的背景下,单片机在工业控制领域的应用越来越广泛也越来越重要。基于以上,本文从通信过程、显示设计、键盘接口等方面研究了基于单片机的数据串口通信。 【关键词】单片机数据串口通信研究 在计算机控制领域中,计算机与外设数据之间的通信主要依靠单片机来实现,单片机的串口功能能够实现数据的传输以及分析,这就属于串口通信,可以预见的是,单片机的数据串口通信将会得到更广泛的应用,单片机之间的通信也有赖于其数据串口通信功能。基于以上,本文简要研究了基于单片机的数据串口通信。 1 串口通信的实现方式 设备在实现通信的过程中,必须树立一个信息接发双方都认可的通信方式,只有这样才能够保证信息在传送的过程中不发生冲突,才能够实现设备之间的通信,对于串口通信来说,主要有以下两种方式。 1.1 异步通信方式 异步通信方式实现的过程中,数据传输方式为独立字节的形式,不同的字节前端有着不同的起始信号,不同字节的后端则会有不同的终止信号,起始信号只能是一个,而终止信号可以是一个也可以是多个。数据传输过程中,字节进行移动,一个字节的迁移过程表示一个字节的传输过程,传输之前使用起始信号进行传输,传输结束之后使用终止信号将传输线调回标准状态,一个字节传输完毕后进行下一个字节的传输,字节传输有着连续性,这就是异步传输方式。由于没一个字节都要附加起始信号信息和终止信号信息,因此异步传输方式的效率较低,但异步通信方式容许一定程度的频率漂移,有着一定的误差缓冲作用。 1.2 同步通信方式 同步通信方式指的是将所有字符和字节连接在一起进行传输的一种通信方式,多个字符相互连接组成数据块,在数据块前增加同步字符,以同步字符作为传输起始信号,在传输后增加校验字符,以校验字符作为传输终止信号,以此来校验传输过程中的错误和误差,数据块中的各个字符之间没有间隔,相较于异步通信方式来说,其传输效率较高,但其对于信息接收端和信息发送端的同步性要求较高,因此硬件的复杂程度也就更高。 2 基于单片机的数据串口通信

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

基于51单片机的串口通讯系统课程设计论文

引言 人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。单片机的出现使人类实现利用编程来代替复杂的硬件搭建电路,它靠程序运行,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性! 单片机应用的主要领域非常广,智能化家用电器、办公自动化设备商业营销设备、工业自动化控制、智能化仪表、智能化通信产品、汽车电子产品、航空航天系统和国防军事、尖端武器等领域。 单片机应用的意义不仅在于它的广阔围及所带来的经济效益,更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。以前自动控制中的PID调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。随着单片机应用的推广,微控制技术将不断发展完善。 电路的集成化不仅对硬件电路的设计相关,与电路的布局同样相关。印刷版的出现使得电路产品更加规,体积更小。Protel99se是一款专业的绘制电路及印刷版的软件,近年来的不断升级使得其功能更加完善,出现了Altium Designer 、Protel DXP等升级版本。

基于单片机的串口通信模块设计

1 绪论 1.1 研究背景 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度快,串行通信的距离可以从几米到几千米。 随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行监测和控制。PC机具有强大的监控和管理能力,而单片机则具有快速及灵和的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着 RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步地为USB 接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC 机联络的单片机设备的使用围。当前USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用围也将越来越广。本文所介

单片机串口通信的发送与接收(可编辑修改word版)

51 单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。无 论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用“中断方式”,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数, 收到了新数据。 发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来 等待发送完毕。 这时,处理不好的话,就可能带来问题。 看了一些网友编写的程序,发现有如下几条容易出错: 1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。 这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。 这种处理方法,就会遗漏收到的数据。 2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。 但是,却在中断函数中,将TI 清零! 这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。 3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收 中断的程序。 对此,做而论道发表自己常用的方法: 接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。 发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。 这样一来,收、发两者基本一致,编写程序也很规范、易懂。 更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。 实例: 求一个PC 与单片机串口通信的程序,要求如下: 1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。

基于51单片机的双机串行通信

河南机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级:xxxxxx 学号:13xxxxxxxxx 姓名:xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规范; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计

1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: 图1.AT89C51(52) (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,

第06章单片机串行通信系统习题解答

第6章单片机串行通信系统习题解答 一、填空题 1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。 2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。 3.SCON中的REN=1表示允许接收。 4.PCON 中的SMOD=1表示波特率翻倍。 5.SCON中的TI=1表示串行口发送中断请求。 6.MCS-51单片机串行通信时,先发送低位,后发送高位。 7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。 8.设T1工作于定时方式2,作波特率发生器,时钟频率为,SMOD=0,波特率为时,T1的初值为 FAH 。 9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。 10.MCS-51单片机串行方式0通信时,数据从引脚发送/接收。 二、简答题 1.串行口设有几个控制寄存器它们的作用是什么 答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。其中PCON中只有的SMOD与串行口的波特率有关。在SCON中各位的作用见下表: 2.MCS-51单片机串行口有几种工作方式各自的特点是什么 答:有4种工作方式。各自的特点为:

3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值 答:串行口各种工作方式的波特率设置: 工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。 工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。 当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32 当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64 计算定时器的初值计算: 4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少并进行初始化编程。 答:根据公式 N=256-2SMOD ×fosc /(2400×32×12)= ≈243 =F3H TXDA: MOV TMOD,#20H ;置T1定时器工作方式2 MOV TL1,#0F3H ;置T1计数初值. MOV TH1,#0F3H B f B f N OSC SMOD OSC SMOD ??-=???-=384225612322256

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.360docs.net/doc/c09920702.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

单片机与PC机串口通讯设计

第一章串口通讯的系统组成与原理 1.1 系统组成及通讯原理 1.1.1 系统构成 一、MSP430F149功能简介: 本设计选用的主要芯片为MSP430F149,该单片机属于德州仪器公司MSP430F14X/16X FLASH 系列。该系列是一组工业级超低功耗的微控制器,运行环境温度为-40~+85 摄氏度工作电压范围 1.8~3.6V,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。由于具有16位RISC(精简指令集)结构,16位寄存器和常数寄存器,MSP430 达到了最大的代码效率。数字控制的振荡器提供快速从所有低功耗模式苏醒到活动模式的能力时间少于6ms。MSP430F149有较高的处理速度,在8MHz 晶体驱动下指令周期为125 ns。另外它带有两个16 位定时器(带看门狗功能)、速度极快的8 通道12 位A/D 转换器(ADC)(带内部参考电压、采样保持和自动扫描功能)、一个内部比较器和两个通用同步/异步发射接收器、48个I/O口(均可独立控制)的微处理器结构。硬件乘法器提高了单片机的性能并使单片机在编码和硬件上可兼容[3]。这些特点保证了可编制出高效率的源程序。 二、系统构成 1、系统框图 系统构成如图1-1所示,由上位机(即工业控制计算机)、通讯接口和下位机3部分组成。上位机选用的是工控机,智能终端由单片机MSP430F149和外围传感器放大电路等构成(本设计部涉及该部分的设计)。单片机与PC 机之间通信方式为串行异步方式(UART),下位机采用中断方式进行与上位机的数据交换,上位机采用按时查询方式对各串口进行读写操作。单片机MSP430要想与PC 串口连接或者其它带有串口的终端设备连接,接口电路部分必须要进行EIA-RS-232-C 与MSP430 电平和逻辑关系的转换[4]。本设计将采用MAX3221芯片,完成3V~5V 电平与串口电平的双向转换。

51单片机实现的485通讯程序

51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include #include #define unsigned char uchar #define unsigned int uint /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效

void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 dev = (P1>>2); TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0

基于51单片机的双机串行通信课程设计 1000110061

基于AT89C51单片机的双机串行通信设计 姓名:杨应伟 学号:100110061 专业:机械设计制造及其制动化 班级:机电二班

前言 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求,因而必须采用多机控制的形式,而多机控制主要通过多个单片机之间的串行通信实现。串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。 在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。 在通信过程中,使用通信协议进行通信。在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。 串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。

单片机与PC机串口通信实现正文

毕业设计(论文)课题:单片机与PC机串口通信实现 学生: 孙波系部: 通信工程 班级: 通信1301 学号: 2013120325 指导教师: 童华 装订交卷日期: 2016年x月x日 装订顺序: (1)封面(2)毕业设计(论文)成绩评定记录(3)标题、中文摘要及关键词(4)正文(5)附录(6)参考文献

毕业设计(论文)成绩评定记录表 注:1.此表适用于不参加毕业答辩学生的毕业设计(论文)成绩评定; 2.平时成绩占40%、卷面评阅成绩占60%,在上面的评分表中,可分别按40分、60分来量化评分,二项相加所得总分即为总评成绩,总评成绩请转换为优秀、良好、中等、及格、不及格五等级计分。 教务处制

重庆电子工程职业学院 毕业设计(论文)开题报告 系别通信工程专业通信技术班级通信1301 学生姓名孙波学号2013120325 指导教师童华 一、毕业设计的内容和意义: 目前,随着计算机和微电子技术的高速发展,单片机在国民经济的各个领域的智能化控制中得到了非常广泛的应用。单片机已成为信息处理、物联网络、通信设备、工业控制、家用电器等各个领域不可缺少的智能部件。在一些工业控制中,经常需要以单片机作为下位机执行对被控对象的直接控制,以PC机为上位机完成复杂的数据处理,组成主从式控制系统。 为了提高系统管理的先进性,计算机工业自动控制和监测系统越来越多的采用主从式系统。较为常见的形式是由一台做管理用的上位机计算机(主机)和一台直接参与控制检测的下位机单片机(从机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是向从机发送各种命令及参数;二是要及时收集、整理和分析从机发回的数据,供进一步的决策。从机被动的接收、执行主机发

基于51单片机串行通信的无线发射极和接收机设计

基于51单片机串行通信的无线发射极和接收机设计---- 1 概述 1.1 课题的目的、背景和意义 最近几年来,由于无线接入技术需求日益增大,以及数据交换业务(如因特 网、电子邮件、数据文件传输等)不断增加,无线通信和无线网络均呈现出指数增 加的趋势。有力的推动力无线通信向高速通信方向发展。然而,工业、农业、车载 电子系统、家用网络、医疗传感器和伺服执行机构等无线通信还未涉足或者刚刚涉 足的领域,这些领域对数据吞吐量的要求很低,功率消耗也比现有标准提供的功率 消耗低。此外,为了促使简单方便的,可以随意使用的无线装置大量涌现,需要在 未来个人活动空间内布置大量的无线接入点,因而低廉的价格将起到关键作用。为 降低元件的价格,以便这些装置批量生产,所以发展了一个关于这种网络的标准方案。Zigbee就是在这一标准下一种新兴的短距离、低功耗、低数据传输的无线网 络技术,它是一种介于无线标记技术和蓝牙之间的技术方案。 对于这种短距离、低功耗、低数据传输无线技术,它不仅在工业、农业、军 事、环境、医疗等传统领域有着巨大的应用价值,未来应用中还可以涉及人类日常 生活和社会生产活动的所有领域。由于各方面的制约,这种技术的大规模商业应用 还有待时日,但已经显示出了非凡的应用价值,相信随着相关技术的发展和推进, 一定会得到更广泛应用。 1.2国内外无线技术相关现状及Zigbee现状 无线通信从固定方式发展为移动方式,移动通信发展至今大约经历了五个阶段: 第一阶段为20年代初至50年代初,主要用于舰船及军有,采用短波频及电子 管技术,至该阶段末期出现才出现150MHVHF单工汽车公用移动电话系统MTS。

基于单片机C#串口通信

基于C#与单片机串口通信的投票器 李浩东20093101004 周守悦20093101012 一.作品的设计概述 我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。 本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间。本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。 二.作品的设计与分析 1.主要功能与分析 主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,B,C,D四个人投票的,这四个按键每按下一次就自动增1,记录这四个按键按下的总次数num1,num2,num3,num4,并把四个数按顺序不断循环通过串口发给PC机,PC 机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在picturebox控件上面的柱形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。最后一个按键的作用是继续投票,如需继续投票,可按此键。其系统设计图如下: 2.串口通信规则 单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: (1)数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,

两个单片机之间的串行通信

两个单片机之间的串行通信 一、设计要求 在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。 二、实验所需元器件 三、电路原理图: 两个单片机之间的串行通信电路图

四、程序设计 这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:

五、C语言程序: U1的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char void send(uchar state) { SBUF=state; while(TI==0); TI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0; TR1=1; ES=1; } void main() { P1=0xff; SCON_init(); while(1) { send(P1); } } U2的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0) state=SBUF; RI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; } void main() { SCON_init(); while(1) { receive(); P1=state; } } 六、调试与仿真:

51单片机与串口通信代码

51单片机与串口通信代码 2011年04月22日 17:18 本站整理作者:佚名用户评论(0) 关键字:串口通信(35) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude #i nclude #i nclude #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式 TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break;

51单片机与上位机串口通信程序设计

51单片机与上位机串口通信程序设计 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include< reg51.h> #include< stdio.h> #include< string.h> #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收 PCON=0x00; ES=1;

TMOD=0x21; //定时器工作于方式2,自动装载方式TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; } }

51单片机串口通信讲解

51系列单片机串口通信实例教程 单片机的串口通信看起来是很复杂的,主要是因为他用到了更多的寄存器,与前面的知识相比他更具综合能力,写起来考虑的问题自然也变多了.而前面学习过的定时器与中断将是单片机通信的基础. 单片机的中断系统中第4个中断就是串口中断,要进行串口通信首先就要打开CPU总中断EA,还要打开串口通信中断ES,这是串口通信的前堤,而串口通信也跟计时器一样有很多的模式,因此我们还要设置SCON寄存器来指定采用哪一种方式进行通信,而在通信的过程中,我们还要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了.我在实验过程中用到的是1号定时器来设定的波特率,用到了计时器方式2,也就是8位自动重装,这样可以简化编程,她的实现思想就是将常数放入TH,而TL中则是初始化参数,当溢出时,单片机会自动将TH中的常数装入TL中. 再来说说波特率,我们为什么要设定波特率,因为单片机会以16倍波特率的速度进行采样,而在实验中我们用的是10位异步收发方式,因此要将SM0置0,SM1置1.而其中的10位

有8位数据位,第一位和最后一位是发送数据的起始与结束.采用高的皮特率就不会出错啦.而波特率是有一个公式的: 方式0的波特率 = fosc/12 方式2的波特率 =(2SMOD/64)· fosc 方式1的波特率 =(2SMOD/32)·(T1溢出率) 方式3的波特率 =(2SMOD/32)·(T1溢出率) T1 溢出率= fosc /{12×[256 -(TH1)]} 根据公式我们很容易就算出当晶振为110592HZ时,要达到9600的波特率,我们只需要将TL1置FDH即可,如下图: 除此之外,你还要将SCON中的REN位置1,不然的话,单片机是不会接收数据的. 还有不要忘了选择定时器的工作方式,设置TMOD为0x20既是工作方式2,8位自动重装定时器. 这样一来,初始批工作算是差不多了.而串口通信分为中断方式,和查询方式,如果你想用查询方式你也不用设置IE寄存器了. 在串口通信中,还有一个很重要的寄存器SBUF,其实也不是一个,是两个,只是它们共用同一个地址,再热气表达式的不同,单片机会自动选择使用哪一个SBUF. 下面是我写的一个例子程序,产生的效果是:向单片机发送任一个0~255之间的数,将会被显示到数码管上.并且单片机还会自动把刚才传过去的数又发送回来 ,实验过程中用到了几个工具如下:

基于51单片机的双机串行通信课程设计报告书

基于51单片机的双机串行通信课程设计 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B 机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能

图1.AT89C51(52) 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。 (2)串行控制寄存器(PCON) SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI SM0,SM1:串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。串行接口工作方式特点见下表 SM0 SM1 工作方式功能波特率

相关文档
最新文档