实验七 UART串口通信

合集下载

8250串口实验

8250串口实验

实验七 8250串口实验一、实验目的1、熟悉串行通信的一般原理和8250的工原理。

2、了解RS--232串行接口标准及连接方法。

3、掌握8250芯片的编程方法。

二、实验设备MUT—Ⅲ型实验箱、8086CPU模块。

三、实验原理介绍1.实验原理图见8250串行接口电路。

由MAX232完成RS232电平和TTL电平的转换,由8250完成数据的收发。

8250内部有10个寄存器,分别对应着不同的IO口地址。

对不同的寄存器进行初始化或读出写入操作就可以完成与计算机的通信。

由于不能同时收发数据,所以8250又称为通用串行异步收发器,简写为:UART。

8250实验电路的所有信号均已连好。

8250串行接口电路(1)电路原理:该电路由一片8250,一片MAX232组成,该电路所有信号线均已接好。

原理图如下:(2)电路测试:见整机测试2.程序框图(8250.ASM)3.程序代码;*******************************************code segment ;define data segmentassume cs:codeorg 0100hstart:mov bx,0480hmov dx,bxadd dx,6mov ax,80hout dx,axmov dx,bxmov ax,0ch ;000ch---9600 ,clk=4.77MHZ/4 ; AL=4770000/16/9600/4=8out dx,axadd dx,2mov ax,0hout dx,axadd dx,4mov ax,07 ;no pe,8 bit, 1 stopout dx,axmov dx,bxadd dx,2 ;no interuptmov ax,0out dx,axadd dx,8hin ax,dxmov dx,bxin ax,dxcrd: call recvcall sendjmp crdsend: push axmov bx,0480hmov dx,bxadd dx,0ahin ax,dxtest ax,20hjnz recv2pop axjmp sendrecv2: pop axmov dx,bxout dx,axretrecv: mov bx,0480hmov dx,bxadd dx,0ahin ax,dxtest ax,01hjnz recv1jmp recvrecv1: mov dx,bxin ax,dxretcode ends ;end of code segmentend start ;end assembly3.实验提示实验中,通讯波特率选用9600bps。

uart实验报告

uart实验报告

uart实验报告
《UART实验报告》
实验目的:通过实验学习串行通信的基本原理,掌握UART通信协议的工作原理和使用方法。

实验设备:单片机开发板、串口调试助手、电脑。

实验原理:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信协议,用于在计算机和外部设备之间进行数据传输。

UART通信协议包括数据位、停止位、奇偶校验位等参数,通过这些参数的设置可以实现不同的通信速率和数据传输方式。

实验步骤:
1. 连接单片机开发板和电脑,打开串口调试助手。

2. 在单片机开发板上编写UART通信程序,设置通信参数。

3. 将单片机开发板通过串口连接到电脑,打开串口调试助手。

4. 在串口调试助手上发送数据,观察单片机开发板接收到的数据。

5. 在单片机开发板上发送数据,观察串口调试助手接收到的数据。

实验结果:
经过实验,我们成功地实现了通过UART通信协议在单片机开发板和电脑之间进行数据传输。

在串口调试助手上发送的数据能够被单片机开发板正确接收,并且在单片机开发板上发送的数据也能够被串口调试助手正确接收。

通过调整通信参数,我们还验证了不同通信速率和数据传输方式对通信效果的影响。

实验总结:
通过本次实验,我们深入了解了UART通信协议的工作原理和使用方法,掌握
了串行通信的基本原理。

在今后的学习和工作中,我们将能够更加熟练地应用UART通信协议进行数据传输,为实际工程应用打下了坚实的基础。

UART通信实验

UART通信实验

计算机与外部设备之间的通信一般采用两种方式:并行方式和串行方式。

所谓的并行方式就是各个位同时进行传输的通信方式,这种方式通信主要特点是通信的速度快,但当距离远且位数多的时候并行通信的成本就会高很多。

串行通信分为异步与同步串行通信。

UART(通用异步收发器)就是所谓的异步串行通信协议。

只要通信的双方采用相同的数据帧格式(数据位,开始位,校验位,停止位)和波特率就能在未共享同步时钟信号的情况下通过两根据数据线(RX和TX)进行数据通信。

采用这种方式,当数据传输结束后可以通过置位中断位通知处理器进行相应的处理。

STELLARIS系列ARM芯片的UART具有完全可编程,16C550型串口接口的特性(但并不兼容)。

独立发送FIFO(16B)和接收的FIFO(16B)(first in first out),可以将两个FIFO配置成不同程序的触发中断,可供选择的触发深底见下图中。

如:接收FIFO配置成1/4触发深度,则当UART收到4个数据时,产生接收中断。

UART模块的特性如下:下面是PC机的COM接口与ARM芯片的UART接口的典型电路。

注意:图中的电阻不能省略,否则会影响数据的传输。

U1是Exar(原sipex)公司出产的UART 转RS232C的接口芯片SP3232E。

可在3.3V下工作。

UART的功能概述:发送:发送逻辑从发送FIFO读取的数据执行并->串转换。

控制逻辑执行输出起始位在前的串行流,根据控制寄存器中已编程的配置,后面紧跟数据位(注:LSB最低位先输出),奇偶校验位,停止位。

接收:在检测到一个有效的起始脉冲时,接收逻辑对收到以的位流执行串->并转换,此外还会对溢出错误,奇偶校验错误,帧错误和线中止(line-break)错误进行检测。

并将检测到的状态一起写入到接收FIFO中。

波特率的产生:baud-rate divisor(波特率除数)是一个22位数,16位整数和6位小数。

实验7 UART串行通信基本方式实验

实验7    UART串行通信基本方式实验

参考程序内的数据区说明
(2)二级向量表(续)
HandleDMA0 HandleDMA1 HandleDMA2 HandleDMA3 HandleMMC HandleSPI0 HandleUART1 HandleNFCON HandleUSBD HandleUSBH HandleIIC HandleUART0 HandleSPI1 HandleRTC HandleADC END # # # # # # # # # # # # # # # 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
参考程序内的代码说明
2、清0有关的悬挂寄存器
ldr ldr str ldr ldr str ldr ldr str r0,=pSRCPND r1,=0xffffffff r1,[r0] r0,=pINTPND r1,=0xffffffff r1,[r0] r0,=pSUBSRCPND r1,=0x7ffff r1,[r0] ; ; ; ; ; ; ; ; ; 中断源悬挂寄存器 0=未请求,1=已请求,向对应位写1清0已有的中断请求 清0所有主中断源 中断悬挂寄存器 0=未请求,1=已请求,向对应位写1清除中断请求 清0中断悬挂寄存器所有位 子中断源悬挂寄存器,0~14位有效 0=未请求,1=已请求,向对应位写1清0已有的中断请求 清0所有子中断源
(1)代码段定义及异常向量表 (2)用于设置特殊功能寄存器区的13个存储器参数 (3)以下IsrIRQ为中断源判别程序 (4)复位异常处理程序,是开机或复位后首先运行的程序 (5)设置SDRAM存储器参数 (6)初始化可能用到的不同工作模式下的堆栈区 3、代码区2: 主程序 + 字符发送子程序 + 字符接收中断子程序
UART异步串口通信相关程序功能模块

