实际单片机与虚拟单片机串口通信proteus仿真

合集下载

课程设计-超声波测距+实际 MSP430 单片机与 proteus 中虚拟 51 单片机串口通信仿真

课程设计-超声波测距+实际 MSP430 单片机与 proteus 中虚拟 51 单片机串口通信仿真

课题名称超声波测距+实际MSP430 单片机与proteus 中虚拟51 单片机串口通信仿真姓名学号年级专业指导老师完成日期2017年05 月27 日摘要随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的就是实现实际单片机与proteus 中的虚拟单片机进行串口通信,采用MSP430F149 单片机为控制核心、以单线数字温度传感器DS18B20 来完成温度信号的采集、温度以数宇的方式显示在LCD1602 液晶上,最终实现温度的采集、显示。

利用集成的超声波测距模块测出与障碍物之间的距离。

并且利用UART 串口通信将实时数据发送给 proteus 中的虚拟单片机,虚拟单片用的是 AT89C51 单片机。

51 单片机把接收到的数据用液晶模块显示出来,实现和实际单片机电路同步显示,并且设有报警电路,当距离小于5cm 时进行报警。

关键词:超声波测距、MSP430 单片机、LCD 液晶显示、proteus 仿真、AT89C51目录1. 绪论.....................................................................................................1.1. MSP430 单片机概述 (1)1.2. MSP430 的特点 (2)1.3. 课题研究的主要内容 (3)2. 系统总体方案设计.........................................................................................2.1. 控制系统的原理图 (4)2.2. 超声波测距的原理 (4)2.2.1. 超声波发生器 (5)2.2.2. 超声波测距原理 (5)2.2.3. 超声波测距误差分析 (6)2.2.3.1. 温度误差 (7)2.2.3.2. 时间误差 (7)2.3. 温度测量原理 (8)3. 硬件系统与软件系统设计...................................................................................3.1. 硬件部分 (8)3.1.1. MSP430F149 单片机 (8)3.1.1.1. MSP430F149 的组成 (9)3.1.1.2. MSP430F149 的定时器及转换模块 (9)3.1.2. 单线数字温度传感器DS18B20 (9)3.1.2.1. 温度传感器DS18B20 特点 (10)3.1.2.2. 温度传感器DS18B20 内部结构 (10)3.1.2.3. DS18B20 读/写时序图: (13)3.1.3. 超声波测距模块 (13)3.1.3.1. HC-SR04 超声波模块原理图 (13)3.1.3.2. 实物图: (14)3.1.3.3. 电气参数: (14)3.1.3.4. 超声波时序图: (15)3.1.4. 报警模块 (15)3.1.5. 液晶显示模块 (16)3.2. 软件部分 (16)3.2.1. 主处理的流程图 (16)3.2.2. 温度采集DS18B20 模块 (18)3.2.3. 超声波传感器模块 (19)3.2.4. 报警模块 (20)4. Proteus 中虚拟单片机的仿真系统设计..........................................................................4.1. Proteus 简介 (20)4.2. ISISI 编辑器介绍 (21)4.3. Proteus 中虚拟单片机仿真图搭建 (23)4.3.1. 51 单片机最小系统电路 (23)4.3.2. proteus 中1602 液晶电路 (23)4.3.3. 虚拟终端以及串口电路 (24)4.4. 在Proteus 中画出完整的电路图 (25)4.5. 配置Proteus 中的虚拟串口 (25)4.5.1. 虚拟串口配置 (25)4.5.2. 配置虚拟终端 (26)4.6. 在µVision4 IDE 中编写51 代码 (26)4.6.1. Keil 中写代码 (26)4.6.2. .HEX 文件添加到虚拟51 单片机 (27)4.7. Proteus 仿真 (27)5. 电路调试及误差分析 (28)5.1. 电路的调试 (28)5.2. 系统的误差分析 (28)5.2.1. 声速引起的误差 (28)5.2.2. 单片机时间分辨率的影响 (29)6. 总结 (30)7. 附录 (31)7.1. 附录1-----本课题的实物图: (31)7.2. 附录2-----实际单片机(430)程序代码: (32)7.3. 附录3-----proteus 虚拟单片机(51)程序代码: (38)8. 参考文献 (42)1. 绪论本章简要介绍单片机技术在工业上的主要应用,MSP430 单片机的概述及特点,以及课题研究的主要内容。

