资源描述
专业综合课程设计任务书
学生:专业班级:
指导教师:工作单位:
题 目: 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
32 / 34
摘要
为了实现本次课设的要求,完成基于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个停止位组成,则其传送波特率为
传送一位所需要的时间为波特率的倒数,即
在串行传输中,二进制数据序列是以数字波形出现的,发送时在发送时钟下将通信线上传来的数据串行移入移位寄存器,所以,发送时钟和接受时钟也可作移位时钟。能产生该时钟的电路称为波特率发生器。
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作为波特率发生器,其公式如下:
式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc门2:当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式O:
定时器T1工作于方式1:
定时器T1工作于方式2:
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。这种方式下,T1的溢出率[次/秒]计算式可以表示为:
(二) 串行口的通信波特率
串行口的通信波特率恰好反映串行口传输数据的速率。通信波特率的选用,不仅和所选通信设备、传输距离有关,还受传输线状况所制约。
波特率设计
1、方式0的波特率
工作方式0时,移位脉冲由机器周期的第6个状态周期S6给出,每个机器周期产生一个移位脉冲,发送或接收一位数据。因此,波特率是固定的,为振荡频率的,不受PCON寄存器中SMOD的影响。用公式表示为:
工作方式0的
2、方式2的波特率
工作方式2时,移位脉冲由振荡频率fosc的第二节拍P2时钟(即)给出,所以,方式2波特率取决于PCON中的SMOD位的值,当时,波特率为fosc的;当时,波特率为fosc的,用公式表示为;
工作方式2:
3、工作方式1和方式3的波特率
在这两种方式下,串行口波特率是由定时器的溢出率决定的,因而波特率也是可变的。相应公式为:
实际上定时器T1通常采用方式2,因为定时器T1在方式2下工作,TH1和TL1分别设定为两个8位重装计数器。
3单片机与PC机通信
3.1 STC89C51单片机上对应端口介绍
本次课设主要用到AT89C51单片机上的P3口,P3口的功能简介如下:
P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar key,fasong;
uchar xdata tab[32]={0x80,0x81,0x82,0x83,
0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b,
0x8c,0x8d,0x8e,0x8f,
0xc0,0xc1,0xc2,0xc3,
0xc4,0xc5,0xc6,0xc7,
0xc8,0xc9,0xca,0xcb,
0xcc,0xcd,0xce,0xcf};//lcd地址表
sbit dula=P2^6;//关闭数码管
sbit wela=P2^7;
void write_(uchar ); //lcd写指令
void write_data(uchar data_);//lcd写数据
sbit rs=P2^0; //lcd写指令,写数据
sbit rw=P2^1; //lcd读写
sbit en=P2^2; //lcd使能
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_(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_(0x01); //清显示
write_(0x06); //光标增量移位
write_(0x0f); //显示ON,光标ON,闪烁ON
write_(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<n;j++)
for(k=110;k>0;k--);
}
void write_(uchar )
{
rs=0;
rw=0;
P0=;
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_(tab[i]);
write_data(' ');
}
write_(0x80);
i=0;
}
4 VB设计上位机
4.1界面设计
本次设计需要添加MSComm控件,可用Project--Components—comm control6.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 MSComm1 mEvent
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基于学习单片机的实物调试
7心得体会
本次课设要求我们做基于PC机Windows环境下数据通信、处理与存储程序设计与实现,既要设计出一款集数据发送、接收处理与存储程序,又要将接收的数据以文件的形式存在硬盘上。通过对题目的分析我们决定采用RS-232串口来实现PC端与单片机端的相互通信,要做到这一点,我们得先要设计一个类似于串口助手的软件来模仿我们的PC端。为了达到这个目的,我们利用Visual Basic 6.0来设计我们需要的软件,查阅了书籍相关资料并在网上查找有关的代码,遇到不会的会请教其他VB学的好的同学。在我们的努力和他们的帮助下,我们的课设顺利完成。
我主要负责实现单片机的程序便携盒调试。之前学习过单片机,也曾编写过串口和LCD的程序,所以单片机程序的编写较容易实现。
本次课程设计虽然完成了,但是还是有的地方有一些缺陷,如单片机接收数据时有时会出现第一个字符重复在LCD显示的情况,所以在今后的日子里,还要继续努力,继续学习。
参考文献
[1]郭天祥.新概念51单片机C语言教程.电子工业.2009.1.1
[2]朱清慧.Proteus教程.清华大学.2011.6
[3]许庆芳.VisualBasic 6.0程序设计与应用教程.清华大学,2007.9
[4]乔平安. VisualBasic 6.0程序设计.人民邮电.2013.2
本科生课程设计成绩评定表
姓名
性别
专业、班级
课程设计题目:基于PC机Windows环境下数据通信、处理与存储程序设计与实现
课程设计答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、与格、不与格评定)
指导教师签字:
年月日
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作与取得的成果。尽我所知,除文中特别加以标注和致的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得与其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部容。
作者签名: 日 期:
学位论文原创性声明
本人重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名: 日期: 年 月 日
学位论文使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名: 日期: 年 月 日
导师签名: 日期: 年 月 日
注意事项
1.设计(论文)的容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:引言(或绪论)、正文、结论
7)参考文献
8)致
9)附录(对论文支持必要时)
2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体与大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
展开阅读全文