基于PC机Windows环境下数据通信处理及存储程序设计与实现课程设计.docx
- 文档编号:17363143
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:35
- 大小:883.09KB
基于PC机Windows环境下数据通信处理及存储程序设计与实现课程设计.docx
《基于PC机Windows环境下数据通信处理及存储程序设计与实现课程设计.docx》由会员分享,可在线阅读,更多相关《基于PC机Windows环境下数据通信处理及存储程序设计与实现课程设计.docx(35页珍藏版)》请在冰点文库上搜索。
基于PC机Windows环境下数据通信处理及存储程序设计与实现课程设计
专业综合课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
5.基于PC机Windows环境下数据通信、处理及存储程序设计与实现。
PC机Windows环境下程序设计能力是电子信息专业技术人员的一项基本技能,本课程设计题要求学生采用任何一种开发平台,设计出一款单片机与PC机间的数据通信、处理及存储的程序(数据收、发程序都要提供)。
设计内容及要求:
(1)通信接口为RS-232,USB,网卡任意一款。
(2)通信的数据流自定。
(3)处理操作自定。
(4)接收的数据以文件的形式存在硬盘上。
时间安排:
(1)布置课程设计任务,查阅资料,确定方案四天;
(2)进行编程设计一周;
(3)完成课程设计报告书三天;
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
为了实现本次课设的要求,完成基于PC机Windows环境下数据通信、处理及存储程序设计与实现。
我们采用VisualBasic6.0软件设计和51单片机完成课程设计的要求。
我们选取的是通信接口为RS-232,利用单片机与PC机的之间相互通信来实现课设要求,VisualBasic软件主要用于设计代表PC机的窗体,实现PC机进行串口通信的基本功能;单片机用于完成与PC机的通信。
本次课设除了要用到VB软件外,还需使用KEIL软件生成适用于51单片机的.HEX文件。
关键字:
RS-232,串口通信,VisualBasic6.
1VisualBasic6.0简介
VisualBasic(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.1STC89C51单片机上对应端口介绍
本次课设主要用到AT89C51单片机上的P3口,P3口的功能简介如下:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号
本次单片机部分只需用到P3口的P3.0口和P3.1口,用于和PC连接通信。
4.2RS-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
#defineucharunsignedchar
#defineuintunsignedint
uinti;
ucharkey,fasong;
ucharxdatatab[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地址表
sbitdula=P2^6;//关闭数码管
sbitwela=P2^7;
voidwrite_com(ucharcom);//lcd写指令
voidwrite_data(uchardata_);//lcd写数据
sbitrs=P2^0;//lcd写指令,写数据
sbitrw=P2^1;//lcd读写
sbiten=P2^2;//lcd使能
sbits1=P3^4;//s1-s4为按键
sbits2=P3^5;
sbits3=P3^6;
sbits4=P3^7;
sbitrd=P3^3;//按键检测
voidinit();
voiddelay(uintn);
ucharscan();
voidclear();
voidmain()
{
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();
}
}
voidinit()
{
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
}
ucharscan()//键盘检测
{
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);
}
voiddelay(uintn)//延时函数
{
uintj,k;
for(j=0;j for(k=110;k>0;k--); } voidwrite_com(ucharcom) { rs=0; rw=0; P0=com; en=1; delay(5); en=0; } voidwrite_data(uchardata_) { rs=1; rw=0; P0=data_; en=1; delay(5); en=0; } voidclear()//清lcd显示并将光标定位到0x80 { for(i=0;i<32;i++) { write_com(tab[i]); write_data(''); } write_com(0x80); i=0; } 4VB设计上位机 4.1界面设计 本次设计需要添加MSComm控件,可用Project--Components—commcontrol6.0进行添加。 在设计窗体时要添加以下控件: 5个ComboBox、5个Label、3个Frame、5个CommandButton、2个TextBox。 4.2VB设计的窗体 图4-1VB设计软件 4.3VB代码 OptionExplicit DimComPortAsInteger DimHexReceiveFlagAsLong DimAutoSendFlagAsLong PrivateSubcmdClearReceivetext_Click()'清除接收区 txtReceive.Text="" EndSub PrivateSubcmdClearSendtext_Click()'清除发送区 txtSend.Text="" EndSub PrivateSubcmdOpencom_Click()'按下“打开/关闭串口” ComPort=Val(Right(Trim(cboComPort.Text),1))'端口号 DimAAsString '设置串口通信参数 IfTrim(cmdOpencom.Caption)="打开串口"Then WithMSComm1 .CommPort=ComPort .Settings=Trim(cboBaudRate.Text)&","&_ Left(Trim(cboParity.Text),1)&","&_ Trim(cboDataBits.Text)&","&_ Trim(cboStopBits.Text)'波特率,校验位,数据位,停止位 .RThreshold=1'接收到1个字节数据就立即触发OnComm()事件 .InputMode=1'设置接受数据的类型是二进制类型数据 .PortOpen=True'打开串口 EndWith 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 EndIf EndSub PrivateSubcmdSave_Click()'按下“保存接收数据” Open"F: \VB\接收数据.txt"ForOutputAs#1 Write#1,txtReceive.Text Close#1 MsgBox"接收数据已保存" EndSub PrivateSubcmdSend_Click()'按下发送 MSComm1.Output=txtSend.Text'将输出文本框内容给输出缓冲区 EndSub PrivateSubForm_Load() DimiAsInteger cboComPort.Text=cboComPort.List(0) Fori=1To8'波特率 cboBaudRate.AddItem600*2^i Nexti cboBaudRate.Text=600 Fori=4To8'数据位 cboDataBits.AddItemi Nexti cboDataBits.Text=8 WithcboStopBits'停止位 .AddItem1 .AddItem1.5 .AddItem2 .Text=1 EndWith WithcboParity'校验 .AddItem"None" .AddItem"Even" .AddItem"Odd" .Text="None" EndWith EndSub PrivateSubMSComm1_OnComm() DimbytReceive()AsByte DimiAsInteger SelectCaseMSComm1.CommEvent CasecomEvReceive bytReceive()=MSComm1.Input Fori=0ToUBound(bytReceive) txtReceive.Text=txtReceive.Text&Chr(Val(bytReceive(i)))'接收 Nexti EndSelect EndSub 5串口通信结果及其分析 5.1通信结果 图5-1PC端接受单片机通信 图5-2PC端向单片机发送数据 图5-3单片机接收PC发送数据 图5-4接收数据保存在F: \VB文件夹中 5.2结果分析 测试开始,按下三个按键,单片机向上位机发送字符a,b,c,如图6-1所示,上位机收到数据并显示。 按下第四个按键,单片机发送数据结束,开始接收数据,PC端对单片机发送的字符或字符串进行接收,如图6-3所示,LCD显示发送的数据VBisuseful。 在上位机发送字符*后,单片机停止接收数据LCD清屏,并开始发送数据。 此时按下三个按键,在上位机再次接收到字符a,b,c。 如上过程往复循环,实现单片机与PC机的半双工通信。 当点击“清发送区”按钮时,发送编辑框清空;当单击“清接收区”按钮时,接收编辑框清空。 当点击“保存接收数据”按钮时,接收到的数据保存在F: \VB文件夹下,如图6-4所示,实现接收数据保存在硬盘上。 6实物图 图6-1基于学习单片机的实物调试 7心得体会 本次课设要求我们做基于PC机Windows环境下数据通信、处理及存储程序设计与实现,既要设计出一款集数据发送、接收处理及存储程序,又要将接收的数据以文件的形式存在硬盘上。 通过对题目的分析我们决定采用RS-232串口来实现PC端与单片机端的相互通信,要做到这一点,我们得先要设计一个类似于串口助手的软件来模仿我们的PC端。 为了达到这个目的,我们利用VisualBasic6.0来设计我们需要的软件,查阅了书籍相关资料并在网上查找有关的代码,遇到不会的会请教其他VB学的好的同学。 在我们的努力和他们的帮助下,我们的课设顺利完成。 我主要负责实现单片机的程序便携盒调试。 之前学习过单片机,也曾编写过串口和LCD的程序,所以单片机程序的编写较容易实现。 本次课程设计虽然完成了,但是还是有的地方有一些缺陷,如单片机接收数据时有时会出现第一个字符重复在LCD显示的情况,所以在今后的日子里,还要继续努力,继续学习。 参考文献 [1]郭天祥.新概念51单片机C语言教程.电子工业出版社.2009.1.1 [2]朱清慧.Proteus教程.清华大学出版社.2011.6 [3]许庆芳.VisualBasic6.0程序设计与应用教程.清华大学出版社,2007.9 [4]乔平安.VisualBasic6.0程序设计.人民邮电出版社.2013.2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PC Windows 环境 数据通信 处理 存储 程序设计 实现 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)