Proteus仿真串行通信和虚拟终端的连接测试

Proteus仿真串行通信和虚拟终端的连接测试

Proteus仿真串行通信和虚拟终端的连接测试说明:1.我用了四款软件(下面提供下载链接,以下都是破解版软件,无需序列号)Proteus 7.5 sp3(电子仿真软件)虚拟串口程序串口调试助手keil2编译软件正文目前我会的有3种1.单片机+虚拟终端(作为串口输入设备)+串口2.单片机+虚拟终端(作为串口输入设备)+MAX232+串口3.单片机+串口+虚拟串口程序(virtual serial port)+串口调试助手4.单片机+MAX232+串口+虚拟串口程序(virtual serial port)+串口调试助手(这个不会,主要是不知道该怎么在Proteus中连线,理论上方法4和3的连线方法是没有太大差别的,我也不知道哪里设置不对,一直没弄成功,问题出在加入了MAX232后)方法1和2的区别不大,只是在串口和单片机中间多接个MAX232,因为是仿真软件,所以串口有和没有MAX232的仿真结果是一样的,就是细节上的设置不同方法1连线如下:方法2连线图如下:方法1和方法2的区别在PCT(虚拟终端输入串口的PCT计算机发送端)的一个设置参数不同,(当波特率改变的时候虚拟终端里面的波特率设置也要改变)方法1设置如下方法2设置如下不同的地方在PCT,串口这边的虚拟终端的RX/TX Polarity的设置不同,当在单片机和串口间没接入MAX232,该项设置为normal,当在其间接入了MAX232该项设置为inverted。

综上所述:方法1和方法2其实是1类方法,共同点是单片机的发送端(TXD)与串口接收端(RXD)相连,单片机接收端(RXD)与串口发送端(TXD)相连。

(这种连接是交叉连接)方法3和方法4区别不大,只是在串口和单片机之间多加入了MAX232,其实实物连接时是要加入MAX232的,但是加入MAX232的方法4用Proteus仿真不出来,就仿真效果而言方法3和方法4是一样的。

方法3连线图如下:方法4连线图如下:Proteus串口设置如下图:串口调试助手设置如下:虚拟串口程序界面如下:单片机虚拟终端的选项作用如下:如果输入的是ASCII码,那么就不要勾选Hex Display mode如果输入的是16进制,那么就要勾选Hex Display modeclear screen 是清屏echo typed characters 是当你在虚拟终端窗口输入字符时,输入的字符显示在虚拟中断窗口内。

单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手的仿真)

单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手的仿真)

单片机与PC通信-(proteus 与虚拟串口驱动软件以及串口调试助手的仿真)实验:单片机与PC通信(proteus与虚拟串口驱动软件以及串口调试助手的仿真)实现内容:设置单片机串行口为工作方式一,波特率为9600。

PC从串口发送字符1、2、3或4到单片机串行口,单片机接收到该字符后,首先在P2 口显示字符,然后根据字符不同返回不同字符串,具体要求如下表:表:单片机与PC通信内容一、proteus仿真图:(此proteUS 仿真图可 免费下载, 下载网址:)1、图1.12、注意:(1)51单片机属性的时钟频率(clock frequency )必为11.0592mhz , 否则无法仿真。

