基于PC机Windows环境下数据通信、处理及存储程序设计与实现毕业论文

专业综合课程设计任务书

学生姓名: 专业班级:

指导教师: 工作单位:

题目: 5.基于PC机Windows环境下数据通信、处理及存储程序设计与实现。

PC机Windows环境下程序设计能力是电子信息专业技术人员的一项基本技能,本课程设计题要求学生采用任何一种开发平台,设计出一款单片机与PC机间的数据通信、处理及存储的程序(数据收、发程序都要提供)。

设计内容及要求:

(1)通信接口为RS-232,USB,网卡任意一款。

(2)通信的数据流自定。

(3)处理操作自定。

(4)接收的数据以文件的形式存在硬盘上。

时间安排:

(1) 布置课程设计任务,查阅资料,确定方案四天;

(2) 进行编程设计一周;

(3) 完成课程设计报告书三天;

指导教师签名: 年月日

系主任(或责任教师)签名: 年月日

目录

摘要 ........................................................................ I

1 Visual Basic 6.0简介 (2)

2 串口通信原理 (3)

3.1串行通信定义 (3)

3.2串行通信的异步通信 (4)

3.3波特率 (4)

3.4串行接口的基本特点 (5)

3.4.1串行端口工作方式 (5)

3单片机与PC机通信 (8)

4.1 AT89C51单片机上对应端口介绍 (8)

4.3单片机通信代码 (9)

4.4仿真电路图 (11)

4 VB设计PC机 (12)

5.1界面设计 (12)

5.2 VB设计的窗体 (12)

5.3 VB代码 (12)

5 串口通信结果及其分析 (22)

6.1通信结果 (22)

6.2结果分析 (24)

6 实物图 (25)

7心得体会 (26)

参考文献 (27)

摘要

为了实现本次课设的要求,完成基于PC机Windows环境下数据通信、处理及存储程序设计与实现。我们采用Visual Basic 6.0软件设计和51单片机完成课程设计的要求。

我们选取的是通信接口为RS-232,利用单片机与PC机的之间相互通信来实现课设要求,Visual Basic软件主要用于设计代表PC机的窗体,实现PC机进行串口通信的基本功能;单片机用于完成与PC机的通信。本次课设除了要用到VB软件外,还需使用KEIL软件生成适用于51单片机的.HEX文件。

关键字:RS-232 ,串口通信,Visual Basic 6.

1 Visual Basic 6.0简介

Visual Basic(VB)是由微软公司开发的包含协助开发环境的事件驱动编程语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速创建一个应用程序。

VB的中心思想就是要便于程序员使用,无论是新手或者专家。VB使用了可以简单创建应用程序的GUI系统,但是又可以开发相当复杂的程序。VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。

2 串口通信原理

2.1串行通信定义

串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

2.2串行通信的异步通信

字符帧也叫数据帧,由起始位、数据位、奇偶校验位和停止位等四部分组成。在串行通信中,发送端一帧一帧发送信息,接收端一帧一帧接收信息。两相邻字符帧之间可以无空闲位,也可以由若干空闲位,自行定义。

串行通信的数据或者字符是一帧一帧地传送,在异步通信中,一帧数据先用

一个起始位“0”表示字符的开始,然后是5~8位上数据,即该字符的代码,规定低位在前,高位在后,接下来是奇偶校验位,最后一个停止位“1”表示字符的结束。下面是异步通信一帧数据为10位的帧格式见图3-1。

图3-1字符帧格式图

2.3波特率

波特率是通信中对数据传送速率的要求。在计算机通信中,其意义是每秒钟传送多少位二进制数。假如异步传送速率为每秒120个字符,每个字符有1个起

始位,8个数据位,1个停止位组成,则其传送波特率为

波特

1200

bps

1200

120

10=

=

?

波特1200

1200

120

10=

=

?bps

传送一位所需要的时间为波特率的倒数,即