uart串口通信实验报告

uart串口通信实验报告

串口通信实验报告基本实验:16位的乘法器设计思想:乘法器根据以往学过数电的设计经验,应该是移位相加的方法,设被乘数为[15:0]a,乘数为[15:0]b,则从b的最高位开始算起,c初值为0,为b最高位为1,则c就等于c+a;接下来,若b的次高位为1,则c左移一位加a,若为0则c左移一位就可以了,这样的步骤做到b的最低位那么c的值就是a*b,当然最好c是中间寄存器,这样结果才不会出现中间值。

实验的源码:module muti(clk,rst,ready,a,b,c);input clk;input rst;input [15:0]a;input [15:0]b;output [31:0]c;output ready;reg [31:0]c;reg ready;reg [31:0]temp;reg [5:0]n;always @(posedge clk or posedge rst)beginif(rst)beginc<=0;ready<=1;temp<=0;n<=32;endelseif(ready)begintemp<=0;n<=32;ready<=0;endelseif(n)beginif(b[n-1])begintemp<=(temp<<1)+a;n<=n-1;endbegintemp<=temp<<1;n<=n-1;endendelsebeginc<=temp;n<=32;ready<=1;endendendmodul测试代码:`timescale 1ns/1ns module tb;reg clk;reg [15:0]a;reg [15:0]b;reg rst;wire ready;wire [31:0]c;always #10 clk=~clk; initialbeginrst<=1;clk<=0;a=0;b=0;#10 rst=0;#21 a=21;b=32;#650 a=3;b=4;#700 $stop;endmuti muti_unit(.a(a),.b(b),.rst(rst),.clk(clk),.ready(ready),.c(c));endmodule这边a被乘数,b是乘数,当rst为高时,则将c置0,ready置一,ready信号为高表示此时空闲可以计算,rst为低时则开始计算,21*32为672,3*4为12,在乘法操作时,ready信号为低电平表示在工作中不能再输入进行计算,当计算结束则变为高电平。

UARTO通信实验

UARTO通信实验
while ((U0LSR & 0x20) == 0);//等待数据发送完毕
}
*******************************************************************************
**函数名称:UART0_Init()
**函数功能:串口初始化,设置工作模式和波特率。
实验报告
班级学号姓名同组人
实验日期室温大气压成绩
实验题目:UARTO通信实验
一、实验目的
1,了解串行口UART0的特性和用法。
2,熟悉EasyARM2131软件的参数设置及其发送、接收操作。
3,锻炼学生自己的设计、创造和综合性。
二、实验仪器
微型电子计算机(含软件H-JTAG V0.3.1和ADSv1_2)、Easy ARM2131开发板、UART0接口线、USB接口电源线和JTAG接口线以及部分跳线。
{
rcv_new =0;
UART0_SendBuf();
if((U0LSR & 0x20) == 0x20) //判断是否数据发送完毕
{IO1CLR = LED1;// LED1点亮
DelayNS (20);}
}
else IO1SET = LED1;// LED1熄灭
}
return 0;
}
本次实验程序中可以把用于参数过滤的部分程序删除,把一系列用于设置字长,停止位,奇偶校验的程序直接用U0LCR = 0x03就行,效果一个样,都是设置成字长为8、停止位为1、无奇偶校验位。实验中要把发送接收14个字符长度,只要把中断触发点的字符长度改为13个字节即可,如U0FCR = 0x0c1;。当改为13字节长度时,相信的循环数,数组容量也要改。本实验还附加了显示成功接收发送数据时的标志,即LED1灯会亮。

UART串口通信设计实例

UART串口通信设计实例

UART串口通信设计实例UART(Universal Asynchronous Receiver/Transmitter)是一种串口通信的协议,通过UART可以实现两个设备之间的数据传输。

在本文中,我们将设计一个基于UART的串口通信系统,并用一个实例来说明如何使用UART进行数据传输。

串口通信系统设计实例:假设我们有两个设备:设备A和设备B,它们之间需要通过串口进行数据传输。

设备A是一个传感器,负责采集环境温度信息;设备B是一个显示屏,负责显示温度信息。

首先,我们需要确定使用的UART参数,包括波特率、数据位数、校验位和停止位等。

假设我们选择的参数为9600波特率、8位数据位、无校验位和1个停止位。

接下来,我们需要确定数据的格式。

在本例中,我们选择使用ASCII码来表示温度值。

ASCII码是一种常用的字符编码方式,将字符与数字之间建立了一一对应的关系。

假设我们将温度的数据范围设置为-10到50,那么ASCII码表示为0x30到0x39和0x2d(负号)。

现在,我们可以开始设计串口通信系统的流程了:1.设备A采集环境温度信息,并将温度值转换成ASCII码格式。

2.设备A将ASCII码格式的温度值按照UART协议发送给设备B。

3.设备B接收UART数据,并将ASCII码格式的温度值转换成温度值。

4.设备B将温度值显示在屏幕上。

接下来,我们将详细介绍每个步骤的实现细节:1.设备A采集环境温度信息,并将温度值转换成ASCII码格式。

设备A可以使用温度传感器读取环境温度,并将读取的温度值转换成ASCII码。

例如,如果读取到的温度值为25,ASCII码格式为0x32和0x352.设备A将ASCII码格式的温度值按照UART协议发送给设备B。

设备A可以通过UART发送函数将ASCII码格式的数据发送给设备B。

发送函数会将数据按照UART协议的要求进行传输,包括起始位、数据位、校验位和停止位等。

3.设备B接收UART数据,并将ASCII码格式的温度值转换成温度值。

实验七 UART串口通信

实验七 UART串口通信

实验七UART串口通信一、实验目的1.能够理解UART串口通信的基本原理和通信过程。

2.学会通过配置寄存器,实现串口通信的基本操作过程。

二、实验内容通过对单片机编程来实现UART串口通信的基本过程,通过串口调试助手发送数据到单片机,并在数码管上显示出来。

三、实验参考原理3.1 串行通信的初步认识通信按照基本类型可以分为并行通信和串行通信。

并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是因为通信线多占用资源多,成本高。

比如我们前边用到的P0 = 0xfe;一次给P0的8个IO口分别赋值,同时进行信号输出,类似于有8个车道同时可以过去8辆车一样,这种形式就是并行的,我们习惯上还称P0、P1、P2和P3为51单片机的4组并行总线。

而串行通信,就如同一条车道,一次只能一辆车过去,如果一个0xfe这样一个字节的数据要传输过去的话,假如低位在前高位在后,那发送方式就是0-1-1-1-1-1-1-1-1,一位一位的发送出去的,要发送8次才能发送完一个字节。

在STC89C52上,有两个引脚,是专门用来做UART串口通信的,一个是P3.0一个是P3.1,还分别有另外的名字叫做RXD和TXD,这两个引脚是专门用来进行UART通信的,如果我们两个单片机进行UART串口通信的话,那基本的演示图如图3-1所示。

图3-1 单片机之间UART通信示意图图中,GND表示单片机系统电源的参考地,TXD是串行发送引脚,RXD是串行接收引脚。

两个单片机之间要通信,首先电源基准得一样,所以我们要把两个单片机的GND相互连起来,然后单片机1的TXD引脚接到单片机2的RXD引脚上,即此路为单片机1发送而单片机2接收的通道,单片机1的RXD引脚接到单片机2的TXD引脚上,即此路为单片机2发送而单片机2接收的通道。

这个示意图就体现了两个单片机各自收发信息的过程。

当单片机1想给单片机2发送数据时,比如发送一个0xE4这个数据,用二进制形式表示就是0b11100100,在UART通信过程中,是低位先发,高位后发的原则,那么就让TXD 首先拉低电平,持续一段时间,发送一位0,然后继续拉低,再持续一段时间,又发送了一位0,然后拉高电平,持续一段时间,发了一位1......一直到把8位二进制数字0b11100100全部发送完毕。

串口通信实验报告

串口通信实验报告

一、实验目的1. 了解串口通信的基本原理和作用。

2. 掌握单片机串口通信的编程方法。

3. 通过实验验证串口通信的可靠性和稳定性。

二、实验原理串口通信是指通过串行通信接口进行的数据传输方式。

串口通信具有传输速率较低、通信距离较近等特点,但具有简单、可靠、易于实现等优点。

在单片机应用中,串口通信广泛应用于数据采集、设备控制、远程通信等领域。

单片机串口通信的基本原理是:通过单片机的串行通信接口(如UART、USART等)发送和接收数据。

串口通信的数据格式通常包括起始位、数据位、奇偶校验位和停止位。

三、实验设备1. 单片机开发板(如STC89C52、STM32等)2. 串口调试助手(如PuTTY、串口调试助手等)3. 仿真软件(如Proteus、Keil等)四、实验内容1. 串口通信硬件连接2. 串口通信软件编程3. 串口通信调试与验证五、实验步骤1. 硬件连接(1)将单片机的TXD、RXD、GND等引脚与计算机的串口通信线相连。

(2)将计算机的串口通信线与串口调试助手相连。

2. 软件编程(1)在仿真软件中编写单片机程序,实现数据的发送和接收。

(2)在串口调试助手中编写程序,实现数据的发送和接收。

3. 调试与验证(1)在仿真软件中运行单片机程序,观察串口调试助手中的数据是否正确接收。

(2)修改单片机程序,改变发送和接收的数据,验证串口通信的可靠性。

六、实验结果与分析1. 实验结果通过实验,成功实现了单片机与计算机之间的串口通信。

在串口调试助手中,可以观察到单片机发送的数据被正确接收,同时也可以向单片机发送数据。

2. 实验分析(1)实验验证了单片机串口通信的可靠性和稳定性。

(2)实验过程中,需要注意波特率、数据位、停止位等参数的设置,以保证通信的准确性。

(3)实验过程中,可以尝试不同的通信协议,如ASCII码、十六进制等,以适应不同的应用场景。

七、实验心得1. 串口通信是一种简单、可靠的数据传输方式,在单片机应用中具有广泛的应用前景。

实验七、UART串行数据通信实验

实验七、UART串行数据通信实验

实验七、UART串行数据通信实验1(查询与中断方式)一、实验目的通过实验,掌握UART查询与中断方式的程序的设计。

二、实验设备●硬件:PC 机一台●LPC2131教学实验开发平台一套●软件:Windows98/XP/2000 系统,ADS 1.2 集成开发环境。

●EasyARM工具软件。

三、实验原理EasyARM2131 开发板上,UART0 的电路图如图8.1 所示,当跳线JP6 分别选择TxD0和RxD0 端时方可进行UART0 通讯实验。

图8.1 UART0 电路原理图四、实验内容实验内容1使用查询方式,通过串口0 接收上位机发送的字符串如“Hello EasyARM2131!”,然后送回上位机显示,主程序以及各子程序流程如图8.2 所示。

(改写发送内容,字符个数不同)。

说明:需要上位机(PC机)串口终端如EasyARM.exe 软件。

使用串口延长线把LPC2131教学实验开发平台的CZ2(UART0)与PC机的COM1 连接。

PC 机运行EasyARM 软件,设置串口为COM1,波特率为115200,然后选择【设置】->【发送数据】,在弹出的发送数据窗口中点击“高级”即可打开接收窗口。

图8.2 串口实验相关程序流程图1.实验预习要求①研读LPC2000 UART工作原理与控制章节,注意FIFO 接收情况的特性。

②了解LPC2131教学实验开发平台的硬件结构,注意串口部分的电路。

2.实验步骤①启动ADS 1.2,使用ARM Executable Image for lpc2131工程模板建立一个工程DataRet_C。

②在user 组中的main.c 中编写主程序代码,在项目中的config.h 文件中加入#include <stdio.h>。

③选用DebugInFlash生成目标,然后编译连接工程。

④将EasyARM2131开发板上的JP6跳线分别选择TxD0和RxD0端时,方可进行UART0通信实验。

通信协议详解uart串口协议+数据格式+设计实现

通信协议详解uart串口协议+数据格式+设计实现

一、uart串口通信简介通用异步收发器 uart(universal asynchronous receiver/transmitter),是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位地传输,在uart通讯协议中信号线上的状态位高电平代表’1’,低电平代表’0’。

其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低了成本,但传送速度较慢。

二、串口传输1、数据协议在串口通信中,尤其需要关注的是数据流以及波特率。

一个数据流由10个数据位组成,包含1位起始位,7位有效数据位,1位奇偶校验位,1位停止位。

uart串口信号线上空闲时常驻高电平,当检测到低电平下降沿时认为数据传输开始,到停止位时数据传输结束,一共10位数据位组成一个数据包。

起始位:通信线路上空闲时为“1”,当检测到“0”即下降沿时,认为数据传输开始有效数据位:传输开始后传递的需要接收和发送的数据值,可以表示指令或数据奇偶校验位:奇偶校验,通过来校验传输数据中“1”的个数为奇数个(奇校验)或偶数个(偶校验)来指示传输数据是否正确停止位:数据传输结束,传输线恢复常“1”状态此外,还需关注数据传输波特率,波特率表示一秒内传输了多少个码元数量,一般波特率为300,1200,2400,9600,19200,38400,115200等。

例如9600 baud表示一秒内传输了9600个码元信息,当一个码元只含1 bit 信息时,波特率=比特率2、整体架构串口协议用于与其他模块之间的信息交互,包含接收模块和发送模块,信号传输线上根据波特率完成码元的接收与发送,因而接收模块主要完成并串转换,串并转换是接收和发送模块必备的基本功能,发送模块完成并串转换,接收模块完成串并转换。

波特率与时钟频率关系如下(码元为单bit时):三、串口传输实现1、发送模块代码如下module uart_tx(clk ,rst_n ,data_vld ,data_in,data_out,rdy );parameter width =8;parameter clk_cnt=5208;parameter num_cnt=10;input clk;input rst_n;input [width-1:0]data_in;input data_vld;output data_out;output rdy;reg data_out;reg [width-1:0]data_in_reg;reg start_tx;wire [width-1+2:0] data;reg [12:0] cnt0;wire add_cnt0;wire end_cnt0;reg [3:0] cnt1;wire add_cnt1;wire end_cnt1;always@(posedge clk or negedge rst_n)beginif(!rst_n)start_tx<=0;elseif(start_tx==0&&data_vld==1)start_tx<=1;elseif(end_cnt1)start_tx<=0;endalways @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <=0;endelseif(add_cnt0)beginif(end_cnt0)cnt0 <=0;elsecnt0 <= cnt0 +1;endendassign add_cnt0 = start_tx;assign end_cnt0 = add_cnt0 && cnt0== clk_cnt-1;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <=0;endelseif(add_cnt1)beginif(end_cnt1)cnt1 <=0;elsecnt1 <= cnt1 +1;endendassign add_cnt1 = end_cnt0;assign end_cnt1 = add_cnt1 && cnt1== num_cnt-1;always @(posedge clk or negedge rst_n)begin if(!rst_n)begin data_in_reg<=0;endelseif(start_tx==0&&data_vld==1)beginendendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindata_out <=1'b1;endelseif(add_cnt0 && cnt0==1-1)begindata_out <= data[cnt1];endendassign data={1'b1,data_in_reg,1'b0};assign rdy=((data_vld==1)||(start_tx==1))?1'b0:1'b1; endmodule2、接收模块代码如下:module uart_rx(clk ,rst_n ,data_vld ,rx_data_in,rx_data_out);parameter width =8;parameter clk_cnt=5208;parameter clk_cnt_mid=2604;parameter num_cnt=10;input clk;input rst_n;input rx_data_in;output reg [width-1:0] rx_data_out;output reg data_vld;wire start_rx;reg [19:0] cnt0;wire add_cnt0;wire end_cnt0;reg [3:0] cnt1;wire add_cnt1;wire end_cnt1;reg flag;reg rx_data_in_reg1;reg rx_data_in_reg2;always@(posedge clk or negedge rst_n)beginif(!rst_n)beginrx_data_in_reg0<=0;rx_data_in_reg1<=0;rx_data_in_reg2<=0;endelse beginrx_data_in_reg0<=rx_data_in;rx_data_in_reg1<=rx_data_in_reg0;rx_data_in_reg2<=rx_data_in_reg1;endendassign start_rx=(rx_data_in_reg2&&~rx_data_in_reg1)==1; always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginflag <=1'b0;endelseif(start_rx)beginflag <=1'b1;endelseif(end_cnt1)beginflag <=1'b0;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <=0;endelseif(add_cnt0)beginif(end_cnt0)cnt0 <=0;elsecnt0 <= cnt0 +1;endendassign add_cnt0 = flag;assign end_cnt0 = add_cnt0 && cnt0== clk_cnt-1; always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <=0;endelseif(add_cnt1)beginif(end_cnt1)cnt1 <=0;elsecnt1 <= cnt1 +1;endendassign add_cnt1 = end_cnt0;assign end_cnt1 = add_cnt1 && cnt1== num_cnt-1-1; always @(posedge clk or negedge rst_n)beginif(!rst_n)beginrx_data_out<=0;endelseif(cnt0==clk_cnt_mid-1&&cnt1!=0&&flag==1)begin rx_data_out[cnt1-1]<=rx_data_in_reg2;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindata_vld <=1'b0;endelseif(end_cnt1)begindata_vld <=1'b1;endelse begindata_vld <=1'b0;endendendmodule四、串口收发仿真串口发送模块仿真波形:串口接收模块仿真波形:。

实验7 UART串行通信基本方式实验

实验7    UART串行通信基本方式实验
S3C2440的UART串口功能单元没有提供符合RS-232C
串口通信信号标准的所有信号,其中电路内部只提供 了用于基带数据传输的数据发送和接受信号线RXD和 TXD,以及两根联络信号线—请求发送(RTS)和清 除发送(CTS)。而其它联络信号则没有提供。
实验说明
URAT串口通信外部电路连接图
实验目的
了解S3C2440处理器UART相关寄存器的使用。 熟悉S3C2440处理器串行口(UART)的结构、串行通
信原理。
掌握ARM处理器串行通信的软件编程方法。
实验说明
嵌入式系统广泛所用的UART异步串行通信方式,是
经过9针/孔D型连接头连接的三线串行通信方式,包括 一对收/发交叉连接的信号线和一根共用的地线。
6、 UART0 波特率设置寄存器设置: UBRDIV0=(MCLK/(115200*16))-1 取整≈26=0x01a, MCLK=50Mhz。
实验说明
初始化中断寄存器模块
1、开启子中断屏蔽寄存器INTSUBMSK的RXD0位‘
2、开启中断屏蔽寄存器UART0位,打开串口中断; 3、设置中断服务向量表中断服务程存器UCON0设置: 收/发为中断或 查询方式,产生接收错误中断,收/发中断请求信号为电 平形式,使能FIFO模式接收超时中断,波特率发生器输 入时钟为PCLK(本实验=50MHz) 5、 UART0 FIFO控制寄存器UFCON0设置:设置接收 FIFO的触发等级为8byte触发,重置并开启FIFO;
完成实验后,先关闭电源,再拔取
导线,将导线整理好后放入指定位 置,将凳子放入桌下,方可离开。
实验说明
数据接收和发送采用的工作方式
S3C2440的UART串口可以选择两种工作模式,一时单 字符收发模式,一种是基于FIFO数据缓存器的多字符 收发模式。

实验7 串口通信实验

实验7 串口通信实验

3实验内容
学习S3C44B0X的UART相关寄存器的 功能,熟悉S3C44B0X系统硬件的 UART相关接口。编写S3C44B0X处理 器的串口通信程序。 S3CEV40监视串行口,并将接收到的 字符回送。
4实验原理
1. S3C44B0X串行通讯(UART)单元
S3C44B0X UART 单元提供两个独立的异步串行 通信口,皆可工作于中断和DMA模式。最高波 特率达115.2Kbps。每一个UART单元包含一个 16字节的FIFO,用于数据的接收和发送。 S3C44B0X UART包括可编程波特率,红外发送/ 接收,一个或两个停止位,5bit/6bit/ 7bit/ 或8bit数据宽度和奇偶校验。
UART TRANSMIT HOLDING(BUFFER) REGISTER & FIFO REGISTER
UART RECEIVE HOLDING (BUFFER) REGISTER & FIFO REGISTER
UART BAUD RATE DIVISION REGISTER
波特率的产生
实验4 串口通信实验
1实验目的 2实验设备 3实验内容 4实验原理 5实验操作步骤
1实验目的
通过实验了解S3C44B0x处理器串行口 (UART)的结构,串行通讯的原理。 掌握ARM处理器串行通信的编程方法。
2试验设备
硬件:Embest S3CEV40实验平台, Embest ARM标准/增强型仿真器套件, PC机。 软件:Embest IDE 2003集成开发环境, Windows 98/2000/NT/XP。
UBRDIVn = (int)(40000000/(115200 x 16)+0.5 ) -1 = (int)(21.7+0.5) –1 = 22 -1 = 21

UART串口通信程序

UART串口通信程序
--------------------------------------------------------------------
UART接口实险。
1、串口以查询方式接收数据,并分别将数据显示的PB口和返回。
2、内部1 M晶振,程序采用单任务方式,软件延时。
UDR = i; /* 发送数据*/
}
unsigned char Uart_Receive( void ) /*数据接收,查询方式*/
{
while (!(UCSRA & (1<<RXC))); /* 等待接收数据*/
return UDR; /* 获取并返回数据*/
}
void main(void) /*主函数*/
{
unsigned char temp; DDRA = 0x00; /*方向输入*/
PORTA = 0xFF; /*打开上拉*/
DDRB = 0xFF; /*方向输出*/
PORTB = 0xFF; /*电平设置*/
DDRC = 0x00; PORTC = 0xFF; DDRD = 0x02; PORTD = 0xFF; Uart_Init();
while (1)
{
temp = Uart_Receive(); /*等待接收数据*/
PORTB = ~temp; /*显示低电平有效*/
Uart_Transmit(temp); /*发送收到的数据*/
}
}
UCSRC = 0x06; /*8位数据*/
UBRRH = 0x00; UBRRL = 12; /*9600*/
}
void Uart_Transmit(unsigned char i) /*数据发送,查询方式*/

24. USART串口通信实验

24. USART串口通信实验
10位×240个/秒 = 2400 bps
普中STM32开发板带您进入ARM世界
2.STM32F1的USART介绍
2.1 串口通信简介 串口通信(Serial Communication),是指外设和计算机间,通过数据
信号线、地线等,按位进行传输数据的一种通信方式,属于串行通信方 式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插 件电缆以及使用的协议。
普中STM32开发板带您进入ARM世界
(4)使能TypeDef* USARTx, FunctionalState NewState); USART_Cmd(USART1, ENABLE); //使能串口1
(5)设置串口中断类型并使能
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
USART_ITConfig(USART1,USART_IT_TC, ENABLE);
对应的串口中断类型可在stm32f10x_usart.h中查找到
普中STM32开发板带您进入ARM世界
(6)设置串口中断优先级,使能串口中断通道
USART_HardwareFlowControl_None;//无硬件数据流控制 USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发
模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1
//读取接收到的

UART串口通信实验报告

UART串口通信实验报告

实验四UART串口通信学院:研究生院学号:1400030034姓名:张秋明一、实验目得及要求设计一个UART串口通信协议,实现“串<-->并”转换功能得电路,也就就是“通用异步收发器”。

二、实验原理UART就是一种通用串行数据总线,用于异步通信。

该总线双向通信,可以实现全双工传输与接收。

在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间得通信,与PC机通信包括与监控调试器与其它器件,如EEPROM通信。

UART作为异步串口通信协议得一种,工作原理就是将传输数据得每个字符一位接一位地传输。

其中各位得意义如下:起始位:先发出一个逻辑”0”得信号,表示传输字符得开始。

资料位:紧接着起始位之后。

资料位得个数可以就是4.5.6.7、8等,构成一个字符。

通常采用ASCII码。

从最低位开始传送,靠时钟定位。

奇偶校验位:资料位加上这一位后,使得“1”得位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送得正确性。

停止位:它就是一个字符数据得结束标志。

可以就是1位、1.5位、2位得高电平。

由于数据就是在传输线上定时得,并且每一个设备有其自己得时钟,很可能在通信中两台设备间出现了小小得不同步。

因此停止位不仅仅就是表示传输得结束,并且提供计算机校正时钟同步得机会。

适用于停止位得位数越多,不同时钟同步得容忍程度越大,但就是数据传输率同时也越慢。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

波特率:就是衡量资料传送速率得指标。

表示每秒钟传送得符号数(symbol)。

一个符号代表得信息量(比特数)与符号得阶数有关。

例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就就是120baud,比特率就是120*8=960bit/s。

这两者得概念很容易搞错。

三、实现程序library ieee;use ieee、std_logic_1164.all;use ieee、std_logic_arith、all;use ieee、std_logic_unsigned、all;entity uart isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号;rs232_tx: out std_logic --RS232发送数据信号;); end uart;architecture behav of uart isponent uart_rx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps得高电平为接收数据得采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);end ponent;ponent speed_select port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps 得高电平为接收或者发送数据位得中间采样点bps_start:in std_logic --接收数据后,波特率时钟启动信号置位);end ponent;ponent uart_tx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps 得高电平为接收数据得采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据得时候,发送模块不工作,避免了一个完整得数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确得数据传输出去);end ponent;signal bps_start_1:std_logic;signal bps_start_2:std_logic;signal clk_bps_1:std_logic;signal clk_bps_2:std_logic;signal rx_data:std_logic_vector(7 downto 0);signal rx_int:std_logic;beginRX_TOP: uart_rx port map(clk=>clk,rst_n=>rst_n,rs232_rx=>rs232_rx,clk_bps=>clk_bps_1,bps_start=>bps_start_1,rx_data=>rx_data,rx_int=>rx_int);SPEED_TOP_RX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_1,bps_start=>bps_start_1);TX_TOP:uart_tx port map(clk=>clk, --系统时钟rst_n=>rst_n, --复位信号rs232_tx=>rs232_tx, --RS232发送数据信号clk_bps=>clk_bps_2, --此时clk_bps 得高电平为发送数据得采样点bps_start=>bps_start_2, --接收到数据后,波特率时钟启动置位rx_data=>rx_data, --接收数据寄存器,保存直至下一个数据来到rx_int=>rx_int --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据得时候,发送模块不工作,避免了一个完整得数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确得数据传输出去);SPEED_TOP_TX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_2,bps_start=>bps_start_2);end behav;-----------------------------------------------------------------------------------------------------------------------3个子模块------------------------------------------------------------------------------异步接收模块-------------------------------------------library ieee;use ieee、std_logic_1164.all;use ieee、std_logic_unsigned、all;entity uart_rx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps得高电平为接收数据得采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据得时候,发送模块不工作,避免了一个完整得数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确得数据传输出去);end uart_rx;architecture behav of uart_rx issignal rs232_rx0: std_logic;signal rs232_rx1: std_logic;signal rs232_rx2: std_logic;signal rs232_rx3: std_logic;signal neg_rs232_rx:std_logic;signal bps_start_r:std_logic;signal num:integer;signal rx_data_r:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrs232_rx0<='0';rs232_rx1<='0';rs232_rx2<='0';rs232_rx3<='0';elseif (rising_edge(clk)) thenrs232_rx0<=rs232_rx;rs232_rx1<=rs232_rx0;rs232_rx2<=rs232_rx1;rs232_rx3<=rs232_rx2;end if;end if;neg_rs232_rx <=rs232_rx3 and rs232_rx2 and not(rs232_rx1)and not(rs232_rx0);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';rx_int<='0';elseif (rising_edge(clk)) thenif(neg_rs232_rx='1') then --接收到串口数据线rs232_rx 得下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收rx_int<='1'; --接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号rx_int<='0'; --接收数据中断信号关闭end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrx_data_r<="00000000";rx_data<="00000000";num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rx_data_r(0)<=rs232_rx;--锁存第0bitwhen 2=>rx_data_r(1)<=rs232_rx;--锁存第0bitwhen 3=>rx_data_r(2)<=rs232_rx;--锁存第0bitwhen 4=>rx_data_r(3)<=rs232_rx;--锁存第0bitwhen 5=>rx_data_r(4)<=rs232_rx;--锁存第0bitwhen 6=>rx_data_r(5)<=rs232_rx;--锁存第0bitwhen 7=>rx_data_r(6)<=rs232_rx;--锁存第0bitwhen 8=>rx_data_r(7)<=rs232_rx;--锁存第0bitwhen 10=>rx_data<=rx_data_r;when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;---------------------------------波特率控制模块-----------------------------------------library ieee;use ieee、std_logic_1164.all;use ieee、std_logic_arith、all;use ieee、std_logic_unsigned、all;entity speed_select isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps得高电平为接收或者发送数据位得中间采样点bps_start:in std_logic --接收数据后,波特率时钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位);end speed_select;architecture behav of speed_select issignal cnt:std_logic_vector(12 downto 0);signal clk_bps_r:std_logic;constant BPS_PARA:integer:=5207;constant BPS_PARA_2:integer:=2603;beginprocess(clk,rst_n)beginif (rst_n='0')thencnt<="00";elseif (rising_edge(clk)) thenif((cnt=BPS_PARA)or(bps_start='0')) thencnt<="00"; --波特率计数器清零elsecnt<=cnt+'1'; --波特率时钟计数启动end if;end if;end if;end process;process(clk,rst_n)beginif (rst_n='0')thenclk_bps_r<='0';elseif (rising_edge(clk)) thenif(cnt=BPS_PARA_2) thenclk_bps_r<='1'; --clk_bps_r高电平为接收数据位得中间采样点,同时也作为发送数据得数据改变点elseclk_bps_r<='0'; --波特率计数器清零end if;end if;end if;clk_bps<=clk_bps_r;end process;end behav;---------------------------------异步发送模块------------------------------------------- library ieee;use ieee、std_logic_1164.all;use ieee、std_logic_unsigned、all;entity uart_tx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps得高电平为接收数据得采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据得时候,发送模块不工作,避免了一个完整得数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确得数据传输出去);end uart_tx;architecture behav of uart_tx issignal rx_int0: std_logic;signal rx_int1: std_logic;signal rx_int2: std_logic;signal neg_rx_int:std_logic;signal bps_start_r:std_logic;signal num:integer;signal tx_data:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrx_int0<='0';rx_int1<='0';rx_int2<='0';elseif (rising_edge(clk)) thenrx_int0<=rx_int;rx_int1<=rx_int0;rx_int2<=rx_int1;end if;end if;neg_rx_int <=not(rx_int1)and (rx_int2);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';tx_data<="00000000";elseif (rising_edge(clk)) thenif(neg_rx_int='1') then --接收到串口数据线rs232_rx得下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收tx_data<=rx_data; --接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrs232_tx<='1';num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rs232_tx<='0';when 2=>rs232_tx<=tx_data(0);--发送第1bitwhen 3=>rs232_tx<=tx_data(1);--发送第2bitwhen 4=>rs232_tx<=tx_data(2);--发送第3bitwhen 5=>rs232_tx<=tx_data(3);--发送第4bitwhen 6=>rs232_tx<=tx_data(4);--发送第5bitwhen 7=>rs232_tx<=tx_data(5);--发送第6bitwhen 8=>rs232_tx<=tx_data(6);--发送第7bitwhen 9=>rs232_tx<=tx_data(7);--发送第8bitwhen 10=>rs232_tx<='1';when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;四、实验步骤1.建立新工程UART,选择芯片,型号为cyclone ii EP2C35F484C8。

dsp实验URT串口通信实验

dsp实验URT串口通信实验

实验八、UART串口通信实验一、实验目的1. 了解RS232通信接口的基本原理;2. 熟悉通信接口芯片(TL16C550C)在DSP I/O空间寄存器的地址映射及工作原理;3.了解异步通信中串口模式选择、设置数据传输格式、设置波特率、建立连接、传输数据和断开连接等功能。

二、实验设备1. 集成开发环境CCS2. 实验开发板TMS320VC5402DSK、RS232接口电缆线及附件3.程序“”三、实验内容及步骤实验操作流程参照前面实验。

1 在汇编环境调试Uart:(实现字符或文件的发送和回发功能)a. 实验代码main.s54、uartasm.cmd和uart_init.s54、dsp_init.s54以及uartasm.h54,c5402_dsk.gel(说明同前)。

b. 串口调试程序“” , 汇编调试中Build option设置情况与CODEC实验中的汇编调试设置及出错情况相同。

c. 程序文件介绍:1)“uart.h54”定义了一些寄存器的地址以及函数类型。

2)“dsp_init.s54”与dsp工作有关的寄存器ST1、PMST、IMR、IFR和SWWSR,并且清除INTM位以及设定时钟模式。

3)“uart_init.s54”先检测UART模块是否工作正常,然后设定UART模块的寄存器,如CNTL1、CNTL2、LCR、MSB&LSB(设定波特率)、FCR、IER等。

4)“main.s54”主程序查看标志位,检测是否UART存在有效接收数据。

若有,则执行一定的处理,包括亮LED以及将接收的数据从UART回发。

d. 执行程序时,只要发送数据时,可在串口调试程序的接收窗口立即看到回发的数据。

e. 程序中UART工作参数设置如下:1)波特率9600(或更低)、无数据校验、字符长度8比特、停止位1、2 均可;2) 接收区自动清空不选、十六进制显示可选可不选;发送区不能选十六进制发送,可发送字符和文件两种方式;3) IER允许数据就绪中断和线路状态中断;4) FIFO不使能,所以,在用串口程序调试时,只能单个字符发送,如“x”。

uart串口通信的基本原理和通信过程

uart串口通信的基本原理和通信过程

UART串口通信的基本原理和通信过程UART(Universal Asynchronous Receiver/Transmitter)是一种常见的串口通信协议,用于在计算机和外部设备之间进行数据传输。

本文将详细解释UART串口通信的基本原理和通信过程,并提供一个全面、详细、完整且深入的解释。

1. UART串口通信的基本原理UART串口通信是一种基于异步传输的通信协议,它使用两根信号线(TX和RX)来实现数据的传输。

UART通信的基本原理如下:•数据位:UART通信中的每个字符由一定数量的数据位组成,通常为8位。

每个数据位可以表示一个字节(8位二进制数)。

•停止位:每个字符之后会有一个停止位,用于指示一个字符的结束。

通常情况下,UART通信中的停止位为1个。

•起始位:每个字符之前会有一个起始位,用于指示一个字符的开始。

通常情况下,UART通信中的起始位为1个。

•波特率:UART通信中的波特率(Baud Rate)表示每秒钟传输的比特数。

常见的波特率有9600、115200等。

UART通信使用的是异步传输,即发送端和接收端没有共同的时钟信号。

因此,在通信过程中,发送端和接收端需要事先约定好相同的波特率,以确保数据的正确传输。

2. UART串口通信的通信过程UART串口通信的通信过程包括数据的发送和接收两个步骤。

下面将详细介绍UART串口通信的通信过程。

数据发送过程1.发送端准备数据:发送端需要准备要发送的数据,并将数据存储在发送缓冲区中。

2.发送端发送起始位:发送端在发送数据之前,会先发送一个起始位,用于指示一个字符的开始。

起始位的电平通常为低电平。

3.发送端发送数据位:发送端按照数据位的顺序,将数据位的电平依次发送出去。

每个数据位的电平表示一个二进制位(0或1)。

4.发送端发送停止位:发送端在发送完所有的数据位之后,会发送一个停止位,用于指示一个字符的结束。

停止位的电平通常为高电平。

数据接收过程1.接收端等待起始位:接收端在接收数据之前,会等待接收到一个起始位的电平变化,用于指示一个字符的开始。

S3C2410的UART串口通信实验

S3C2410的UART串口通信实验

S3C2410的UART串口通信实验实验7 S3C2410 的UART串口通信实验一、实验目的掌握S3C2410 UART串口的工作原理和编程方法,掌握和UART 串口有关寄存器UCONX、ULCONX、UFCONX、UMCONX、UBRDIVX的格式和使用方法,会用C语言对UART串口进行初始化编程和读写操作,重点理解UART串口通信波特率和波特率除数寄存器初值设置的关系,熟练掌握串口调试助手的用法。

二、实验内容PC机向S3C2410发送数据,S3C2410接到数据后有马上将所接到的数据没有变化的发送给PC,要求用串口调试助手看到调试结果。

三、UART串口相关知识初始化串口的过程为:UFCON0和UMCON0(地址为0x5000000C)置为0,表示不使用FIFO,不使用流控制;ULCON0置为0x03,表示有1位停止位,8位数据位,无校验位;UCON0置为0x05,表示串口工作方式为中断方式或询问方式;UBRDIV0置为0x270,表示波特率为4800 bps(1 bps=1 bit/s,计算方法为:PCLK(48MHz)/16/波特率–1= 0x270;如果设置为0x19,则波特率为115200 bps。

串口读写方式有两种,即轮询方式和中断方式。

轮询方式下,在死循环中进行串口的读写过程,中断方式下,当串口收到数据后或发送数据前将产生中断。

串口0的收发占用了GPH3和GPH2,需要配置这两个管脚为串口通信功能。

四、参考程序(1)UART初始化程序段41 void initUART0()42 {43 UFCON0 = 0x00;44 UMCON0 = 0x00;45 ULCON0 = 0x03; // One Stop, no parity, 8-bit46 UCON0 = 0x05;47 UBRDIV0 = 0x270; // 4800bps48 // PCLK=48MHz, Baudrate:4800bps, 0x270;49 // 115200bps, 0x1950 }(2)查询方式主要程序段29 // After received, Transfer it30 while(UTRSTAT0 & 0x01) // have data31 {32 uart0Ch[0] = URXH0; // Recieve33 while(UTRSTAT0 & 0x02)// Tras ready34 {35 UTXH0 = uart0Ch[0];36 }37 }(3)中断方式主要程序段67 void openUART0(void)68 {69 INTMOD = 0x0;70 INTMSK &= ~((1<<28) | (1<<9));// open dog and UART071 // Priority lower than watchdog72 INTSUBMSK =0x7FE; //&= ~(1<<0);// INT_RXD0 locates at73 PRIORITY = 0x7F;74 }7576 __irq void c_UART0_ISR()77 {7879 int iReg=0;80 if(SRCPND | (1<<28))81 SRCPND |= (1<<28);82 if(INTPND | (1<<28))83 INTPND |= (1<<28);84 if(SUBSRCPND | (1<<0))85 SUBSRCPND |= (1<<0);86 //if(SUBSRCPND | (1<<1))87 // SUBSRCPND |= (1<<1);88 chUart0[0] = URXH0;89 //while(0);90 while(UTRSTAT0 & 0x02) // Tras ready91 {92 UTXH0 = chUart0[0];93 }五、实验结果自己作答六、实验心得体会。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七UART串口通信一、实验目的1.能够理解UART串口通信的基本原理和通信过程。

2.学会通过配置寄存器,实现串口通信的基本操作过程。

二、实验内容通过对单片机编程来实现UART串口通信的基本过程,通过串口调试助手发送数据到单片机,并在数码管上显示出来。

三、实验参考原理3.1 串行通信的初步认识通信按照基本类型可以分为并行通信和串行通信。

并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是因为通信线多占用资源多,成本高。

比如我们前边用到的P0 = 0xfe;一次给P0的8个IO口分别赋值,同时进行信号输出,类似于有8个车道同时可以过去8辆车一样,这种形式就是并行的,我们习惯上还称P0、P1、P2和P3为51单片机的4组并行总线。

而串行通信,就如同一条车道,一次只能一辆车过去,如果一个0xfe这样一个字节的数据要传输过去的话,假如低位在前高位在后,那发送方式就是0-1-1-1-1-1-1-1-1,一位一位的发送出去的,要发送8次才能发送完一个字节。

在STC89C52上,有两个引脚,是专门用来做UART串口通信的,一个是P3.0一个是P3.1,还分别有另外的名字叫做RXD和TXD,这两个引脚是专门用来进行UART通信的,如果我们两个单片机进行UART串口通信的话,那基本的演示图如图3-1所示。

图3-1 单片机之间UART通信示意图图中,GND表示单片机系统电源的参考地,TXD是串行发送引脚,RXD是串行接收引脚。

两个单片机之间要通信,首先电源基准得一样,所以我们要把两个单片机的GND相互连起来,然后单片机1的TXD引脚接到单片机2的RXD引脚上,即此路为单片机1发送而单片机2接收的通道,单片机1的RXD引脚接到单片机2的TXD引脚上,即此路为单片机2发送而单片机2接收的通道。

这个示意图就体现了两个单片机各自收发信息的过程。

当单片机1想给单片机2发送数据时,比如发送一个0xE4这个数据,用二进制形式表示就是0b11100100,在UART通信过程中,是低位先发,高位后发的原则,那么就让TXD 首先拉低电平,持续一段时间,发送一位0,然后继续拉低,再持续一段时间,又发送了一位0,然后拉高电平,持续一段时间,发了一位1......一直到把8位二进制数字0b11100100全部发送完毕。

这里就牵扯到了一个问题,就是持续的这“一段时间”到底是多久?从这里引入我们通信中的另外重要概念——波特率,也叫做比特率。

波特率就是发送一位二进制数据的速率,习惯上用baud表示,即我们发送一位数据的持续时间=1/baud。

在通信之前,单片机1和单片机2首先都要明确的约定好他们之间的通信波特率,必须保持一致,收发双方才能正常实现通信,这一点大家一定要记清楚。

约定好速度后,我们还要考虑第二个问题,数据什么时候是起始,什么时候是结束呢?不管是提前接收还是延迟接收,数据都会接收错误。

在UART串行通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位0表示起始位,然后发送8位数据位,数据位是先低后高的顺序,数据位发完后再发一位1表示停止位。

这样本来要发送一个字节8位数据,而实际上我们一共发送了10位,多出来的两位其中一位起始位,一位停止位。

而接收方呢,原本一直保持的高电平,一旦检测到来了一位低电平,那就知道了要开始准备接收数据了,接收到8位数据位后,然后检测到停止位,再准备下一个数据的接收了。

我们图示看一下,如图3-2所示。

图3-2 串口数据发送示意图图3-2串口数据发送示意图,实际上是一个时域示意图,就是信号随着时间变化的对应关系。

比如在单片机的发送引脚上,左边的是先发生的,右边的是后发生的,数据位的切换时间就是波特率分之一秒。

3.2 串行RS232通信接口(了解)在台式电脑上,有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART 通信有关联,但是由于现在笔记本电脑都不带这种9针串口了,所以和单片机通信越来越趋向于使用USB虚拟的串口和单片机通信,因此这一节的内容作为了解内容。

先来认识一下这个标准串口,串口分为9针的和9孔的,习惯上也称之为公头和母头,如图3-3所示。

图3-3 RS232通信接口RS232接口一共有9个引脚,分别定义是:1、载波检测(DCD);2、接收数据(RXD);3、发送数据(TXD);4、数据终端准备好(DTR);5、信号地线(SG);6、数据准备好(DSR);7、请求发送(RTS);8、清除发送(CTS);9、振铃提示(RI)。

232串口和单片机进行通信,只需要关心其中的2脚(RXD),3脚(TXD)和5脚(GND)。

虽然这三个脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机对连直接通信,这是因为,不是所有的电路都是5V代表高电平而0V代表低电平的。

对于RS232标准来说,它是个反逻辑,也叫做负逻辑。

为何叫负逻辑?它的TXD和RXD的电压,-3V 到-15V代表是1,3-15V之间的电压代表是0。

低电平代表的是1,而高电平代表的是0,所以称之为负逻辑。

因此电脑的9针232串口是不能和单片机直接连接的,需要用一个转换芯片MAX232来完成,如图3-4所示。

图3-4 MAX232转接图这个芯片就可以实现把标准RS232串口电平转换成单片机能够识别和承受的UART 0V/5V电平标准。

也就是说其实RS232串口和UART串口,他们的协议类型是一样,只是电平不同而已,而MAX232这个芯片起到的就是中间人的作用,他把UART电平转换成RS232电平,也把RS232电平转换成UART电平,从而实现标准RS232接口和单片机UART 之间的通信连接。

3.3 USB转串口通信(掌握)随着技术的发展,工业上还有RS232串口通信的大量使用,但是商业技术的应用上,已经慢慢的使用USB转UART技术取代了RS232串口,绝大多数笔记本电脑已经没有串口这个东西了,那我们要实现单片机和电脑之间的通信该如何办呢?我们只需要在我们电路上添加一个USB转串口芯片,就可以成功实现USB通信协议和标准UART串行通信协议的转换,在我们的开发板上,我们使用的是CH340T这个芯片,如图3-5所示。

图3-5 USB转串口电路左侧J2是一组跳线的组合,大家可以在我们板子左下角的跳线位置找到,我们是把3脚和5脚、4脚和6脚通过跳线帽短接到一起。

右侧的CH340T这个电路很简单,把电源电路,晶振电路接好后,6脚和7脚的DP和DM分别接USB口的2个数据引脚上去,3脚和4脚通过跳线接到了我们单片机的TXD和RXD上去。

3.5 UART串口通信的基本应用3.5.1 通信的三种基本类型通信通常可以分为单工、半双工、全双工通信。

单工就是指只允许一方向另外一方传送信息,而另一方不能回传信息。

比如我们的电视遥控器,我们的收音机广播等,都是单工通信技术。

半双工是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如我们的对讲机就是典型的半双工。

全双工通信就发送数据的同时也能够接受数据,两者同步进行,就如同我们的电话一样,我们说话的同时也可以听到对方的声音。

3.5.2 UART模块介绍51单片机的UART串行口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成,先来了解一下串口控制寄存器SCON。

表3-1 SCON--串行控制寄存器的位分配(地址:98H)可位寻址;复位值:0x00;复位源:任何复位对于串口的四种模式,模式1是最常用的,就是前边提到的1位起始位,8位数据位和1位结束位。

在实际串口模块中,有一个专门的波特率发生器用来控制发送数据的速度和读取接收数据的速度。

对于STC89C52RC单片机来讲,这个波特率发生器只能由定时器1或定时器2产生,而不能由定时器0产生,这是物理结构决定的。

如果用定时器2,需要配置额外的寄存器,所以默认是使用定时器1作为波特率发生器,方式1下的波特率发生器必须使用定时器1的模式2,也就是自动重装载模式,定时器的初值具体的计算公式是:TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率和波特率有关的还有一个寄存器,是一个电源管理寄存器PCON,他的最高位可以把波特率提高一倍,也就是如果写PCON |=0x80以后,计算公式就成了TH1 = TL1 = 256 - 晶振值/12 /16 /波特率数字的含义这里解释一下,256是8位数据的溢出值,也就是TL1的溢出值,11059200就是我们板子上单片机的晶振,12是说1个机器周期是12个时钟周期,值得关注的是这个16,串口模块采取的方式是把一位信号采集16次,其中第7、8、9次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是1,如果两次是低电平,那么就认定这一位是0,这样一旦受到意外干扰读错一次数据,也依然可以保证最终数据的正确性。

串口通信的发送和接收电路,我们主要了解一下他们在物理上有2个名字相同的SBUF 寄存器,他们的地址也都是99H,但是一个用来做发送缓冲,一个用来做接收缓冲。

意思就是说,有2个房间,两个房间的门牌号是一样的,其中一个只出人不进人,另外一个只进人不出人,这样的话,我们就可以实现UART的全双工通信,相互之间不会产生干扰。

但是在逻辑上呢,我们每次只操作SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收SBUF还是发送SBUF,后边通过程序,我们就会彻底了解这个问题。

3.5.3 UART串口程序一般情况下,编写串口通信程序的基本步骤如下所示:1、配置串口为模式1。

2、配置定时器T1为模式2,即自动重装模式。

3、确定波特率大小,计算定时器TH1和TL1的初值,如果有需要可以使用PCON进行波特率加倍。

4、打开定时器控制寄存器TR1,让定时器跑起来。

这个地方还要特别注意一下,就是在使用T1做波特率发生器的时候,千万不要再使能T1的中断了。

串口中断,来看一下程序,结果如图3-6,例如发送0x12,返回0x13#include <reg52.h>void ConfigUART(unsigned int baud);void main (){EA = 1; //打开总中断ConfigUART(9600); //配置波特率为9600while(1);}/*串口配置函数,baud为通信波特率*/void ConfigUART(unsigned int baud){SCON = 0x50; //配置串口为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2TH1 = 256 - (11059200/12/32) / baud; //计算T1重载值TL1 = TH1; //初值等于重载值ET1 = 0; //禁止T1中断TR1 = 1; //启动T1ES = 1; //打开串口中断}void InterruptUART() interrupt 4{if (RI) //接收到字节{RI = 0; //手动清零接收中断标志位SBUF = SBUF + 1;//接收数据+1发回去,左边为发送SBUF,右边为接收SBUF。

相关文档
最新文档