单片机与PC串口通讯Word文档下载推荐.doc

上传人:b****1 文档编号:13165503 上传时间:2022-10-07 格式:DOC 页数:20 大小:529.50KB
下载 相关 举报
单片机与PC串口通讯Word文档下载推荐.doc_第1页
第1页 / 共20页
单片机与PC串口通讯Word文档下载推荐.doc_第2页
第2页 / 共20页
单片机与PC串口通讯Word文档下载推荐.doc_第3页
第3页 / 共20页
单片机与PC串口通讯Word文档下载推荐.doc_第4页
第4页 / 共20页
单片机与PC串口通讯Word文档下载推荐.doc_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机与PC串口通讯Word文档下载推荐.doc

《单片机与PC串口通讯Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《单片机与PC串口通讯Word文档下载推荐.doc(20页珍藏版)》请在冰豆网上搜索。

单片机与PC串口通讯Word文档下载推荐.doc

第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1