请按下图设置AT89SC52PJXJ/M.ID R9.1/&C1 P92/AC2 F*1 V*ti3 F-J 對 Mil PJ.5/WLI5 r.-j--p. Rjjr«i7 P2CU^ 就.sg P2JA1Q 咱•佃H E7SJA1J F2.E1A14 F3皿旳pi.omB F3?JMT0~RZM S T TF5TFlEHI卩卫 Pl 陀曲丽■图1.23、在仿真图中P1即(元件名称:COMPIN模块为集成电平转换的串行通信接口(如下图)(1)图1.3(2)设置参数如下图1.44、虚拟串口驱动设置 在右侧选择端口一: “COM ”端口二:“COM4,然后按“添加端口” ,此时左侧的Virtual ports 下出现:工 Virtual portsS <2 CQM3 [960Q'N^-l]* COM4 [96OO-N-E-11图1.5表示添加了 COM3 COM4^对虚拟串行口,且 已连接,故我们把单片机和PC 选择COM 和 COM4 (如图1.4中的physical port 选项:COM4图 中:串口号COM )。

接着再在右侧选择 端口一:“COM ”端口二:“COM2则为下图,劃E 雷口驱訟6.9 by 耽III 汉化Manage port 占 Port access list 匚 u stem pin outMPD 肓餉魏幢任何你想使用的端口号的虛拟端口 .所以你可以不 受端口吕;3躯的限制1旦呈诒诵■呆I'」芒腔垮支持这些端口号p no port selected no port 眸血“cf使用精确的遁特率模报 综路中斷重新皈夏连接所有虎拟端口捋质全部刪像请 确认所有端口业时都处于关闭 状态。

单片机用proteus仿真双机串口通信总结体会

单片机用proteus仿真双机串口通信总结体会

单片机用 Proteus 仿真双机串口通信总结体会本文介绍了使用 Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。

下面是本店铺为大家精心编写的5篇《单片机用 Proteus 仿真双机串口通信总结体会》,供大家借鉴与参考,希望对大家有所帮助。

《单片机用 Proteus 仿真双机串口通信总结体会》篇1引言在单片机应用中,串口通信是一种重要的通信方式,它具有传输速率快、传输距离远、抗干扰能力强等优点。

Proteus 仿真软件是一种功能强大的电子电路仿真工具,可以用来模拟单片机串口通信的整个过程,为学习和实践提供方便。

本文将详细介绍使用Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。

实验过程1. 硬件电路设计首先,我们需要设计一个简单的单片机硬件电路,包括电源电路、串口通信电路和 LED 显示电路。

电源电路可以使用电池或者稳压器来提供稳定的电压,串口通信电路可以使用 Proteus 提供的串口助手软件进行设计和调试,LED 显示电路可以使用 Proteus 提供的 LED 助手软件进行设计和调试。

2. 软件程序设计在软件程序设计中,我们需要编写两个程序:主程序和串口通信程序。

主程序主要负责初始化串口通信电路和 LED 显示电路,并将控制权转移到串口通信程序。

串口通信程序主要负责接收和发送数据,通过串口助手软件可以方便地进行调试和测试。

3. 仿真测试在仿真测试中,我们可以使用 Proteus 提供的仿真工具进行测试。

首先,我们需要将硬件电路和软件程序导入 Proteus 仿真软件中,并进行电路连接和程序编译。

然后,我们可以通过串口助手软件进行数据发送和接收,并通过 LED 显示电路进行数据展示。

总结体会通过使用 Proteus 仿真软件进行单片机双机串口通信实验,我们可以得出以下总结体会:1. Proteus 仿真软件是一种非常强大的电子电路仿真工具,可以用来模拟各种电路和通信方式。

基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串

基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串

先上图:实验程序:/********************************************************************************* * 【编写时间】: 2016年6月12日* 【作者】:小瓶子* 【实验平台】: Proteus 7* 【内部晶振】: 11.0592mhz* 【主控芯片】: STC89C51* 【编译环境】: Keil μVisio4* 【程序功能】:利用虚拟中断实现串口数据的发送和接收**********************************************************************************/#include <reg51.h>#define uint unsigned int#define uchar unsigned char//毫秒级延时函数void delay(uint x){uchar i;while(x--){for(i = 0;i < 120;i++);}}//字符发送函数void putchar(uchar data1){SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成TI = 0; //发送中断标志请0}//字符串发送函数void putstring(uchar *dat){while(*dat != '\0') //判断字符串是否发送完毕{putchar(*dat); //发送单个字符dat++; //字符地址加1,指向先下一个字符 delay(5);}}//串口初始化函数void serial_init(){uchar c = 0;SCON = 0x50; //串口方式1 ,允许接收TMOD = 0x20; //T1工作于方式2PCON = 0x00; //波特率不倍增TL1 = 0xfd;TH1 = 0xfd; // 波特率设置为9600EA = 1; //开总中断ES = 1; //开串口接收中断}//主函数void main(){serial_init(); //串口初始化TR1 = 1; //定时器开启delay(200);putstring("Receiving from 8051...\r\n"); //串口向终端发送字符串,结尾处回车换行putstring("----------------------\r\n");delay(50);while(1);}//串口中断void revdata() interrupt 4{uchar temp;if(RI == 0) return; //如果没有接收中断标志,退出中断ES = 0; //关闭串口中断RI = 0; //清串行中断标志位temp = SBUF; //接收缓冲器中的字符putchar(temp); //将接收的字符发送出去ES = 1; //开启串口中断}仿真:。

单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手地仿真)

单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手地仿真)

