单片机与PC串口通讯Word文档下载推荐.doc
《单片机与PC串口通讯Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《单片机与PC串口通讯Word文档下载推荐.doc(20页珍藏版)》请在冰豆网上搜索。
第6章 致谢 -19-
参考文献 -19-
第1章需求分析
1.1课题名称
故障诊断数据采集通信系统设计与制作。
1.2任务
1、进行协议分析,完成单片机硬件电路原理图设计,在面包板上搭建电路。
2、测试上位机与单片机的通讯状态,实现实验要求部分的功能。
1.3要求
1、单片机能接收并识别上位机的查询请求。
2、单片机能够查询对应接口的状态,并返回接口状态给上位机。
3、能够通过按钮来控制单片机相应接口的状态,相应接口的状态通过LED灯的亮灭状态来表示。
1.4设计思想
根据实验要求,设计数据采集电路,选择合适的元器件,按照原理图,并根据各个元器件的特性以及接口电路结构形式,在面包板上搭接实际电路,搭接完毕之后对电路做优化设计,使电路尽量简洁。
通过与上位机的连接测试,来优化单片机程序的代码,使上位机和下位机能够很协调的工作。
软件编程:
使用C语言实现下位机的程序设计。
1.5课程设计环境
1.WindowsXP的PC机。
2.KeiluVision3集成开发环境。
3.串口调试助手
3.单片机最小系统开发板。
4.面包板和外围器件
5.万用表等辅助工具
1.6设备运行环境
由STC89C52单片机和面包板搭建的电路板。
1.7我在本实验中完成的任务
在和小组成员讨论之后,我们小组成员分工合作,我完成的工作是单片机串口的设置及接收上位机的串口数据,并对流数据进行分析。
第2章概要设计
2.1程序流程图
发送接口状态给上位机
开始
初始化串口设置
初始化控制口
串口数据分析
查询接口状态
是否有控制按键按下
检查串口中是否有数据
返回查询要求
确定按下的按钮
改变按钮对应接口状态
Y
N
2.2设计方法及原理
1、USB转串口模块将USB接口转化为串口后与单片机相连,用来实现单片机与PC机通过串口通讯。
2、初始化单片机串口的设置,使之与上位机的设置相符,具体为通信速率9600B/S,停止位1位,数据位8位。
3、本系统串口数据接收是采用的查询方式,单片机每次循环查询串口是否收到了数据。
4、上位机若连续查询接口状态2次都收不到回复,上位机可以判断与从机失去联系,所有接口状态都置为不正常状态
第3章详细设计
3.1电路原理
3.1.1STC89C52芯片
1、芯片引脚
51系列的DIP封装的单片机共有40个外部引脚,其中有P0,P1,P2,P3四组IO口,详细如右图。
2、芯片串口工作原理
1、波特率选择
波特率(BoudRate)就是在串口通信中每秒能够发送的位数(bits/second)。
MSC-51串行端口在四种工作模式下有不同的波特率计算方法。
下面以工作模式1为来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。
在此模式下波特率计算公式为:
波特率=(1+SMOD)*晶振频率/(384*(256-TH1))
其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;
TH1——定时器的重载值。
2、SBUF 数据缓冲寄存器
这是一个可以直接寻址的串行口专用寄存器。
SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。
CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器。
3、SCON 串行口控制寄存器
通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。
SCON就是51芯片的串行口控制寄存器。
它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。
51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。
它的各个位的具体定义如下:
(MSB)
(LSB)
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
串行口控制寄存器SCON
SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。
看表串行口工作模式设置。
模 式
功 能
波特率
同步移位寄存器
fosc/12
1
8位UART
可变
2
9位UART
fosc/32或fosc/64
3
3.2串口通信协议
通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
主机通过轮询方式访问从机,通过发送从机地址呼叫从机,地址相符合的从机把数据发送给主机
通信格式:
主机发送数据格式:
起始字节
地址字节
结束字节
$
从机地址
#
1个
主机每隔5秒钟查询一遍
从机发送数据格式:
校验为和校验
数据字节
校验字节
备注:
1、上述字节都表示只占一个字节空间,每次发送3个字节
从机地址分配:
①号:
0X01;
②号:
0X02;
③号:
0x03;
④号:
0X04;
⑤号:
0X05;
⑥号:
0X06;
⑦号:
0X07;
⑧号:
0X08:
⑨号:
0X09
3、数据字节
01010101表示检测到故障;
015556
10101010表示没有检测到故障
3.3程序设计
3.3.1主程序模块
1、main.c
#include<
reg52.h>
string.h>
#include"
uart.h"
common.h"
control.h"
UCHARrstr[TX_PAYLOAD_WIDTH]={0};
voidmain() //接收
{
uchart;
boolsta;
ucharkey;
InitUart();
//串口初始化
InitControl();
//控制端口初始化
while
(1) //主程序不断的对接收到的数据进行分析
{
if(RI==1) //检查一下串口中有没有数据(每次一个字节)
{
AppendByte(SBUF);
//向协议窗口中增加一个数据
RI=0;
//清除串口中断
t=ProtocolAnalysis();
//进行协议分析
if(t!
=0)
{
sta=GetSta(t);
//查询接口状态
SendSta(t,sta);
//发送接口状态
}
UartSend("
ENA"
3);
}
//对按钮状态进行查询,如果有按钮被按下,将对应接口状态改变,然后将对应接口状态发给上位机
key=GetKey();
if(key!
=0) //有键盘按下
ChangeSta(key);
//使用下面两句话接口状态改变之后会立刻通知上位机,现在上位机采用查 询方式来了解接口的状态,故不需要这两句话
if(key==3)
{
sta=GetSta(key);
//查询接口状态
SendSta(key,sta);
}
}
}
3.3.2串口通讯模块
1、Uart.c
uintm_nEndIndex;
//下一个将要插入数据的下标
ucharm_wsBlock[WINDOW_SIZE];
//定义接收缓存区的大小
ucharm_wsTemp[WINDOW_SIZE];
//这是一个供数据交换的缓存区
voidInitUart() //初始化串口工作模式,在使用串口之前必须被调用一次
TMOD=0x20;
//定时器1工作于8位自动重载模式,用于产生波特率
TH1=(unsignedchar)(256-(XTAL/(32L*12L*Baudrate)));
TL1=(unsignedchar)(256-(XTAL/(32L*12L*Baudrate)));
//定时器1赋初值
SCON=0x50;
//mode1方式,启用接收
PCON=0x00;
TR1=1;
//启用定时器1
IE=0x00;
//接收数据缓存区初始化部分
memset(m_wsBlock,0,WINDOW_SIZE);
//将窗口清零
m_nEndIndex=0;
}
//串口接收处理,采用的是中断处理方式 ,对于发送中断该函数不处理
//串口发送函数
voidUartSend(UCHAR*Data,intLen) //Data为数据指针,len为要发送的数据长度
UCHARc;
inti;
for(i=0;
i<
Len;
i++)
{
c=Data[i];
SBUF=c;
//要发送的字符放入缓冲区
while(TI==0);
TI=0;
}
//第一个参数为接口编号,第二个参数为接口状态,为真接口状态为1,为假接口状态为0
voidSendSta(ucharnum,boolsta)
ucharbuf[PROT_LEN]={0};
buf[0]=num;
if(sta)
buf[1]=0xAA;
//没有故障
else
buf[1]=0x55;
//有故障
buf[2]=buf[0]^buf[1];
//按位异或
UartSend(buf,3);
//用于向窗口中插入一个字符,只有这一个函数会修改窗口中的数据
voidAppendByte(ucharch)
if(WI