实际单片机与虚拟单片机串口通信proteus仿真_第1页
实际单片机与虚拟单片机串口通信proteus仿真_第2页
实际单片机与虚拟单片机串口通信proteus仿真_第3页
实际单片机与虚拟单片机串口通信proteus仿真_第4页
实际单片机与虚拟单片机串口通信proteus仿真_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国民航大学中国民航大学 单片机课程设计报告 题目:实际单片机与 proteus 中虚拟单片机串口通信仿真 设计时间:2012 年 9 月 13 日至 9 月 20 日 学 院: 航空自动化学院 专业名称: 自动化 学 号: 姓 名: 赵起超 指导老师: 黄建宇 2 目 录 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 虚拟单片机程序 .18 9 PROTEUS 仿真 .23 10 总结 .25 参考文献.26 3 实际单片机与 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 位。如何设置取决于你想传送的信息。比如, 4 标准的 ASCII 码是 0127(7 位) 。扩展的 ASCII 码是 0255(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 设计框图 Lcd1602 VIRTUAL TERMINAL 5 COMPIM 超声波测距模 块 STC 单片机 6 硬件实现 6.1 STC90C516RD+ 6.2 Lcd1602 6.3 超声波模块 虚拟 80C51虚拟 Lcd1602 6 6.4 9 9 针串口针串口 引脚号缩写英文全称功能说明 1DCDData Carrier Detection数据载波检测 2RXDReceive Data接收数据 3TXDTransmit Data发送数据 4DTRData Terminal Ready数据终端准备 5GNDSystem Ground信号地 6DSRData Set Ready数据设备准备好 7RTSRequest to Send请求发送 8CTSClear to Send清除发送 9RIRing Indicator振铃指示 九针串口引脚功能 7 7 电路设计 7.1 硬件设计 将 lcd1602 液晶的数据端口接到单片机的 P0 口,RW 接 P25,使能端 E 接 P27,RS 接 P26;超声波模块 RX 端接 P10,TX 端接 P11,所有硬件电路全部 5V 电压供电,然后 通过 USB 串口数据线连接到电脑。 8 7.2 软件配置 1 首先安装好串口驱动,需根据自己的硬件模块选择驱动安装。我的是 STC 官方下载 软件 STC_ISP。如下图所示 9 2 在 proteus 中画出如下电路图,所需主要元件分别为: 80C51 COMPIM LM016L VTERM 10 3 配置 proteus 中虚拟串口,实现通信。 在 proteus 中点击虚拟串口,弹出如下对话框,物理端口与 STC_ISP 中的串口必须保 证一致,波特率都是 2400,须与程序中设置的波特率相同,否则无法通信或者出现乱码, 这里是能否通信关键所在,一定要配置好。其他参数选择默认就可以了。 11 4 配置虚拟终端 在 proteus 中点击虚拟终端,弹出如下对话框,进行相关配置。因为是监视虚拟串口 发给单片机的数据所以只需将波特率配置成 2400,与虚拟串口波特率保持一致即可,其 他参数选择默认值。 12 8 程序设计 8.1 设计思路 硬件电路程序关键在于数据发送程序的设计,同时也要注意超声波测距模块的测距 频率与发送程序的波特率,只有合理设置才能确保数据正确发送。虚拟单片机接收程序 应该保证将每一次发送的数据都在 lcd 上准确显示,不丢数据,无误码,基于这些要求, 经过反复调试,最后将超声波测距周期设定为 250ms(超声波测距模块测距范围 2450cm,精度两位小数) ,即串口数据发送周期为 250ms,lcd 显示数据则保留两位小数, 串口数据发送波特率设为 2400,理论上可以保证数据传输误码率在 0.2%以下。基于串口 通信每一帧只能发送一个字符,为了将测得的数据在 proteus 中正确显示,因此在每一次 发送数据后面加上“CM”作为数据发送的结束标志,接收方采用串行中断的方式,通过 检测字符M来判断一次发送数据是否结束,并将数据保存到缓存数组中,然后在 lcd 上显示,经过仿真验证,可以得到很好的仿真效果,达到了测距周期尽可能短同时又保 证了数据传输准确性的要求。 8.2 硬件程序 #include #include #include #include #define DataPort P0 #define Busy 0 x80 #define uchar unsigned char #define uint unsigned int uchar Xpos=0; uchar Ypos=0; float i=0; 13 sbit RS = P26; sbit RW = P25; sbit E = P27; sbit RX=P10; sbit TX=P11; void UART_init (void) TMOD = 0 x21; /定时器 T/C1 工作方式 2 SCON = 0 x50;/串口工作方式 1,允许串口接收(SCON = 0 x40 时禁止串口接 收) TH1 = 0 xF3;/定时器初值高 8 位设置 TL1 = 0 xF3;/定时器初值低 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(;i0;i-) for(j=0;j0;t-) for(j=6245;j0;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_(); 15 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; void CheckBusy(void) / 读忙状态函数 检测忙状态 DataPort=0 xff; RS=0; RW=1; _nop_(); E=1; _nop_(); _nop_(); while(DataPort 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) /在当前光标位置显示一个字符 16 CheckBusy(); RS=1; RW=0; _nop_(); DataPort=c; _nop_(); E=1; _nop_(); _nop_(); E=0; void LcdPos(uchar Xpos,uchar Ypos) / 光标定位函数 uchar tmp; Xpos Ypos tmp=Xpos; if(Ypos=1) tmp|=0 xc0; tmp|=0 x80; WriteIR(tmp,0); void LcdReset(void) /初始化函数 WriteIR(0 x38,0); WriteIR(0 x38,1); WriteIR(0 x08,1); WriteIR(0 x01,1); WriteIR(0 x06,1); WriteIR(0 x0f,1); Delay_ms(5); /延时等待复位 17 void WriteChar(uchar Xpos,uchar Ypos,uchar c) /在指定行列显示字符函 数 LcdPos(Xpos,Ypos); WriteDDR(c); /在指定行列显示字符串函数 void WriteString(uchar Xpos,uchar Ypos,uchar s)/ Xpos 列(015) Ypos 行 (0,1) s 要显示的字符串 uchar p=0; for(;) WriteChar(Xpos,Ypos,sp); p+; if(sp=0) break; if(+Xpos15) Xpos=0; Ypos=1; void main(void) uchar s10=0; LcdReset(); UART_init (); while(1) UART_TC (s); delay_50ms(5) ; 18 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 #include #define uchar unsigned char #define uint unsigned int #define DataPort P1 #define Busy 0 x80 uchar Receive_Buffer20; uchar i=0; uchar Xpos=0; uchar Ypos=0; sbit RS = P26; sbit RW = P25; sbit E = P27; void Delay_ms(unsigned int i) unsigned int j; 19 for(;i0;i-) for(j=0;j15) Xpos=0; Ypos=1; void delay_50ms(uchar t) int j; for(;t0;t-) for(j=6245;j0;j-) ; void main() 22 LcdReset(); SCON=0 x50;/串口模式 1,允许接收 TMOD=0 x20;/T1 工作模式 2 TH1=0 xf3; TL1=0 xf3; EA=1; EX0=1; ES=1; TR1=1; while(1) while(Receive_Bufferi-1!=M); ES=0; WriteString(2,0,Receive_Buffer); ES=1; i=0; void Serial_INT() interrupt 4 ES=0; RI=0; Receive_Bufferi+=SBUF; ES=1; 23 9 proteus 仿真 proteus 中打开仿真按钮,仿真结果如下,从仿真效果来看,通信结果还是比较令人满意 的 24 实物仿真示意图 25 26 实物仿真示意图 10 总结 通过这次课设,我学会了用理论来指导实践的方法,理论指导的重要性;真实的体 验到真正做科学研究的艰辛与一丝不苟。由于之前没有上过单片机课程也没用过超声波 传感器模块,一开始做这个单片机的串口通信比较迷茫,后来去图书馆借了很多书回来, 查找了很多资料,也在网上看了不少资料,对基于但单片机的串口通信有了初步的了解。 刚开始没想到实际单片机还可以控制 proteus 中的虚拟单片机并且进行通信,课程设 计也没想做这个,因为感觉对于自己来说太难了,没有那么多的知识储备,串口通信几 乎什么也不懂,在看 proteus 视频讲解的时候,里面有个例程讲到用 PC 机与单片机通过 虚拟串口通信仿真,后来突然想到既然 PC 机可以与虚拟单片机通信,那么是不是实际单 片机也可以通过 proteus 中的虚拟串口与虚拟单片机通信在 proteus 中仿真呢?于是去图书 馆查了一些相关的书,上网上也搜了一些资料,但并没有这方面的相关资料,大多是 PC 机与单片机串口通信在 proteus 中仿真,于是就想能不能完成实际单片机与虚拟单片机通 信仿真呢,理论上分析是可行的,很想将这个课程设计做出来,查了很多资料后开始自 己编程,刚开始一连好几天一点进展都没有,又查了很多资料发现自己的程序有些问题, 其中波特率是能否通信的关键所在,后来改进了一些程序,发现勉强可以通信了,但是 误码率很高,还是程序有问题,经

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论