实验:单片机与PC通信(proteus与虚拟串口驱动软件以及串口调试助手的仿真)实现内容:设置单片机串行口为工作方式一,波特率为9600。

PC从串口发送字符1、2、3或4到单片机串行口,单片机接收到该字符后,首先在P2口显示字符,然后根据字符不同返回不同字符串,具体要求如下表:一、proteus仿真图:(此proteus仿真图可免费下载,下载网址:)1、图1.12、注意:(1)51单片机属性的时钟频率(clock frequency)必为11.0592mhz,否则无法仿真。

请按下图设置AT89SC52图1.23、在仿真图中P1即(元件名称:COMPIN)模块为集成电平转换的串行通信接口(如下图)(1)图1.3(2)设置参数如下图1.44、虚拟串口驱动设置在右侧选择端口一:“COM3”端口二:“COM4”,然后按“添加端口”,此时左侧的Virtual ports下出现:图1.5表示添加了COM3,COM4一对虚拟串行口,且已连接,故我们把单片机和PC选择COM3和COM4。

(如图1.4中的physical port选项:COM4;图中:串口号COM3)。

接着再在右侧选择端口一:“COM1”端口二:“COM2”,则为下图,图1.6虚拟串口驱动设置完毕5、串口调试助手设置如图1.7图1.76、(1)将“程序”在Keil软件中编译生成“HEX”文件,加载到仿真图中的AT89C52中,启动仿真图1.9(2)按下图1.7中串口调试助手的“连接”按钮,在串口调试助手的”发送窗口”,依次输入1、2、3、4和5,发送后可以看到单片机返回的字符串一次显示在接收窗口。

如下图所示实验程序#include <reg52.h>#include <stdio.h>#include <intrins.h>#include <Absacc.h>#include <string.h>#include <ctype.h>#define byte unsigned char#define uchar unsigned char#define word unsigned int#define uint unsigned int#define ulong unsigned long#define BYTE unsigned char#define WORD unsigned int#define TRUE 1#define FALSE 0void time(unsigned int ucMs);void initUart(void);void sendString(uchar *ucString);void main(void){time(1);initUart();IE=0x90;while(TRUE){}}void initUart(void){SCON =0x50; //选择串口工作方式,打开接收允许RCAP2H=(65536-(3456/96))>>8;RCAP2L=(65536-(3456/96))%256;T2CON=0x34;//启动定时器T1}void serial0_int(void) interrupt 4{uchar rChar;uchar code str1[]="What do you plan to do this Friday?";uchar code str2[]="I plan to go to the concert.";uchar code str3[]="What are you doing next week?";uchar code str4[]="I'm think of going to my grandma's.";uchar code strdefault[]="Please select a character '1','2','3'or '4'!";EA=0;RI=0;rChar=SBUF;P2=rChar;switch(rChar){case '1':SBUF='1';while(TI==0) {} TI=0;SBUF=':';while(TI==0) {} TI=0;sendString(str1);break;case '2':SBUF='2';while(TI==0) {} TI=0;SBUF=':';while(TI==0) {} TI=0;sendString(str2);break;case '3':SBUF='3';while(TI==0) {} TI=0;SBUF=':';while(TI==0) {} TI=0;sendString(str3);break;case '4':SBUF='4';while(TI==0) {} TI=0;SBUF=':';while(TI==0) {} TI=0;sendString(str4);break;default:SBUF='d';while(TI==0) {} TI=0;SBUF=':';while(TI==0) {} TI=0;sendString(strdefault);break;}EA=1;}void sendString(uchar *ucString){uchar i,stringLength=strlen(ucString);REN=0;for(i=0;i<stringLength;i++){SBUF=ucString[i];while(TI==0); TI=0;}SBUF=0x0d;while(TI==0) ; TI=0;SBUF=0x0a;while(TI==0) ; TI=0;SBUF=0x0a;while(TI==0) ; TI=0;REN=1;}void delay_5us(void){_nop_() ;_nop_() ;}void delay_50us(void){unsigned char i;for(i=0;i<4;i++);{delay_5us();}}void delay_100us(void){delay_50us();delay_50us();}void time(unsigned int ucMs) {unsigned char j;while(ucMs>0){for(j=0;j<10;j++);delay_100us();ucMs--;}}。

(完整word版)proteus串口仿真

