1、PC机与单片机之间的串口通信分析 中山火炬职业技术学院毕业综合实践项目项目名称: PC机与单片机之间的串口通信分析 作 者: 刘世浩 学 号: 1102070104 系 别: 信息工程系 专 业: 通信技术 指导老师:雷英专业技术职务 单片机技术 摘 要单片机的串行口在单片机的日常教学实践和实际的工程技术中,应用十分普遍,因此在学习和设计时经常会对串口进行仿真调试。PC机和单片机的串口通信系统的调试一般需要通过一根串口连接线把带有软件的上位机 (PC机)和下位机(即单片机)连接起来进行,这种方法受实验条件的约束,而且比较烦琐。本文介绍一种用纯软件实现的仿真调试方法,全部过程都在一台电脑上通过软
2、件完成此次课设主题为单片机串口通信的应用之一。通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送数据帧,单片机系统接收后,发回通信协议要求的数据帧。可以用C+ Builder 语言制作的应用程序界面或串口调试助手字符串输入框中输入数字和字符来实现PC机与80C51系列单片机的串口通信。关键词:单片机 串口通信 仿真一、如何串行通信实现利用虚拟终端仿真单片机与PC机间的串行通信。PC机先发送从键盘输入的数据,单片机接收后回发给PC机。单片机同时将收到的3039H间的数据转换成09的数字显示,其他字符的数据直接显示为其ASCII码。 单片机和PC机进行通信时,
3、要求使用的波特率、传送的位数等相同。要能够进行数据传送也必须首先测试双方是否可以可靠通信。可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。这三个程序能运行通过,即可证明串行口工作正常。 PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。二、串行通信详细设计1.串行通信原理此次采用80C
4、51系列串口的方式1进行串行通信。串口结构如图1所示。图1方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图2所示。其中1位起始位,8位数据位,1位停止位。用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停
5、止位)进入RB8,并置RI=1,向CPU请求中断。用单片机内部定时器1即T1,使其工作在方式2,作为波特率发生器。 图2由于基于C+Builder的通信协议如图3所示,因此在程序编写时,需要在设置一个缓冲区来暂时存储单片机接收的来自PC机的一串字符串。前导符站号地址功能码数据长度数据结束符校验码#AAAAFFLLDDDDX图32.硬件设计51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。如图4所示。
6、图43.软件设计 如图4,PC机作为主机,80C51单片机作为从机(波特率为9600b/s)。通信程序采用C语言编程。这个程序的流程图如图5所示。程序见下。图5 3.1串口初始化 3.2从机(单片机)接收主机(PC机)发送来的数据帧 3.3从机发送数据帧给主机(1)解析从机发送的数据帧(程序见附录3的void send()部分)(2)从机发送数据帧3.4拓展部分 利用P1口连接的8个LED灯来显示C+Builder的十三个功能(见附录1)。三、实验调试1.硬件方面(1)烧写程序时,已经上电了,可软件还是一直提示上电,反复上电也不行后,最终通过反复换串口,反复烧写上电解决了。类似的还有只要进行烧
7、写,烧写软件界面就会消失,也是通过上述方法解决。(2)有时烧写时,忽略了相应的串口和波特率的选择甚至忘记打开串口助手的串口,发送数据后使得PC机的接收窗口中无显示。(3)有时发送数据后接收窗口无显示,经过复位后,问题得以解决。2.软件方面编程时遇到的主要问题有四个:(1)如何在C51单片机中存储接收的一个字符串数据帧。 如上所述,需要设置一个缓冲数组来接收主机发送的字符串数据帧。程序见3.2。(2)如何判断从机已经接收到完整的数据帧即结束接收。 设置一个标志位,如uchar finish。当finish=1时,表示接收结束。(3)如何解析从机发送的数据帧。对此,我前后采用了两种方法进行调试运行
8、(以下程序仅为“查询功能”模块的代码) 方案一: void send() if(host6=0) switch(host7) case 0:/查询地址 TI=0; SBUF=#; while(!TI); TI=0; SBUF=#; while(!TI); TI=0; SBUF=slave_addr0; while(!TI); TI=0; SBUF=slave_addr1; while(!TI); TI=0; SBUF=slave_addr2; while(!TI); TI=0; SBUF=slave_addr3; while(!TI); TI=0; SBUF=0; while(!TI); TI
9、=0; SBUF=0; while(!TI); TI=0; SBUF=0; while(!TI); TI=0; SBUF=4; while(!TI); TI=0; SBUF=slave_addr0; while(!TI); TI=0; SBUF=slave_addr1; while(!TI); TI=0; SBUF=slave_addr2; while(!TI); TI=0; SBUF=slave_addr3; while(!TI); TI=0; SBUF=; while(!TI); TI=0; SBUF=; while(!TI); TI=0; SBUF=x; while(!TI); brea
10、k;方案二:void send_109() if(count_109=13) if(buf_1093=0)&(buf_1093=0)&(buf_1094=0)&(buf_1095=0)&(buf_1098=0)&(buf_1099=0) if(buf_1096=0&buf_1097=0) count_109=0; load_109(#); load_109(&slave_addr_109); load_109(0004); load_109(&slave_addr_109); load_109(X); /查询地址方案一没有把通信协议表达完善,因此运行不成功。方案二解决了通信协议部分,运行成功,
11、而且代码长度较方案一更为简短。(4)如何放置功能拓展部分的程序。遵循着“中断中程序尽可能少些,一般放在主程序部分实现”的原则,对于我这次拓展的一点点功能(LED灯显示、报警蜂鸣器响,程序见3.4),我把标志位flag的设置放在了解析函数void send()部分,将LED显示放在了主函数中。起初我把蜂鸣器代码“RD=0”也放在解析函数中,效果失败,经过调试放在主函数中后,蜂鸣器响了起来。四、致谢借助先进的软件技术,来完成以往需要结合硬件电路来完成的串口通信的调试工作,效率高,成本低,性价比高,风险低。实践证明在教学和工程应用中根据具体情况适当选择、组合使用起到了很好的教学和应用效果。每次课设后
12、都会收获很多,这次也不例外。 平时编写代码的机会不多,因而这次课设显得比较棘手。鉴于已经系统地学过C语言以及单片机中常用C的编写,程序的整体架构不存在多大问题。因而主要问题在于各部分功能的实现。首先针对于这次课设,必须先了解主机与从机之间的通信协议,才能正确地编写代码实现上述所说的“解析从机发送的数据帧”部分的功能。这也是我在这次课设中的一个瓶颈。幸运的是,在同学的帮助下顺利地解决了这个问题。其次,对C语言数组、指针的娴熟运用,可以大大减短代码的编写,并能有效的解决数据帧的缓存发送问题。然后,就是程序整体架构的排列。这点在“运行调试”的软件方面的第四点提及。最后,对Keil、烧写软件、串口调试助手以及试验箱的熟练使用也是这次课设成功的重要因素。其间遇到的各种问题多亏有同学和老师的帮助,促成了我们高效率地完成了这次课设,多点研究,多点向同学或者老师请教,总会有收获的五、参考文献 丁海军等编著. 程序设计基础(C语言).北京:北京航空航天大学出版社,2009田希晖,薛亮儒编著.C51单片机技术教程.北京:人民邮电出版社,2007 友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!