UART串口通信实验报告
串口通信实验报告

试验三双机通讯试验【1 】一、试验目标UART 串行通讯接口技巧运用二、试验实现的功效用两片焦点板之间实现串行通讯,将按键信息互发到对方数码管显示.三、体系硬件设计(1)单片机的最小体系部分(2)电源部分(3)人机界面部分数码管部分按键部分(4)串口通讯部分四、体系软件设计#include <STC.H>#define uchar unsigned char#define uint unsigned intvoid send();uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;uint m=0,i=0,j;uchar temp,prt;/***y延时函数***/void delay(uint k){uint i,j; //界说局部变量ijfor(i=0;i<k;i++) //外层轮回{for(j=0;j<121;j++); //内层轮回}}/***键盘扫描***/char scan_key(){ H1=0;H2=0;L1=1;L2=1;L3=1;if(L1==0){ delay(5);if (L1==0){ L1=0;H1=1;H2=1;if(H1==0){ m=1; //KEY1键按下return(m);}if(H2==0){ m=4; //KEY4键按下return(m);}}}if(L2==0){ delay(5);if (L2==0){ L2=0;H1=1;H2=1;if(H1==0){ m=2; //KEY2键按下return(m);}if(H2==0){ m=5; //KEY5键按下return(m);}}}if(L3==0){ delay(5);if (L3==0){ L3=0;H1=1;H2=1;if(H1==0){ m=3; //KEY3键按下return(m);}if(H2==0){ m=6; // KEY6键按下return(m);}}}return(0);}/***主函数***/main(){P1M1=0x00;P1M0=0xff;SCON=0x50;//设定串行口工作方法1TMOD=0x20;//准时器1,主动重载,产生数据传输速度 TH1=0xfd;//数据传输率为9600TR1=1;//启动准时器1P0&=0xf0;while(1){if(scan_key()) //假如有按键按下{SBUF=scan_key(); //发送数据while(!TI); // 等待数据传送TI=0; // 消除数据传送标记}if(RI) //是否稀有据到来{RI=0; // 消除数据传送标记temp=SBUF; // 将吸收到的数据暂消失temp中}P1=code0[temp]; // 数据传送到P1口输出delay(500); //延时500ms}}五、试验中碰到的问题及解决办法(1)串行口和准时器的工作方法设定是症结,本次是按需传输的是两位十六进制数,串行口为工作方法1,准时器为8位主动重载;(2)采取P0&=0xf0语句使4个数码管静态点亮;(3)在发送和接收进程中,用标识位TI和RI来检测发送和接收是否完成;(4)在用电脑和单片机进行串口通讯测试时,电脑的传世速度必定要和单片机的传输速度相等,不然显示会消失错误.指点先生签字:日期:。
uart实验报告

uart实验报告
《UART实验报告》
实验目的:通过实验学习串行通信的基本原理,掌握UART通信协议的工作原理和使用方法。
实验设备:单片机开发板、串口调试助手、电脑。
实验原理:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信协议,用于在计算机和外部设备之间进行数据传输。
UART通信协议包括数据位、停止位、奇偶校验位等参数,通过这些参数的设置可以实现不同的通信速率和数据传输方式。
实验步骤:
1. 连接单片机开发板和电脑,打开串口调试助手。
2. 在单片机开发板上编写UART通信程序,设置通信参数。
3. 将单片机开发板通过串口连接到电脑,打开串口调试助手。
4. 在串口调试助手上发送数据,观察单片机开发板接收到的数据。
5. 在单片机开发板上发送数据,观察串口调试助手接收到的数据。
实验结果:
经过实验,我们成功地实现了通过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位小数。
实验4 UART实验