(完整word版)proteus串口仿真

利用“串口调试助手”等软件调试 PROTEUS 环境中 51单片机的串行通信在前面的博文“利用 PROTEUS 软件调试串口通信最简单实用的方法”中,做而论道介绍了利用 Virtual Terminal(虚拟终端)调试串口通信的方法。

但是 Virtual Terminal 有一定的局限性,只是适合于调试使用键盘输入少量数据的情况。

如果是需要利用 PC 机器的串行口,和其它的软件进行串行通信,Virtual Terminal 就办不到了。

下面,做而论道将介绍两种另外两种仿真调试串口通信的方法。

1、利用 COMPIM 组件在 PROTEUS 软件中,可以找到一个 COMPIM 组件,它的图形、以及默认属性可见下图:把 COMPIM 放在仿真电路图中,当仿真运行起来之后,送到 COMPIM 3 号引脚的串行数据,将会通过 PC 机的 COM1 串行口输出,如果在 PC 机的 COM1 串行口外接一条电缆,可将串行数据送到其它的硬件设备上。

同样道理,其它的硬件设备送到 PC 机的 COM1 的串行数据,也会在 COMPIM 的2号引脚出现,送到仿真电路里面。

COMPIM 组件内部,自带 RS-232 和 TTL 的电平转换功能,因此不需要再使用电平转换芯片。

利用 COMPIM,就可以用一台 PC 机,仿真带有串行口的单片机系统,通过外接的电缆,和另外一台 PC 机进行全双工的串行通信。

十分轻松的就实现了对远程测量、控制系统进行仿真调试。

2、利用 Virtual Serial Port Driver 软件上述的调试方法,可以说是很完备的了,但是还是必须在两个串行口之间连接一条串行通信电缆。

为了省去这条电缆,就应该看看虚拟串口软件。

Virtual Serial Port Driver 软件可以为 PC 机增加一些两两连接的虚拟串行口。

该软件运行起来如下图所示:在图中可以看到,COM1、COM2 就是“一对连接好虚拟串行口”;PC 机原来就有的实际的串行口,称为物理串行口,为 COM3。

基于PROTEUS的单片机串口通信的实例设计与仿真

基于PROTEUS的单片机串口通信的实例设计与仿真

【 关键 词】rtu 软件 ; Poes 串口通信 ; 仿真

引言
Viul e a P r r a S r l ot XP软 件 是 一 种 高级 的 配置 工 具 。用 于模 拟 RS 3 t i s 22
串 口通 信 , 以使 用 它 为 应 用 程 序 提 供 虚 拟 串 口 . 个 虚 拟 串 口的 功 可 这 Poe s 件 是 由英 国 L bC ne lcrnc 司 开 发 的 E A 工 rtu 软 a etr et i E o s公 D 能 就像 标 准 的硬 件 串 口一 样 , 研 发 人 员 提 供便 利 。 为 具 软件 , 已有 近 2 0年 的 历 史 , 全 球 已得 到广 泛 使 用 。 它不 仅 是模 拟 在 使 用 软件 V r a ei o sX , 开 软 件 后 . 图 2所 示 .OM3 iu l r l r P 打 t S aPt 如 C 电 路 、 字 电路 、 数 混 合 电路 的 设 计 与 仿 真平 台, 是 目前 最 先进 的 数 模, 也 是 电脑 上 实 际 的 物 理 串 口 , 击 “ d ar可 立 即 添加 一 对 虚 拟 串 口 单 A dp i ” 实 现嵌 入 式 系 统 在 计 算 机 上 完 成从 原 理 图设 计 、代 码调 试 与仿 真 、 系 C M1和 C M2 这 样 就 连 接 好 一对 虚 拟 串 口 。 O O , 统 测 试 与 功 能 验 证 到 形 成 P B的完 整 的设 计 、 真 和 研 发 的 平 台 。在 C 仿 22 上位 机 软 件 设 置 . 缺 乏 硬 件 的情 况 下 , 是 一 款 非 常 实用 的仿 真 软 件 , 仿 真 的原 理 图 经 这 其 P C与 单 片 机 的通 信 常 用 V B或 V 中的 MS o C C mm控 件 编写 . 设 本 验证后可直接应用到现实中。 计 使 用 “ 口调 试 助 手 ” 实 现 P 对 Poe s 联 系媒 介 。 如 图 3所 串 来 C rtu 的 目前 , 多 高 校 已引 入 这 套 软 件 , 为理 论 教 学 和 实 践 教 学 的 必 很 作 示 , 类 软件 的使 用 一 定 要 注 意 串 口通 信 的 参 数 的 设 置 ( 串 口 , 特 该 如 波 要补充 , 践证明效果很好 ; 且 , 实 而 在一 些 像 海 尔 等知 名 公 司也 已将 它 率 , 据位 , 验 位 , 止 位 )它 们 必 须 与 单 片 机 程 序 总 的 串 E设 置 相 数 校 停 , l 作 为仿 真 和 研 发 平 台 , 大 提 高 了 工作 效 率 , 短 了研 发 周 期 。 大 缩 对 应 。串 口调 试 助 手 则 可 以 真 实 的模 拟 上 位 机 与 单 片 机 进 行 通 信 。正 本 文 通 过 实 例 , A 8 C 1 片 机 为 核 心 , 计 了一 个 P 以 T9 5 单 设 c与 单 确 地使 用 所 有 的信 号 线 和 模 拟 波 特 率 的 工作 , 以 和 使 用 真 实 串 口一 可 片机 的进 行 串 口通信 的 功 能 , 详 细 说 明 了 在 P O E 并 R T US平 台 下 进 行 样 传输 文 件 、 据 。 数 串 口使 用 和 调 试 的 基 本 方 法 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国民航大学单片机课程设计报告题目:实际单片机与proteus中虚拟单片机串口通信仿真设计时间:2012年 9 月 13 日至 9 月 20 日学院:航空自动化学院专业名称:自动化学号:**********名:***指导老师:***目录1绪论 (3)2设计内容及要求 (3)3串口通信原理 (3)4设计思路 (4)5设计框图 (4)6硬件实现 (5)7电路设计 (7)7.1硬件设计 (7)7.2软件配置 (8)8程序设计 (12)8.1设计思路 (12)8.2硬件程序 (12)8.3虚拟单片机程序............................. 错误!未定义书签。

