PC机与单片机之间的串口通信分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中山火炬职业技术学院
毕业综合实践项目
项目名称:PC机与单片机之间的串口通信分析作者:刘世浩
学号:1102070104
系别:信息工程系
专业:通信技术
指导老师:雷英
专业技术职务单片机技术
摘要
单片机的串行口在单片机的日常教学实践和实际的工程技术中,应用十分普遍,因此在学习和设计时经常会对串口进行仿真调试。PC机和单片机的串口通信系统的调试一般需要通过一根串口连接线把带有软件的上位机(PC机)和下位机(即单片机)连接起来进行,这种方法受实验条件的约束,而且比较烦琐。本文介绍一种用纯软件实现的仿真调试方法,全部过程都在一台电脑上通过软件完成此次课设主题为单片机串口通信的应用之一。通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送数据帧,单片机系统接收后,发回通信协议要求的数据帧。可以用C++ Builder 语言制作的应用程序界面或串口调试助手字符串输入框中输入数字和字符来实现PC机与80C51系列单片机的串口通信。
关键词:单片机串口通信仿真
一、如何串行通信
实现利用虚拟终端仿真单片机与PC机间的串行通信。PC机先发送从键盘输入的数据,单片机接收后回发给PC机。单片机同时将收到的30~39H间的数据转换成0~9的数字显示,其他字符的数据直接显示为其ASCII码。单片机和PC机进行通信时,要求使用的波特率、传送的位数等相同。要能够进行数据传送也必须首先测试双方是否可以可靠通信。可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。这三个程序能运行通过,即可证明串行口工作正常。PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。
二、串行通信详细设计
1.串行通信原理
此次采用80C51系列串口的方式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位(停止位)进入RB8,并置RI=1,向CPU请求中断。用单片机内部定时器1即T1,使其工作在方式2,作为波特率发生器。
图2
由于基于C++Builder的通信协议如图3所示,因此在程序编写时,需要在
图3
2.硬件设计
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。如图4所示。
图4
3.软件设计
如图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)烧写程序时,已经上电了,可软件还是一直提示上电,反复上电也不行后,最终通过反复换串口,反复烧写上电解决了。类似的还有只要进行烧写,
烧写软件界面就会消失,也是通过上述方法解决。
(2)有时烧写时,忽略了相应的串口和波特率的选择甚至忘记打开串口助手的串口,发送数据后使得PC机的接收窗口中无显示。
(3)有时发送数据后接收窗口无显示,经过复位后,问题得以解决。
2.软件方面
编程时遇到的主要问题有四个:
(1)如何在C51单片机中存储接收的一个字符串数据帧。
如上所述,需要设置一个缓冲数组来接收主机发送的字符串数据帧。程序见3.2。
(2)如何判断从机已经接收到完整的数据帧即结束接收。
设置一个标志位,如uchar finish。当finish=1时,表示接收结束。
(3)如何解析从机发送的数据帧。
对此,我前后采用了两种方法进行调试运行(以下程序仅为“查询功能”模块的代码)
方案一:
void send()
{
if(host[6]=='0')
{
switch(host[7])
{
case '0'://查询地址
TI=0;
SBUF='#';
while(!TI);
TI=0;
SBUF='#';
while(!TI);
TI=0;
SBUF=slave_addr[0];
while(!TI);
TI=0;
SBUF=slave_addr[1];
while(!TI);
TI=0;
SBUF=slave_addr[2];
while(!TI);
TI=0; SBUF=slave_addr[3];
while(!TI);
TI=0;
SBUF='0';
while(!TI);
TI=0;
SBUF='0';
while(!TI);
TI=0;
SBUF='0';
while(!TI);
TI=0;
SBUF='4';
while(!TI);
TI=0;
SBUF=slave_addr[0];
while(!TI);
TI=0;
SBUF=slave_addr[1];
while(!TI);
TI=0; SBUF=slave_addr[2];