实验四uart实验1.实验类型:设计性实验2.实验目的:了解和熟悉实验箱硬件、UART通信程序设计及烧写等3.实验内容:(1) 根据硬件结构写出S3C2410与PC机的串口通信程序;(2) 根据接收命令控制LED灯的显示;4.关键实验步骤:1.把并口线插到pc机的并口,并把并口与JTAG相连,JTAG与开发板的14针JTAT口相连,打开2410-S.2.把整个GIVEIO目录拷贝到C:\WINDOWS下,并把该目录下的giveio.sys文件拷贝到c:/windows/system32/drivers下。
3.在控制面板里,选添加硬件>下一步>选-是我已经连接了此硬件>下一步>选中-添加新的硬件设备>下一步>选中安装我手动从列表选择的硬件>下一步>选择-显示所有设备>选择-从磁盘安装-浏览,指定驱动为C:\WINDOWS\GIVEIO\giveio.inf文件,点击确定,安装好驱动.4.根据硬件连接图编写控制程序,并生成bin文件.5.在d盘新建一目录ARM,把sjf2410.exe和要烧写的bin文件拷贝到该目录下,在程序-附件-msdos下,进入该目录,运行sjf2410 命令如下:sjf2410 /f:bin 文件.在此后出现的三次要求输入参数,第一次是让选择Flash,选0;第二次是选择jtag对flash的两种功能,也选0;第三次是让选择起始地址,选0此后就等待大约3-5分钟的烧写时间,当VIVI 烧写完毕后选择参数2,退出烧写。
烧录后重新启动2410-S,观察不同控制程序的实验现象。
#define ULCON0 (*(volatile unsigned long *)0x50000000)#define UCON0 (*(volatile unsigned long *)0x50000004)#define UTRSTA T0 (*(volatile unsigned long *)0x50000010)#define UTXH0 (*(volatile unsigned long *)0x50000020)#define URXH0 (*(volatile unsigned long *)0x50000024)#define UBRDIV0 (*(volatile unsigned long *)0x50000028)#define GPHCON (*(volatile unsigned long *)0x56000070)//#define GPHDAT (*(volatile unsigned long *)0x56000074) #define GPHUP (*(volatile unsigned long *)0x56000078)void Delay(unsigned long x);int Main(){unsigned long uartrecdata=0x09;ULCON0=0x03;UCON0=0x45;UBRDIV0=0x13;GPHCON=0x000000A0;GPHUP=0x00000000;while(1){while(!(UTRSTAT0&0x2)); //等待知道THR变空//改动延时时间1--10 Delay(100);UTXH0 =uartrecdata;Delay(100);while(!(UTRSTAT0&0x1)); //等待直到接受到一个数据uartrecdata=URXH0;Delay(100);}return 0;}void Delay(unsigned long x){unsigned long i,l=0;for(i=0;i<=x;i++);}IMPORT MainAREA Init,CODE,READONLYENTRYLDR R0,=0x53000000mov r1,#0STR R1,[R0]BL MainEND#define IOPMOD (*(volatile unsigned long *)0x56000020)#define IOPDATA (*(volatile unsigned long *)0x56000024)void Delay(unsigned long x);int Main(){unsigned long LED;IOPMOD=0x00005400; LED=0x00000001;while(1){IOPDATA=LED;LED=(LED<<1);if(LED==0x00000100)LED=0x00000001;Delay(200000);}return 0;}void Delay(unsigned long x){ unsigned long i;for(i=0;i<=x;i++) ;}。
实验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)实验

班级07电本一班学号2007050352姓名钟发炫同组人
实验日期2010. 06. 01 室温大气压成绩
实验题目:通用异步串行口(UART)实验
一、实验目的
1.掌握异步串行通信协议;
2.掌握2812异步收发器模块的应用。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP试验箱的TMS320F2812主控板;
3. DSP硬件仿真器。
三、实验原理
1.异步串行通信协议
在传输数据前,数据线处于高电平状态,这称为表示态。
传输开始后,数据线由高电平转为低电平状态,这称为起始位;起始位后面接着5~8个信息位;信息为后面是校验位;校验位后是停止位“1”。
传输完毕后,可以立即开始下一个字符的传输;否则,数据线再次进入标识态。
上面提到的信息位的位数(5~8位)、停止位的位数(1位、1..5位或2位)、校验的方式(奇偶验、偶校验或不校验)等参数都可以根据不同需要进行设置,但对于同一个传输系统中的首发两端来说,这些参数必须保持一致。
异步串行通信方式中另一个重要的参数是波特率。
在一般的“0”“1”系统中,波特率就是每秒钟传输的位数。
国际上规定了一个标准波特率系列,他们是最常用的波特率。
标准波特率系列为110、300、600、1200、1800、2400、4800、9600和19200。
发送端和接收端必须设置统一的波特率,否则无法正确接收数据。
2.电平转换
RS-232-C标准中规定-5V~-15V位逻辑“1”,+5V~+15V位逻辑“0”,因此要用专门的芯片完成TTL电平与RS-232电平的转换,如MAX3232。
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信号为低电平表示在工作中不能再输入进行计算,当计算结束则变为高电平。
串口传输实验总结