9 PROTEUS仿真..................................... 错误!未定义书签。

10总结............................................ 错误!未定义书签。

参考文献. (26)实际单片机与proteus中虚拟单片机串口通信仿真1绪论单片机与单片机或单片机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。

由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。

在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯,本课程设计则采用串行通信的方式进行proteus仿真。

2设计内容及要求采用串行通讯的方式,用实际的单片机读取超声波测距模块的数据,然后通过串口与proteus中的虚拟单片机进行通信,将超声波测得的数据通过串口实时发送给proteus中的单片机,虚拟单片机将接收到的数据实时用lcd1602在proteus中仿真显示。

设计中用到二个1602液晶屏,一个虚拟终端,实时监测发送与接受的数据,用来验证通信的数据是否正确。

设计要求在测距周期尽可能短的情况下,同时保证数据传输误码率在0.2%以下。

3串口通信原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型的串口用于ASCII码字符的传输。

通信使用3根线完成:(1)地线,(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的波特率为14400,28800和36600。

波特率可以远远大于这些值,但是波特率和距离成反比。

高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。

如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。

扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。

每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,停止位:用于表示单个包的最后一位。

典型的值为1,1.5和2位。

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

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

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

d,奇偶校验位:在串口通信中一种简单的检错方式。

有四种检错方式:偶、奇、高和低。

当然没有校验位也是可以的。

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。

如果是奇校验,校验位位1,这样就有3个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。

这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

4设计思路利用硬件STC单片机驱动超声波测距模块与液晶屏,将测得的数据在液晶屏上显示,(监测测量数据的正确性)。

另一方面通过串口将测得的数据发送给proteus中虚拟的单片机,虚拟单片机与实际单片机通过proteus中的虚拟串口(COMPIM)相连,虚拟串口将接收到的数据用proteus中的虚拟终端(VIRTUAL TERMINAL)显示(用来监测USB串口发送的数据是否无误),虚拟串口与虚拟单片机相连,将收到的数据发送给单片机,单片机通过lcd1602在proteus中仿真显示(进一步校验虚拟单片机收到的数据是否无误),通过比对三个显示装置中的数据,可以观察数据通信是否无误,从而进一步通过硬件与软件调试达到设计要求。

5设计框图6硬件实现6.1 STC90C516RD+6.2 Lcd16026.3 超声波模块6.49针串口引脚号缩写英文全称功能说明1DCD Data Carrier Detection数据载波检测2RXD Receive Data接收数据3TXD Transmit Data发送数据4DTR Data Terminal Ready数据终端准备5GND System Ground信号地6DSR Data Set Ready数据设备准备好7RTS Request to Send请求发送8CTS Clear to Send清除发送9RI Ring Indicator振铃指示九针串口引脚功能7电路设计7.1硬件设计将lcd1602液晶的数据端口接到单片机的P0口,RW接P2^5,使能端E接P2^7,RS接P2^6;超声波模块RX端接P1^0,TX端接P1^1,所有硬件电路全部5V电压供电,然后通过USB串口数据线连接到电脑。

7.2软件配置1 首先安装好串口驱动,需根据自己的硬件模块选择驱动安装。

我的是STC官方下载软件STC_ISP。

如下图所示2 在proteus中画出如下电路图,所需主要元件分别为:80C51COMPIMLM016LVTERM3 配置proteus中虚拟串口,实现通信。

在proteus中点击虚拟串口,弹出如下对话框,物理端口与STC_ISP中的串口必须保证一致,波特率都是2400,须与程序中设置的波特率相同,否则无法通信或者出现乱码,这里是能否通信关键所在,一定要配置好。

其他参数选择默认就可以了。

4 配置虚拟终端在proteus中点击虚拟终端,弹出如下对话框,进行相关配置。

因为是监视虚拟串口发给单片机的数据所以只需将波特率配置成2400,与虚拟串口波特率保持一致即可,其他参数选择默认值。

8程序设计8.1设计思路硬件电路程序关键在于数据发送程序的设计,同时也要注意超声波测距模块的测距频率与发送程序的波特率,只有合理设置才能确保数据正确发送。

虚拟单片机接收程序应该保证将每一次发送的数据都在lcd上准确显示,不丢数据,无误码,基于这些要求,经过反复调试,最后将超声波测距周期设定为250ms(超声波测距模块测距范围2~450cm,精度两位小数),即串口数据发送周期为250ms,lcd显示数据则保留两位小数,串口数据发送波特率设为2400,理论上可以保证数据传输误码率在0.2%以下。

基于串口通信每一帧只能发送一个字符,为了将测得的数据在proteus中正确显示,因此在每一次发送数据后面加上“CM”作为数据发送的结束标志,接收方采用串行中断的方式,通过检测字符‘M’来判断一次发送数据是否结束,并将数据保存到缓存数组中,然后在lcd上显示,经过仿真验证,可以得到很好的仿真效果,达到了测距周期尽可能短同时又保证了数据传输准确性的要求。

8.2硬件程序#include <reg51.h>#include <intrins.h>#include <stdio.h>#include <string.h>#define DataPort P0#define Busy 0x80#define uchar unsigned char#define uint unsigned intuchar Xpos=0;uchar Ypos=0;float i=0;sbit RS = P2^6;sbit RW = P2^5;sbit E = P2^7;sbit RX=P1^0;sbit TX=P1^1;void UART_init (void){TMOD = 0x21; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置TR1 = 1; //定时器启动}void UART_T (unsigned char UART_data){ //定义串口发送数据变量SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)}void UART_TC (unsigned char *str){while(*str != '\0'){UART_T(*str);*str++;}*str = 0;}void Delay_ms(unsigned int i){unsigned int j;for(;i>0;i--)for(j=0;j<600;j++){;}}void delay_50ms(uchar t){int j;for(;t>0;t--)for(j=6245;j>0;j--);}void Conut(void){float time=0;time= (TH0*256+TL0);TH0=0;TL0=0;i=(time*1.7)/100; //算出来是cM}void StartModule() //启动模块{TX=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}void CheckBusy(void) // 读忙状态函数检测忙状态{DataPort=0xff;RS=0;RW=1;_nop_();E=1;_nop_();_nop_();while(DataPort & Busy);E=0;}void WriteIR(uchar CMD,uchar AttribC) // 向lcd写入命令字符{if(AttribC)CheckBusy();RS=0;RW=0;_nop_();DataPort=CMD;_nop_();E=1;_nop_();_nop_();E=0;}void WriteDDR(char c) //在当前光标位置显示一个字符{CheckBusy();RS=1;RW=0;_nop_();DataPort=c;_nop_();E=1;_nop_();_nop_();E=0;}void LcdPos(uchar Xpos,uchar Ypos) // 光标定位函数{uchar tmp;Xpos&=0x0f;Ypos&=0x01;tmp=Xpos;if(Ypos==1)tmp|=0xc0;tmp|=0x80;WriteIR(tmp,0);}void LcdReset(void) //初始化函数{WriteIR(0x38,0);WriteIR(0x38,1);WriteIR(0x08,1);WriteIR(0x01,1);WriteIR(0x06,1);WriteIR(0x0f,1);Delay_ms(5); //延时等待复位}void WriteChar(uchar Xpos,uchar Ypos,uchar c) //在指定行列显示字符函数{LcdPos(Xpos,Ypos);WriteDDR(c);}//在指定行列显示字符串函数void WriteString(uchar Xpos,uchar Ypos,uchar s[]) // Xpos列(0~15)Ypos 行(0,1)s[] 要显示的字符串{uchar p=0;for(;;){WriteChar(Xpos,Ypos,s[p]);p++;if(s[p]==0)break;if(++Xpos>15){Xpos=0;Ypos^=1;}}}void main(void){uchar s[10]="0";LcdReset();UART_init ();while(1){UART_TC (s);delay_50ms(5) ;StartModule();TH0=0;TL0=0;while(!RX);TR0=1;while(RX);TR0=0;Conut();sprintf (s,"%6.2f CM", i);WriteString(2,0,s);}}8.3虚拟单片机程序#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DataPort P1#define Busy 0x80uchar Receive_Buffer[20];uchar i=0;uchar Xpos=0;uchar Ypos=0;sbit RS = P2^6;sbit RW = P2^5;sbit E = P2^7;void Delay_ms(unsigned int i){unsigned int j;for(;i>0;i--)for(j=0;j<600;j++){;}}void CheckBusy(void) // 读忙状态函数检测忙状态{DataPort=0xff;RS=0;RW=1;_nop_();Delay_ms(5); ////////////////////////////////////////////// E=1;_nop_();_nop_();while(DataPort & Busy);E=0;}void WriteIR(uchar CMD,uchar AttribC) // 向lcd写入命令字符{if(AttribC)CheckBusy();RS=0;RW=0;_nop_();DataPort=CMD;_nop_();E=1;_nop_();_nop_();E=0;}void WriteDDR(char c) //在当前光标位置显示一个字符{CheckBusy();RS=1;RW=0;_nop_();DataPort=c;_nop_();E=1;_nop_();_nop_();E=0;}void LcdPos(uchar Xpos,uchar Ypos) // 光标定位函数{uchar tmp;Xpos&=0x0f;Ypos&=0x01;tmp=Xpos;if(Ypos==1)tmp|=0xc0;tmp|=0x80;WriteIR(tmp,0);}void LcdReset(void) //初始化函数{WriteIR(0x38,0);WriteIR(0x38,1);WriteIR(0x08,1);WriteIR(0x01,1);WriteIR(0x06,1);WriteIR(0x0f,1);Delay_ms(25); //延时等待复位}void WriteChar(uchar Xpos,uchar Ypos,uchar c) //在指定行列显示字符函数{LcdPos(Xpos,Ypos);WriteDDR(c);}//在指定行列显示字符串函数void WriteString(uchar Xpos,uchar Ypos,uchar s[]) // Xpos列(0~15)Ypos 行(0,1)s[] 要显示的字符串{uchar p=0;for(;;){WriteChar(Xpos,Ypos,s[p]);p++;if(s[p]==0)break;if(++Xpos>15){Xpos=0;Ypos^=1;}}}void delay_50ms(uchar t){int j;for(;t>0;t--)for(j=6245;j>0;j--);}void main(){LcdReset();SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2TL1=0xf3;EA=1;EX0=1;ES=1;TR1=1;while(1){while(Receive_Buffer[i-1]!='M');ES=0;WriteString(2,0,Receive_Buffer);ES=1;i=0;}}void Serial_INT() interrupt 4{ES=0;RI=0;Receive_Buffer[i++]=SBUF;ES=1;}9 proteus仿真proteus中打开仿真按钮,仿真结果如下,从仿真效果来看,通信结果还是比较令人满意的实物仿真示意图实物仿真示意图10 总结通过这次课设,我学会了用理论来指导实践的方法,理论指导的重要性;真实的体验到真正做科学研究的艰辛与一丝不苟。

相关文档
最新文档