在串行传输中,二进制数据序列是以数字波形出现的,发送时在发送时钟下将通信线上传来的数据串行移入移位寄存器,所以,发送时钟和接受时钟也可作移位时钟。能产生该时钟的电路称为波特率发生器。

2.4串行接口的基本特点

2.4.1串行端口工作方式

串行端口有两个控制寄存器SCON、PCON,用于设置工作方式、发送或接收的状态、特征位、数据传送波特率[每秒传送的位数]以及作为中断标志等。串行端口有一个数据寄存器SBUF[在特殊功能寄存器中的字节地址为99H,该寄存器为发送和接收所共用。

串行端口的波特率可以用程序来控制。在不同工作方式中,由时钟振荡频率

的分频值或由定时器T1的定时溢出时间确定,使用十分方便灵活。

串口控制寄存器:

输入:在时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。只有当8位数据接收完,并检测到高电平停止位后,只有满足①;②或接收到的第9位数据为1时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。

1. 方式2

方式2为固定波特率的11位UART方式。它比方式1增加了一位可程控为1或0的第9位数据。

输出:发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通讯中地址数据信息的标志位,也可以作为数据的奇偶校验位。当CPU执行一条数据写入SUBF 的指令且时,就启动发送器发送。发送一帧信息后,置位中断标志TI。

输入:在时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。在接收到附加的第9位数据后,当满足①;②或接收到的第9位数据为1时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。且不置位RI。

2. 工作方式3

方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。

波特率的选择

如前所述,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在MCS-51串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。

1.方式O

方式0的波特率固定为主振频率的。

2.方式2

方式2的波特率由PCON中的选择位SMOD来决定,可表示为:也就是当时,

波特率为,当时,波特率为。

3.方式1和方式3

定时器T1作为波特率发生器,其公式如下:

溢出率定时器波特率1322T sMOD ?=

产生溢出所需的周期

计数率溢出率11T T = 式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc 门2:当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。

定时器T1工作于方式O :

定时器T1工作于方式1:

定时器T1工作于方式2:

因为方式2为自动重装入初值的8位定时器计数器模式,所以用它来做波特率发生器最恰当。这种方式下,T1的溢出率[次秒]计算式可以表示为:

[]X fsoc T -=256121溢出率

(二) 串行口的通信波特率

串行口的通信波特率恰好反映串行口传输数据的速率。通信波特率的选用,不仅和所选通信设备、传输距离有关,还受传输线状况所制约。

波特率设计

1、方式0的波特率

工作方式0时,移位脉冲由机器周期的第6个状态周期S6给出,每个机器周期产生一个移位脉冲,发送或接收一位数据。因此,波特率是固定的,为振荡频率的,不受PCON 寄存器中SMOD 的影响。用公式表示为:

工作方式0的

2、方式2的波特率

工作方式2时,移位脉冲由振荡频率fosc 的第二节拍P2时钟(即)给出,所以,方式2波特率取决于PCON 中的SMOD 位的值,当时,波特率为fosc 的;当时,波特率为fosc 的,用公式表示为;

工作方式2: ()

f o s c S M O D ?=

642波特率

3、工作方式1和方式3的波特率

在这两种方式下,串行口波特率是由定时器的溢出率决定的,因而波特率也是可变的。相应公式为:

()溢出率

定时器波特率1322T SMO D ??= ()()[]

初值溢出率-?=k fosc T 21121

实际上定时器T1通常采用方式2,因为定时器T1在方式2下工作,TH1和TL1分别设定为两个8位重装计数器。 3单片机与PC 机通信

3.1 STC89C51单片机上对应端口介绍

本次课设主要用到AT89C51单片机上的P3口,P3口的功能简介如下: P3口管脚是8个带内部上拉电阻的双向IO 口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

P3.0 RXD (串行输入口)

P3.1 TXD (串行输出口)

P3.2 INT0(外部中断0)

P3.3 INT1(外部中断1)

P3.4 T0(计时器0外部输入)

P3.5 T1(计时器1外部输入)

P3.6 WR (外部数据存储器写选通)

P3.7 RD (外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号

本次单片机部分只需用到P3口的P3.0口和P3.1口,用于和PC 连接通信。4.2 RS-232简介

通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态

出现,RS-232的电器特性、逻辑电平和各种信号线功能也有规定。

在TxD和RxD上:

逻辑1:-3V ~-15V

逻辑0:+3V~+15V

发送数据(TxD)——通过TxD终端将串行数据发送到MODEM,(DTE→DCE)。

接收数据(RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCE→DTE)。

3.2单片机通信代码

#include

sbit s1=P3^4; s1-s4为按键

sbit s2=P3^5;

sbit s3=P3^6;

sbit s4=P3^7;

sbit rd=P3^3; 按键检测

void init();

void delay(uint n);

uchar scan();

void clear();

void main()

{

init();

while(1)

{

while(1)

{

fasong=scan(); 检测按键

if(fasong=='*') *为结束符号,结束发送数据

break;

if(fasong!='0')按下按键a,b,c三个数据按键

{

SBUF=fasong;发送数据

while(!TI);发完一个字节,跳出循环

TI=0;

}

}

while(1)

{

while(!RI); 接收完一个数据,跳出循环

RI=0;

write_com(tab[i++]);

if(SBUF=='*')

break;

write_data(SBUF);

if(i==32)i=0;

}

clear();

}

}

void init()

{

TMOD=0x20; 定时器1工作于定时方式2

TH1=0xD0;

TL1=0XD0;波特率600

TR1=1;

SCON=0x50;发送数据

dula=0; 关闭数码管

wela=0;

write_com(0x01); 清显示

write_com(0x06); 光标增量移位

write_com(0x0f); 显示ON,光标ON,闪烁ON write_com(0x38); 8位,双行,5X7

}

uchar scan() 键盘检测

{

rd=0;

s1=1;

s2=1;

s3=1;

s4=1;

while(s1==0)

{

delay(5);

while(s1==0) s1确实按下

{

while(!s1); 松手检测

key='a';

return (key);

}

}

while(s2==0)

{

delay(5);

while(s2==0)

{

while(!s2);

key='b';

return (key);

}

}

while(s3==0)

{

delay(5);

while(s3==0)

{

while(!s3);

key='c';

return (key);

}

}

while(s4==0)

{

delay(5);

while(s4==0)

{

while(!s4);

key='*';

return (key);

}

}

key='0'; 无键按下,返回'0'

return (key);

}

void delay(uint n) 延时函数

{

uint j,k;

for(j=0;j

for(k=110;k>0;k--);

}

void write_com(uchar com)

{

rs=0;

rw=0;

P0=com;

en=1;

delay(5);

en=0;

}

void write_data(uchar data_)

{

rs=1;

rw=0;

P0=data_;

en=1;

delay(5);

en=0;

}

void clear() 清lcd显示并将光标定位到0x80

{

for(i=0;i<32;i++)

{

write_com(tab[i]);

write_data(' ');

}

write_com(0x80);

i=0;

}

4 VB设计上位机

4.1界面设计

本次设计需要添加MSComm控件,可用Project--Components—comm control 6.0进行添加。

在设计窗体时要添加以下控件:5个ComboBox 、5个Label、3个Frame、5个Command Button、2个TextBox。

4.2 VB设计的窗体

图4-1 VB设计软件

4.3 VB代码

Option Explicit

Dim ComPort As Integer

Dim HexReceiveFlag As Long

Dim AutoSendFlag As Long

Private Sub cmdClearReceivetext_Click() '清除接收区txtReceive.Text = ""

End Sub

Private Sub cmdClearSendtext_Click() '清除发送区txtSend.Text = ""

End Sub

Private Sub cmdOpencom_Click() '按下“打开关闭串口”

ComPort = Val(Right(Trim(cboComPort.Text), 1)) '端口号

Dim A As String

'设置串口通信参数

If Trim(cmdOpencom.Caption) = "打开串口" Then

With MSComm1

mPort = ComPort

.Settings = Trim(cboBaudRate.Text) & "," & _

Left(Trim(cboParity.Text), 1) & "," & _

Trim(cboDataBits.Text) & "," & _

Trim(cboStopBits.Text) '波特率,校验位,数据位,停止位.RThreshold = 1 '接收到1个字节数据就立即触发OnComm()事件

.InputMode = 1 '设置接受数据的类型是二进制类型数据

.PortOpen = True '打开串口

End With

A = MSComm1.Input '读取输入缓冲区内容给A

cmdOpencom.Caption = "关闭串口"

cboComPort.Enabled = False '设置不可用

cboBaudRate.Enabled = False

cboDataBits.Enabled = False

cboStopBits.Enabled = False

cboParity.Enabled = False

cmdSend.Enabled = True

Else

MSComm1.PortOpen = False

cmdOpencom.Caption = "打开串口"

cboComPort.Enabled = True

cboBaudRate.Enabled = True

cboDataBits.Enabled = True

cboStopBits.Enabled = True

cboParity.Enabled = True

cmdSend.Enabled = False

End If

End Sub

Private Sub cmdSave_Click() '按下“保存接收数据”

Open "F:\VB\接收数据.txt" For Output As #1

Write #1, txtReceive.Text

Close #1

MsgBox "接收数据已保存"

End Sub

Private Sub cmdSend_Click() '按下发送

MSComm1.Output = txtSend.Text '将输出文本框内容给输出缓冲区End Sub

Private Sub Form_Load()

Dim i As Integer

cboComPort.Text = cboComPort.List(0)

For i = 1 To 8 '波特率

cboBaudRate.AddItem 600 * 2 ^ i

Next i

cboBaudRate.Text = 600

For i = 4 To 8 '数据位

cboDataBits.AddItem i

Next i

cboDataBits.Text = 8

With cboStopBits '停止位

.AddItem 1

.AddItem 1.5

.AddItem 2

.Text = 1

End With

With cboParity '校验

.AddItem "None"

.AddItem "Even"

.AddItem "Odd"

.Text = "None"

End With

End Sub

Private Sub MSComm1_OnComm()

Dim bytReceive() As Byte

Dim i As Integer

Select Case MSComm1mEvent

Case comEvReceive

bytReceive() = MSComm1.Input

For i = 0 To UBound(bytReceive)

txtReceive.Text = txtReceive.Text & Chr(Val(bytReceive(i))) '接收Next i

End Select

End Sub

5 串口通信结果及其分析

5.1通信结果

图5-1 PC端接受单片机通信

图5-2 PC端向单片机发送数据

图5-3 单片机接收PC发送数据

图5-4 接收数据保存在F:\VB文件夹中

5.2结果分析

测试开始,按下三个按键,单片机向上位机发送字符a,b,c,如图6-1所示,上位机收到数据并显示。按下第四个按键,单片机发送数据结束,开始接收数据,PC端对单片机发送的字符或字符串进行接收,如图6-3所示,LCD显示发送的数据VB is useful。在上位机发送字符*后,单片机停止接收数据LCD清屏,并开始发送数据。此时按下三个按键,在上位机再次接收到字符a,b,c。如上过程往复循环,实现单片机与PC机的半双工通信。当点击“清发送区”按钮时,发送编辑框清空;当单击“清接收区”按钮时,接收编辑框清空。当点击“保存接收数据”按钮时,接收到的数据保存在F:\VB文件夹下,如图6-4所示,实现接收数据保存在硬盘上。

6 实物图

图6-1基于学习单片机的实物调试

相关文档
最新文档