串口传输实验总结引言串口通信是一种常见的数据传输方式,特别适用于嵌入式系统和电子设备之间的通信。
在本次实验中,我们通过使用串口通信来实现数据的传输和接收。
本文档将总结我们在这个实验中的经验和教训,并提供一些关于串口传输的相关知识。
实验背景串口,也被称为通用异步收发传输器(UART),是一种用于在电子设备之间传输数据的常见接口。
串口通信使用两根线来传输数据,一根用于发送数据(Tx)而另一根用于接收数据(Rx)。
串口通信的一个重要特点是它是异步的,即发送端和接收端可以根据各自的节奏进行数据传输。
实验过程我们在本次实验中使用了一块嵌入式开发板和计算机之间的串口通信来实现数据传输。
以下是我们完成实验的步骤:1.配置串口通信参数:我们首先需要确定串口通信的参数,例如波特率、数据位、停止位和校验位等。
这些参数需要在发送端和接收端进行一致配置,以确保正常的数据传输。
2.编写发送端代码:我们使用编程语言编写了一个简单的程序,通过串口发送数据给接收端。
在这个程序中,我们首先初始化串口,然后将要发送的数据写入串口缓冲区,最后启动数据传输。
3.编写接收端代码:我们同样使用编程语言编写了一个程序,用于接收来自发送端的数据。
在这个程序中,我们首先初始化串口,然后开启中断监听串口接收事件,当接收到数据时,触发相应的中断处理函数来处理接收到的数据。
4.运行程序并进行测试:我们将发送端和接收端的代码分别烧录到嵌入式开发板和计算机上,并运行程序进行测试。
我们发送了不同类型的数据,例如字节、字符串和数字等,并检查接收端是否成功接收到并正确处理这些数据。
实验结果在我们的实验中,我们成功地实现了串口数据的传输和接收。
我们发送的各种类型的数据都能够被接收端正确地接收到并进行处理。
通过对输出结果的检查,我们确认了数据的准确性和完整性。
实验总结通过这个实验,我们深入了解了串口通信的原理和应用。
以下是我们在实验中的一些总结和教训:1.注意配置参数的一致性:在串口通信中,发送端和接收端的串口配置参数必须一致,包括波特率、数据位、停止位和校验位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四 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 」o gic_1164.all;end uart; architecture behav of uart isen tity uart isport(clk : in std_logic; rst_n: in std 」o gic--系统时钟 --复位信号rs232_rx: in std 」o gic rs232_tx: out std 」o gic--RS232接收数据信号; --RS232发送数据信号;);use ieee.std_logic_ un sig ned.all;comp onent uart_rx port(clk : in std_logic; rst_n: instd_logic; rs232_rx: in std_logic; clk_bps: in std_logic;高电平为接收数据的采样点bps_start:out std 」o gic; 波特率时钟启动置位rx_data: out std 」ogic_vector(7 downto 0);--接收数据寄存器,保存直至下一个数据来到bps_start:out std 」o gic; 据后,波特率时钟启动置位 一 一rx_data: in std 」o gic_vector(7 dow nto 0); --接收数据寄存器,保存直至下一个数据来到rx_in t: in std 」ogic --接收数据中断信号,接收数据期间时钟为高电平,一传送给串口发送模块,使得串口正在进 行接收数据的时候,发送模块不工作,避免了一个完整的数据( 1位起始位、8 位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传 输出去);end comp onent;sig nal bps_start_1:std_logic; sig nal bps_start_2:std_logic; sig nal clk_bps_1:std_logic; sig nal clk_bps_2:std_logic;sig nal rx_data:std 」o gic_vector(7 dow nto 0); sig nal rx_in t:std_logic; begi nRX_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,--系统时钟 --复位信号--RS232接收数据信号--此时clk_bps 的--接收到数据后, rx_int: out std 」ogic 中断信号,接收数据期间时钟为高电平,传送给串口发送 end comp onent;comp onent speed_select port(clk : in std_logic; rst_n: in std_logic; clk_bps: out std_logic; 的高电平为接收或者发送数据位的中间采样点 一 bps_start:in std_logic后,波特率时钟启动信号置位);end comp onent;comp onent uart_tx port(clk : in std_logic;rst_n: in std_logic; rs232_tx: out std_logic; clk_bps: in std_logic;的高电平为接收数据的采样点一 一 --接收数据);--系统时钟--复位信号 --此时 clk_bps --接收数据--系统时钟 --复位信号--RS232接收数据信号--此时 clk_bps--接收到数rx_data=>rx_data, rx_in t=>rx_i nt厂一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_in t=>rx_i nt --接收数据中断信号,接收数据期间时钟为高电平,:专送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(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」o gic_1164.all; use ieee.std_logic_ un sig ned.all; en tity uart_rx is port(clk : in std_logic; rst_n: in std_logic; rs232_rx: instd_logic; clk_bps: in std_logic;为接收数据的采样点一bps_start:out std」o gic; 时钟启动置位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 issig nalsig nalsig nalsig nalsig nalsig nalsig nalsig nal 存器,保存直至下rs232_rx0: std_logic;rs232_rx1: std_logic;rs232_rx2: std」o gic;rs232_rx3: std_logic;n eg_rs232_rx:std」o gic;bps_start_r:std_logic;nu m:i nteger;rx_data_r:std」ogic_vector(7 downto 0);--串口接收数据奇」个数据到来beg inprocess(clk,rst_ n)beg inif (rst_n='0')the nrs232_rx0<='0';rs232_rx1<='0';rs232_rx2<='0';rs232_rx3<='0';elseif (ris in g_edge(clk)) the nrs232_rx0<=rs232_rx;--系统时钟--复位信号--RS232接收数据信号--此时clk_bps的高电平--接收到数据后,波特率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)andnot(rs232_rx0);end process;process(clk,rst_ n) beg inif (rst_n='0')the nbps_start_r<='0'; rx_in t<='0'; elseif (ris in g_edge(clk)) the n if(n eg_rs232_rx='1') the n --接收到串口数据线 rs232_rx的下降沿标志信号一—一bps_start_r<='1'; --启动串口准备数据接收 rx 」n t<='1';--接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信 bps_start_r<='0';--数据接收完毕,释放波特率启动rx 」n t<='0'; --接收数据中断信号关闭end if;end if; end if; end if;bps_start<=bps_start_r; end process;process(clk,rst_ n) beg inif (rst_n='0')the n rx_data_r<="00000000"; rx_data<="00000000"; num<=0; elseif (ris in g_edge(clk)) the n if(clk_bps='1')the n num<=nu m+1; case num is丿 111、when 1=>rx_data_r(0)v=rs232_rx;--锁存第 Obit when 2=>rx_data_r(1)<=rs232_rx;--锁存第 Obit when 3=>rx_data_r(2)v=rs232_rx;--锁存第 Obit when 4=>rx_data_r(3)v=rs232_rx;--锁存第 Obit when 5=>rx_data_r ⑷v=rs232_rx;--锁存第 Obit when 6=>rx_data_r(5)v=rs232_rx;--锁存第 Obit when 7=>rx_data_r(6)v=rs232_rx;--锁存第 Obit when 8=>rx_data_r(7)v=rs232_rx;--锁存第 Obit whe n 1O=>rx_data<=rx_data_r;whe n 11= >num <=15; when others=>null; end case; if(num=15) the n num<=0; end if; end if; end if;end if;end process; end behav;--------------------- 波特率控制模块 ----------------------------- library ieee;use ieee.std_logic_1164.all; use ieee.std 」o gic_arith.all;use ieee.std_logic_ un sig ned.all; en tity speed_select isport(clk : in std_logic; rst_n: in std_logic; clk_bps: outstd_logic; 接收或者发送数据位的中间采样点钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位 ); end speed_select;architecture behav of speed_select issignal cnt:std 」ogic_vector(12 downto 0); sig nal clk_bps_r:std_logic; con sta nt BPS_PARA:i nteger:=5207; con sta nt BPS_PARA_2:i nteger:=2603; beg inprocess(clk,rst_ n) beg inif (rst_n='O')the n--系统时钟--复位信号 --此时clk_bps 的高电平为 bps_start:in std_logic --接收数据后,波特率时cnt<="0000000000000";elseif (ris in g_edge(clk)) the nif((cnt=BPS_PARA)or(bps_start='0')) thencn t<="0000000000000";--波特率计数器清零elsecnt<=c nt+'1'; --波特率时钟计数启动end if;end if;end if;end process;process(clk,rst_ n)beg inif (rst_n='0')the nclk_bps_r<='0';elseif (ris in g_edge(clk)) the nif(cnt=BPS_PARA_2) the n clk_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」o gic_1164.all;use ieee.std_logic_ un sig ned.all;rx_int: in std 」o gic 收数据期间时钟为高电平,传送给串口发送模块, 时候,发送模块不工作,避免了一个完整的数据(位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去 );end uart_tx;architecture behav of uart_tx issig nal rx 」n t0: std 」o gic;sig nal rx_in t1: std 」o gic; sig nalrx 」n t2: std 」o gic;sig nal n eg_rx_i nt:std_logic; sig nal bps_start_r:std_logic; sig nal nu m:i nteger;sig nal tx_data:std_logic_vector(7 dow nto 0);--串口接收数据寄存器,保存直至下一个数据到来 beg inprocess(clk,rst_ n) beg inif (rst_n='O')the nrx_in t0<='0'; rx_in t1<='0';rx_in t2<='0'; elseif (ris in g_edge(clk)) the n rx_in t0<=rx_i nt; rx_in t1<=rx_i nt0; rx_int2<=rx_i nt1; end if; end if;n eg_rx_i nt <=no t(rx_i nt1)a nd (rx_i nt2); end process;process(clk,rst_n)en tity uart_tx isport(clk : in std_logic; rst_n: in std_logic; rs232_tx: outstd_logic; clk_bps: instd_logic; 为接收数据的采样点 一bps_start:out std_logic;时钟启动置位rx_data: in std 」o gic_vector(7 dow nto0); 直至下一个数据来到--系统时钟 --复位信号--RS232接收数据信号 --此时clk_bps 的高电平 --接收到数据后,波特率--接收数据寄存器,保存--接收数据中断信号,接使得串口正在进行接收数据的1位起始位、8位数据位、1beg inif (rst_n='O')thenbps_start_r<='O'; tx_data<="00000000"; elseif (ris in g_edge(clk)) the n if(n eg_rx_i nt='1') the n--接收到串口数据线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)beg inif (rst_n='0')the nrs232_tx<='1';num<=0;elseif (ris in g_edge(clk)) the nif(clk_bps='1')the nnum<=nu m+1;case num iswhe n 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⑷;--发送第5bitwhen 7=>rs232_tx<=tx_data(5);--发送第6bitwhen 8=>rs232_tx<=tx_data(6);--发送第7bitwhen 9=>rs232_tx<=tx_data(7);--发送第8bitwhe n 10=>rs232_tx<='1';whe n 11= >num <=15;when others=>null;end case; if(num=15) the n num<=0;end if;end if;end if;end if;end process;end behav;四、实验步骤1、建立新工程UART,选择芯片,型号为cyclone ii EP2C35F484C&2、建立源文件,输入程序代码。