项目5 基于c51单片机的“串行通信”模块
- 格式:doc
- 大小:726.00 KB
- 文档页数:20
51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。
本文将介绍使用C语言编写51单片机的串口通信程序。
1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。
首先,我们需要一块51单片机开发板,内置了串口通信功能。
另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。
2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。
在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。
同时,我们还需要引入头文件来定义串口通信的相关寄存器。
3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。
这些参数的配置需要根据实际需要进行调整。
在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。
4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。
初始化串口的过程包括打开串口、设置中断等。
5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。
阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。
6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。
在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。
7. 中断处理在串口通信中,中断是一种常见的处理方式。
通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。
8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。
```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。
51单片机串口通信(相关例程) 51单片机串口通信(相关例程)一、简介51单片机是一种常用的微控制器,它具有体积小、功耗低、易于编程等特点,被广泛应用于各种电子设备和嵌入式系统中。
串口通信是51单片机的常见应用之一,通过串口通信,可以使单片机与其他外部设备进行数据交互和通信。
本文将介绍51单片机串口通信的相关例程,并提供一些实用的编程代码。
二、串口通信基础知识1. 串口通信原理串口通信是通过串行数据传输的方式,在数据传输过程中,将信息分为一个个字节进行传输。
在51单片机中,常用的串口通信标准包括RS232、RS485等。
其中,RS232是一种常用的串口标准,具有常见的DB-9或DB-25连接器。
2. 串口通信参数在进行串口通信时,需要设置一些参数,如波特率、数据位、停止位和校验位等。
波特率表示在单位时间内传输的比特数,常见的波特率有9600、115200等。
数据位表示每个数据字节中的位数,一般为8位。
停止位表示停止数据传输的时间,常用的停止位有1位和2位。
校验位用于数据传输的错误检测和纠正。
三、串口通信例程介绍下面是几个常见的51单片机串口通信的例程,提供给读者参考和学习:1. 串口发送数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendChar(unsigned char dat){SBUF = dat; // 发送数据while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志}void main(){UART_Init(); // 初始化串口while (1){UART_SendChar('A'); // 发送字母A}}```2. 串口接收数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_Recv(){unsigned char dat;if (RI) // 检测是否接收到数据{dat = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志// 处理接收到的数据}}void main(){UART_Init(); // 初始化串口EA = 1; // 允许中断ES = 1; // 允许串口中断while (1)// 主循环处理其他任务}}```3. 串口发送字符串```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendString(unsigned char *str){while (*str != '\0')SBUF = *str; // 逐个发送字符while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志str++; // 指针指向下一个字符}}void main(){UART_Init(); // 初始化串口while (1){UART_SendString("Hello, World!"); // 发送字符串}}```四、总结本文介绍了51单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。
基于51单片机串行通信的无线发射极和接收机设计---- 1 概述1.1 课题的目的、背景和意义最近几年来,由于无线接入技术需求日益增大,以及数据交换业务(如因特网、电子邮件、数据文件传输等)不断增加,无线通信和无线网络均呈现出指数增加的趋势。
有力的推动力无线通信向高速通信方向发展。
然而,工业、农业、车载电子系统、家用网络、医疗传感器和伺服执行机构等无线通信还未涉足或者刚刚涉足的领域,这些领域对数据吞吐量的要求很低,功率消耗也比现有标准提供的功率消耗低。
此外,为了促使简单方便的,可以随意使用的无线装置大量涌现,需要在未来个人活动空间内布置大量的无线接入点,因而低廉的价格将起到关键作用。
为降低元件的价格,以便这些装置批量生产,所以发展了一个关于这种网络的标准方案。
Zigbee就是在这一标准下一种新兴的短距离、低功耗、低数据传输的无线网络技术,它是一种介于无线标记技术和蓝牙之间的技术方案。
对于这种短距离、低功耗、低数据传输无线技术,它不仅在工业、农业、军事、环境、医疗等传统领域有着巨大的应用价值,未来应用中还可以涉及人类日常生活和社会生产活动的所有领域。
由于各方面的制约,这种技术的大规模商业应用还有待时日,但已经显示出了非凡的应用价值,相信随着相关技术的发展和推进,一定会得到更广泛应用。
1.2国内外无线技术相关现状及Zigbee现状无线通信从固定方式发展为移动方式,移动通信发展至今大约经历了五个阶段: 第一阶段为20年代初至50年代初,主要用于舰船及军有,采用短波频及电子管技术,至该阶段末期出现才出现150MHVHF单工汽车公用移动电话系统MTS。
第二阶段为50年代到60年代,此时频段扩展至UHF450MHZ器件技术已向半导体过渡,大多为移动环境的专用系统,并解决了移动电话与公用电话的接续问题。
第三阶段为70年代初至80年代初频段扩展至800MHZ,美国Bell研究所提出蜂窝系统概念并于70年代末进行了AMPS试验。
基于51单片机的多机通信系统设计多机通信系统是指通过一台主机与多台从机之间进行数据交互和通信的系统。
在本设计中,我们将使用51单片机实现一个基于串行通信的多机通信系统。
系统硬件设计如下:1.主机:使用一个51单片机作为主机,负责发送数据和接收数据。
2.从机:使用多个51单片机作为从机,每个从机负责接收数据和发送数据给主机。
3.串口:主机和从机之间通过串口进行通信。
我们可以使用RS232标准通信协议。
系统软件设计如下:1.主机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
c.接收数据:接收从机发送的数据,并存储在接收缓冲区中。
2.从机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.接收数据:接收主机发送的数据,并存储在接收缓冲区中。
c.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
系统工作流程如下:1.主机启动,执行初始化操作,包括初始化串口。
2.从机启动,执行初始化操作,包括初始化串口。
3.主机发送数据给从机:主机将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
4.从机接收并处理数据:从机接收主机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
5.从机发送数据给主机:从机将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
6.主机接收并处理数据:主机接收从机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
7.主机和从机循环执行步骤3-6,实现多机之间的数据交互和通信。
多机通信系统的设计考虑到以下几个方面:1.硬件设计:需要合理选择单片机和串口的类型和参数,确保系统的稳定性和可靠性。
2.软件设计:需要设计适应系统需求的通信协议和数据处理提取方法,保证数据的准确性和完整性。
3.通信协议:需要定义主机和从机之间的通信协议,包括数据的格式、传输方式等,以便实现正确的数据交互。
引言人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。
单片机的出现使人类实现利用编程来代替复杂的硬件搭建电路,它靠程序运行,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!单片机应用的主要领域非常广,智能化家用电器、办公自动化设备商业营销设备、工业自动化控制、智能化仪表、智能化通信产品、汽车电子产品、航空航天系统和国防军事、尖端武器等领域。
单片机应用的意义不仅在于它的广阔范围及所带来的经济效益,更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。
以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。
以前自动控制中的PID 调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。
这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。
随着单片机应用的推广,微控制技术将不断发展完善。
电路的集成化不仅对硬件电路的设计相关,与电路的布局同样相关。
印刷版的出现使得电路产品更加规范,体积更小。
Protel99se是一款专业的绘制电路及印刷版的软件,近年来的不断升级使得其功能更加完善,出现了Altium Designer 、Protel DXP等升级版本。
1 设计内容及要求1.1功能要求(1)下位机选用89S51或89S52单片机;(2)下位机接收上位机的数据并显示在LED或LCD上;(3)下位机显示数据可以显示固定数据、位移数据、循环位移;1.2硬件要求制作串口线和下位机及外围电路;1.3软件要求Keil C或汇编编程设计,串口调试助手或Labview串口通信编程。
51单⽚机--串⼝通信基本介绍串⼝是⼀种应⽤⼗分⼴泛的通讯接⼝,串⼝成本低、容易使⽤、通信线路简单,可实现两个设备的互相通信。
单⽚机的串⼝可以使单⽚机与单⽚机、单⽚机与电脑、单⽚机与各式各样的模块互相通信,极⼤的扩展了单⽚机的应⽤范围,增强了单⽚机系统的硬件实⼒。
51单⽚机内部⾃带UART(Universal Asynchronous Receiver Transmitter,通⽤异步收发器),可实现单⽚机的串⼝通信。
基本接线简单双向串⼝通信有两根通信线(发送端TXD和接收端RXD)TXD与RXD要交叉连接当只需单向的数据传输时,可以直接⼀根通信线当电平标准不⼀致时,需要加电平转换芯⽚电平标准电平标准是数据1和数据0的表达⽅式,是传输线缆中⼈为规定的电压与数据的对应关系,串⼝常⽤的电平标准有如下三种:TTL电平:+5V表⽰1,0V表⽰0RS232电平:-3-15V表⽰1,+3+15V表⽰0RS485电平:两线压差+2+6V表⽰1,-2-6V表⽰0(差分信号)常见通信接⼝⽐较名称引脚定义通信⽅式特点UART TXD、RXD全双⼯、异步点对点通信I²C SCL、SDA半双⼯、同步可挂载多个设备SPI SCLK、MOSI、MISO、CS全双⼯、同步可挂载多个设备1-Wire DQ半双⼯、异步可挂载多个设备51单⽚机的UARTSTC89C52有1个UARTSTC89C52的UART有四种⼯作模式:模式0:同步移位寄存器模式1:8位UART,波特率可变(常⽤)模式2:9位UART,波特率固定模式3:9位UART,波特率可变串⼝模式图SBUF:串⼝数据缓存寄存器,物理上是两个独⽴的寄存器,但占⽤相同的地址。
写操作时,写⼊的是发送寄存器,读操作时,读出的是接收寄存器串⼝和中断系统串⼝相关寄存器SCON配置SCON:串⾏控制寄存器,可位寻址,⽤于选择串⾏通信的⼯作⽅式和某些控制功能。
SM0,SM1按下列组合确定串⾏⼝的⼯作⽅式:我们⼀般选择⽅式1,所以SM0=0,SM1=1.REN:1则启动串⾏接收器RXD,开始接收信息,0为禁⽌接收,我们先设置为1。
基于MCS-51单片机的串行通信
徐小涛
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2010(000)015
【摘要】根据单片机的串行通信原理,深入分析了单片机串口通信模式、波特率的设置、单片机和单片机之间以及单片机与PC机之间的通信协议,并以MCS-51单片机为基础,针对串行通信的实施,提出了相应的实现方法,对于MCS-51单片机的扩展运用具有重要的实践意义.
【总页数】3页(P60-62)
【作者】徐小涛
【作者单位】
【正文语种】中文
【相关文献】
1.基于Protues仿真的MCS-51单片机教学实践与探讨--利用仿真软件解决MCS-51单片机教学中常见的问题 [J], 侯俊才;杨蜀秦
2.基于的PC机和MCS-51单片机之间的串行通信 [J], 何文才;杜鹏;刘培鹤;牛晓蕾;张媛媛
3.基于MCS-51单片机技术实训台中的按键控制双机串行通信实训模块设计研究与实现 [J], 张玉馥
4.基于Visual Basic6.0下PC机与MCS-51单片机的串行通信 [J], 袁月峰;张树森;姚继权
5.基于DELPHI实现PC机与MCS-51单片机的串行通信 [J], 阚保强;王建业
因版权原因,仅展示原文概要,查看原文内容请购买。
51单片机串行通信原理以51单片机串行通信原理为标题,本文将详细介绍51单片机串行通信的原理及其应用。
一、引言在现代电子设备中,串行通信是一种常见的通信方式。
它通过将数据位逐个传输,从而实现设备之间的数据交换。
51单片机是一种常用的微控制器,也支持串行通信。
本文将着重介绍51单片机串行通信的原理和应用。
二、串行通信原理1. 串行通信的基本概念串行通信是指将数据位逐个传输的通信方式。
相比并行通信,串行通信只需要使用一根信号线即可完成数据传输,因此可以节省线路资源。
在串行通信中,数据位按照一定的顺序传输,通常包括起始位、数据位、校验位和停止位。
2. 串行通信的工作原理51单片机通过UART(通用异步收发器)模块实现串行通信。
UART模块包括发送和接收两个部分,分别负责将数据发送到外部设备和接收外部设备发送的数据。
在发送数据时,51单片机将数据位逐个传输到UART模块,UART模块根据预设的波特率将数据转换为连续的电平信号发送出去。
在接收数据时,UART模块通过接收引脚接收外部设备发送的数据,并将其转换为51单片机可读取的数据格式。
3. 串行通信的优点和应用串行通信相比并行通信具有以下优点:(1)节省线路资源:串行通信只需要一根信号线,可以节省线路资源。
(2)易于实现:串行通信的电路设计相对简单,易于实现。
(3)可靠性高:串行通信可以通过增加校验位等方法提高通信的可靠性。
串行通信在实际应用中广泛使用,例如:(1)计算机与外部设备之间的数据传输;(2)网络通信中的数据传输;(3)工业控制系统中的数据采集和控制。
三、51单片机串行通信的实现1. 硬件连接51单片机的串行通信需要将其TXD(发送引脚)和RXD(接收引脚)与外部设备的相应引脚相连。
同时,还需要将单片机的地线与外部设备的地线相连,以确保信号的正常传输。
2. 软件编程在51单片机的编程中,需要配置UART模块的相关寄存器,设置波特率等参数。
具体的编程过程可以参考51单片机的开发文档,根据实际需求进行相应的配置。
基于51单片机的串行通信协议的实现作者:曾增烽刘浩李雪来源:《硅谷》2009年第13期[摘要]首先分析数据通信协议数据包的一般格式,然后采用有限状态机的算法实现单片机与上位机之间的串行通信协议,包含上下位机的数据发送接受和协议的解析实现,并给出具体的实现方法。
[关键词]51单片机串口通信协议上位机下位机中图分类号:TN91文献标识码:A文章编号:1671-7597(2009)0710022-01一、引言数据协议是建立在物理层之上的通信数据包格式。
所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。
在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。
所有的数据协议全部建立在这两个操作方法之上。
通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。
类似于网络通信中的TCP/IP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾[1][2]。
现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。
其中就涉及到通信的过程,本文给出了串行通信协议的具体实现,总结出了通信程序的通用写法,包括上位机端和下位机端等。
二、上位机和下位机中的数据发送物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。
数据包的发送即把数据包中的左右字节按照顺序一个一个的发送[3]。
在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。
另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去[4]。
对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。
以下是51系列单片机中发送单个字节的函数[5]。
void SendByte(unsigned char ch){SBUF = ch;while(TI ==0);TI = 0;}上位机中关于串口通信的方式也有多种,这种方式不是指数据有没有缓冲的问题,而是操作串口的方式不同,因为PC上数据发送基本上都会被缓冲后再发送。
项目5基于C51单片机的“串行通信”模块1.任务任务一:应用通用异步收发器(UART)实现串行通信;任务二:应用通用I/O口“模拟串口”实现串行通信;2.要求(1)能够在串口调试工具窗口中正确显示轮式教育机器人的状态信息;(2)能够实现轮式教育机器人与PC机的全双工串行通信;5.1 功能描述本案例模块的主要内容是:利用单片机的通用异步收发器(UART)或通用I/O口“模拟串口”实现点对点的双机通信,使轮式教育机器人能够与PC机(上位机)进行异步通信,在PC 机上显示轮式教育机器人的状态信息,通过该项目的学习与实践,可以让读者获得如下知识和技能:掌握单片机通用异步收发器(UART)的基本原理和应用方法;掌握超点对点的异步通信协议和通用I/O口“模拟串口”编程应用技能;5.2 必备知识5.2.1 串口通信协议简介通信协议是对数据传送方式的规定,包括数据格式定义和数据位定义等,通信双方必须遵守统一的通信协议,串行通信协议包括同步协议和异步协议两种,本章只介绍异步串行通信协议和异步串行协议规定的数据传送格式。
1)起始位:通信线上没有数据被传送时处于逻辑1状态,当发送设备要发送一个字符数据时,首先发出一个逻辑0信号,这个逻辑低电平就是起始位。
起始位通过通信线传向接收设备,接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。
起始位起的作用就设备同步,通信双方必须在传送数据位前协调同步。
2)数据位当接收设备收到起始位后,紧接着就会收到数据位。
数据位的位数可以是5、6、7或8位,.IBM-PC中经常采用7位或者8位数据传送,80C51串行口采用8位或9位数据传送。
这些数据位被接受到移位寄存器中,构成传送数据字符。
在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接受设备中被转换为并行数据。
3)奇偶校验位数据位发送完之后,可以发送奇偶校验位。
奇偶校验用于有限差错检测,通过双方须约定一致的奇偶校验方式。
如果选择偶校验,那么组成数据位和奇偶位的逻辑1的个数必须是偶数;如果选择是奇校验,那么逻辑1的个数必须是奇数。
4)停止位在奇偶位或数据位(当无奇偶校验时)之后发送的是停止位。
停止位是一个字符数据的结束标志,可以是1位、位或2位的高电平。
接收设备收到停止位之后,通信线路上便恢复逻辑1状态,直至下一个字符数据的起始位到来。
5) 波特率设置通信线上传输的所有为信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,这个速度叫波特率。
如果数据以每秒9600个二进制在通信线上传送,那么传送速度为9600波特,通常记9600b/s,通信双方必须设置相同的波特率。
图5-1 异步串行通信数据格式5.2.2 RS232电平与TTL电平转换在单片机与PC机通信时,接口电路必须要进行电平转换,因为PC机采用的是RS232标准,而单片机采用的是TTL标准,这是其一。
第二是单片机与单片机之间的串行通信如果采用直接传输信息,其传输距离一般不超过1.5m,若要实现更远距离的通信,则接口电路也必须要进行电平转换。
RS232标准是1969年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
它的逻辑“1”电平是-5V--15V,逻辑“0”电平是+5V-+15V。
TTL(Tansistor-Transistor Logic),是指三极管-三极管逻辑电路。
它规定:逻辑“0”:<0.4V;逻辑“1”:+3 V~+5 V 。
因此,RS-232不能和TTL电平直接相连,使用时必须进行电平转换,否则将使TTL 电路烧坏,为了让单片机与PC机能相互通信,必须让这两种电平相互转换。
6.3 设计案例5.3.1 系统设计方案电平转换可以由分立的三极管电路来完成也可以是采用专用转换芯片来完成。
本设计案例采用MAX232电平转换芯片构成电平转换电路,相对于分立元件构成的电平转换电路来说,它具有电路简单,稳定可靠等优点。
PC机与单片机串行通信框图如图5-2所示。
PC机串口单片机串口图5-2 PC机与单片机串行通信框图5.3.2 硬件电路设计C51单片机与PC机通信的接口电路设计如图x-3所示。
其中Max232是专用的电平转换芯片,与PC机接口一般采用三线制连接串口,也就是说和PC机的9针串口只用其中的3根线:分别是第5脚的GND、第2脚的RXD、第3脚的TXD,Max232的第9脚和第10脚分别连接到单片机的RXD和TXD引脚。
图5-3 RS232与TTL电平转换电路5.3.3 软件设计任务一、应用UART实现单片机与PC机通信本任务是编程单片机内部的通用异步收发器(UART),使其发送和接收数据,实现与PC机(上位机)的异步通信。
1、源程序/*=========================================================程序名:uart.c功能:串口初始化程序、轮式教育机器人向PC机(上位机)发送数据(注:系统晶振频率为11.0592MHz,波特率设为9600bps)===========================================================*/#include <AT89X51.h>#include <stdio.h>#define OLEN 8 //串行发送缓冲区大小unsigned char ostart; //发送缓冲区起始索引unsigned char oend; //发送缓冲区结束索引char idata outbuf[OLEN]; //发送缓冲区存储数组#define ILEN 8 //串行接收缓冲区大小unsigned char istart; //接收缓冲区起始索引unsigned char iend; //接收缓冲区结束索引char idata inbuf[ILEN]; //接收缓冲区存储数组bit bdata sendfull; //发送缓冲区满标志bit bdata sendactive; //发送有效标志void uart_Init();void main(void){uart_Init();printf("Hello world!\n");while(1);}/*串行中断服务程序*/static void com_isr(void) interrupt 4 using 1{//-------------接收数据----------------char c;if(RI) //接收中断置位{c=SBUF; //读字符RI=0; //清接收中断标志if(istart+ILEN!=iend)inbuf[iend++&(ILEN-1)]=c; //缓冲区接收数据}//-------------发送数据----------------if(TI){TI=0; //清发送中断标志if(ostart!=oend){SBUF=outbuf[ostart++&(OLEN-1)]; //向发送缓冲区传送字符sendfull=0; //设置缓冲区满标志位}elsesendactive=0; //设置发送无效}}//PUTBUF:写字符到SBUF或发送缓冲区void putbuf(char c){if(!sendfull) //如果缓冲区不满就发送{if(!sendactive){sendactive=1; //直接发送一个字符SBUF=c; //写到SBUF启动缓冲区}else{ES=0; //暂时串行口关闭中断outbuf[oend++&(OLEN-1)]=c; //向发送缓冲区传送字符if(((oend^ostart)&(OLEN-1))==0)sendfull=1; //设置缓冲区满标志ES=1; //打开串行口中断}}}//替换标准库函数putchar程序//printf函数使用putchar输出一个字符char putchar (char c){if (c=='\n') //增加新的行{while(sendfull); //等待发送缓冲区空putbuf(0x0D); //对新行在LF前发送CR}while(sendfull);putbuf(c);return(c);}//替换标准库函数_getkey程序//getchar和gets函数使用_getkeychar _getkey(void){char c;while(iend==istart) //判断接收缓冲区起始索引是否等于接收缓冲区结束索引{;}ES=0;c=inbuf[istart++&(ILEN-1)];ES=1;return(c);}/*初始化串行口和UART波特率函数*/void com_initialize(void){TMOD |=0x20; //设置定时器1工作在方式2,自动重载模式SCON=0x50;//设置串行口工作方式1, 即SM0=0,SM1=1,REN=1TH1=0xfd;//波特率9600 TL1=0xfd; TR1=1;//启动定时器 ES=1;//开串行口中断}void uart_Init() { com_initialize(); EA=1;//开总中断}2、程序运行按图2-5所示的连接电平转换硬件电路,用串口线连接轮式机器人和PC 机的串口,编译以上程序,将产生的可执行文件烧写到单片机程序存储器,开机运行,在PC 机上打开串口调试工具,可以看到在串口调试窗口显示“ Hello world!” 3、程序设计思路串口初始化函数及主函数的程序流程图如下图所示,它描述uart.c 的基本设计思路。
图5-4串口初始化流程图图5-5主函数流程图下面主要通过分析printf( )函数及scanf( )的执行过程,来加深对串口工作的理解:C51库函数中包含有字符的I/O函数,他们通过单片机串口来工作,这些I/O函数都依赖于两个函数:putchar( )函数和_getkey( )函数。
你可以在“C:\Program Files\Keil\C51\LIB”目录下找到这两个函数的定义。
其中getkey( )函数前面加了下划线“_”,表示该函数并不是标准的C库函数。
uart.h头文件修改了这两个函数用来满足自己的需求。
例printf(“Hello,world\n”);printf( )函数调用putchar( )函数将第一个字符(字符‘H’)发送到寄存器SBUF中;SBUF满,TI置位,进入中断处理函数发送该字符;之后,字符‘H’通过串口线到达PC 机串口,串口调试窗口进行接收处理,并将字符‘H’在接收区内显示。