单片机与PC机串行通信.docx
《单片机与PC机串行通信.docx》由会员分享,可在线阅读,更多相关《单片机与PC机串行通信.docx(24页珍藏版)》请在冰豆网上搜索。
单片机与PC机串行通信
沈阳航空航天大学
课程设计报告
课程设计名称:
单片机系统综合课程设计
课程设计题目:
单片机与PC机串行通信
院(系):
计算机学院
专业:
计算机科学与技术
班级:
24010101
学号:
2012040101008
姓名:
陈政禹
指导教师:
孙恩岩
说明:
结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。
报告和电子数据必须作为实验现象重复的关键依据。
学术诚信声明
本人声明:
所呈交的报告(含电子版及数据文件)是我个人在导师指导下独立进行设计工作及取得的研究结果。
尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。
与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。
报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。
本人签名:
日期:
年月日
沈阳航空航天大学
课程设计任务书
课程设计名称
单片机系统综合课程设计
专业
计算机科学与技术
学生姓名
陈政禹
班级
24010101
学号
2012040101008
题目名称
单片机与PC机串行通信
起止日期
2015
年
6
月
29
日起至
2015
年
7
月
10
日止
课设内容和要求:
一、课程设计内容
利用南京伟福公司的LAB6000通用微控制器仿真实验系统开发单片机与PC机串行通讯系统,实现单片机与PC机的通讯。
要求实现数据收发功能。
具体要求如下:
1.通过LAB6000的小键盘选择功能;
2.功能1:
接收PC机发送数据,并将其回发给PC机;
3.功能2:
从LAB8000的小键盘输入数据,发送给PC机。
二、课程设计要求
1.独立完成课程设计任务;
2.通过老师当场验收;
3.交出完整的课程设计报告。
参考资料:
[1]张毅刚,刘杰.MCS-51单片机原理及应用[M].哈尔滨:
哈尔滨工业大学出版社,2008
[2]高锋.单片微型计算机原理与接口技术[M].北京:
科学出版社,2007
[3]胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社,2004
教研室审核意见:
教研室主任签字:
指导教师(签名)
年
月
日
学生(签名)
年
月
日
课程设计总结:
经过这次课程设计,我对汇编语言、C语言及单片机芯片8051有了进一步的了解,并且巩固了对芯片功能的理解和应用,增加了我的动手能力和实践能力。
并且在与老师和同学的交流过程中,开阔了自己的想法,通过使用更好的方法,程序变得更加高效。
本次课程设计是用硬件实现串行口通讯的设计。
在刚开始实验中遇到了很多问题,其中很多是因为自己的粗心大意导致程序的功能不能正确实现,还有一些是在编写程序时出现的错误。
刚接触这些功能时,我还不能真正理解如何实现串行口通讯的功能,从汇编语言来实现小键盘扫描功能无法实现到采用C语言实现,虽然最后的键盘扫描功能不尽人意,但是我认为在这次课程设计后我真的学到了很多东西,在老师和同学的帮助下能完成课程设计的要求我认为很激励我的学习兴趣。
由于课设题目太简单,孙老师让我增加一个界面,类似于串口大师,经过一天多的视频学习,我学会了做对话框,但是不足的是不会将之与单片机连接。
虽然不完美,但是我学会了比较实用的做对话框功能。
通过本次课程设计让我更加深刻的理解了MCS-51单片机原理及其应用。
同时也认识到自己在书本上所学习到的知识还远远不足,需要亲自动手实践来充实自己在书本上的所学,并且应用到具体的语句实现上。
所以我会在以后的学习中更加虚心努力,增加自己的编程能力。
1概述
1.1设计内容和要求
(1)课程设计内容
利用南京伟福公司的LAB8000来开发单片机与PC机串行通讯系统,实现单片机与PC机的通讯。
要求实现数据收发功能。
具体要求内容如下:
①通过LAB8000的小键盘选择功能;
②功能1:
接受PC机发送的数据,并将其回发给PC机;
③功能2:
从LAB8000的小键盘输入数据,发送给PC机。
(2)课程设计要求:
①认真完成课程设计任务;
②通过老师现场验收;
③交出完整的课程设计报告。
1.2课程题目分析
题目背景:
串行口在计算机中有重要的作用,MCS—51单片机内部有一个功能强的全双工的异步通信串行口,就是指双机之间的串行接收、发送数据可同时进行。
要传送的串行数据在发方是以数据帧形式一帧一帧地发送,通过传输线由收方一帧一帧地接收。
本次课设要求完成从PC机发送数据,将其传入单片机,并将其发回给PC机。
然后再从LAB8000的小键盘输入数据,将其发送给PC机。
1.3课程设计原理
本次课程设计由于要完成功能的选择,所以要用键盘扫描程序。
通过键盘扫描程序来判断按下来的是哪一个按键,实现功能选择。
当扫描到用户按LAB8000上面的小键盘1时,实现功能1的选择,这时候从PC机的键盘输入数据,就可以使之发送出去,传送到单片机然后后传回PC机,这里面需要一个SBUF缓冲区来缓冲存储数据,当把数据往单片机里面发送时,数据需要先发送到SBUF缓冲区里面,然后再往单片机里面发送,当单片机往PC机发送数据时,数据也需要先送到SBUF里面,然后在往外发送,当扫描到输入的值是1时,结束功能1,停止发送。
。
当扫描到用户按LAB8000上面的按键2时,通过键盘扫描程序进入功能2,功能二要求从LAb8000小键盘输入数据,然后传给PC机。
当扫描到按NEXT键时,停止发送。
要实现单片机与PC机的串行通信,要用到MAX232来实现电平转换。
串行通信时选择串行口工作在方式一,定时器工作时选择工作在方式二。
经过计算,设置通信时的波特率为4800bits/s,将4800bits/s往回带入公式,计算出误差小于<7%,所以可以选择这种工作模式。
1.4方案设计
设计键盘扫描函数和按键检测函数,通过MCS-51芯片,实现键盘扫描,通过小键盘设置17个键位选择键(4*4+NEXT键),再输入时在数码管上面显示1,进入功能一:
接收PC机发送的数据并将其发回给PC机,在输入2时,在数码管上面显示数值2,然后从小键盘输入数据发送给PC机。
1.4.1小键盘选择功能
小键盘选择功能:
首先设置定时器及波特率,然后在设计键盘扫描函数和按键检测函数,使之能实现小键盘的选择功能。
输入不同的数实现调用不同的函数,从而实现不同的功能。
1.4.2功能1,PC机发送模块
功能1:
设计PC发送函数,此功能还需要有串行口中断函数。
目的是实现单片机可以接收PC机发送的数据,并且将其发送给PC机。
设置一个返回键,让按键1实现返回小键盘选择功能,可以重新选择功能1还是功能2。
1.4.3功能2,单片机发送模块
功能2:
设计小键盘发送程序,需要调用键盘扫描函数和按键检测函数,若有键按下,将键值发送到数码管上,并将其转化为ascii码发回PC机。
同样设置一个返回键,设置小键盘右下角的“NEXT”时返回小键盘的功能选择,使函数能够循环使用。
1.5方案论证
从实际应用的角度,可以任意选择事先设计好的3种状态,当选择完一种状态时(除0),它可以无限的按照这种方案循环的运行下去,在此过程中,用户可以选择退出这种工作状态,从而实现对当前进行状态的控制,即可以令程序重新开始。
当输入0时,结束。
在整个串行口输入过程中可随时做出不同的输入方式,对输入数据的工作状态进行控制。
2总体设计方案
2.1实现方法
开始运行程序时,数码管初始化显示6个数字0,然后选择一种模式(1和2),若输入的数不是“1”或“2”,只在LED登上显示该数,等待重新输入一个工作状态,此处在扫描键盘并按键检测后需要将扫描到断码发送到登上。
在选择“1”,即要实现功能1,则调用PC机发送函数,用串行口中断函数来保存断点(防止计数器溢出)。
使之能实现接收PC机发送的数据后,在将其回发给PC机。
设置一全局变量flag,当用户按键1时,flag置1,使之跳出while死循环,从而达到返回小键盘,重新选择功能1跟2。
若选择“2”,即要实现功能2,须调用小键盘扫描函数,将数据显示到数码管上,同时然后将该数据转化成acsii码的形式通过串行口发送到PC机上。
当从小键盘按键NEXT时,返回初始状态,可以进行功能1和2的重新选择。
2.2设计思路
本课设主要分3个模块,第一个模块是主程序中的键盘扫描,通过键盘扫描程序来获取从小键盘输入的键值,此次课设里面用到的键盘的按键主要有三个,一个是‘0’,一个是‘1’,另一个是‘2’。
当输入‘0’时,结束。
当输入的是‘1’时,进入第二个功能模块,由PC机发送数据,将数据发送给单片机,然互在传给PC机。
当输入数值‘2’时,进入第二个模块,将数据由单片机小键盘输入,发送给PC机。
模块调用图如下页图2.1所示
图2.1模块调用
2.3设计环境
硬件环境:
伟福LAB8000;
软件环境:
Keiμvision
3详细设计
3.1硬件电路设计
8051单片机内部的总体电路图如图3.1所示,
图3.18051单片机电路图
3.2软件设计
3.2.1主程序键盘扫描模块
该模块的功能是用户从小键盘输入数据,以进行功能选择。
将某一键按下,通过扫描键盘,向列扫描码地址(0X8002H)逐列输出低电平,然后从行码地址(0X8001H)读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是哪个键。
该模块中键盘扫描的电路图和键盘扫描电路如图3.2和3.3所示
图3.2键盘电路图
图3.3键盘扫描流程图
主函数模块首先设置定时器及波特率的选择,根据标志位k1的值选择是PC模式发送数据还是小键盘模式发送数据,并根据功能选择模块中对各模式的信息的进行相应的初始设置。
通过小键盘选择功能控制数据的输出方式,还能接受新的键值来执行相应的功能。
读取的键值要先判断是否是无效键,是无效键要执行死循环程序,按下“1”或“2”键才能继续显示。
如下页图3.4所示
N
N
Y
Y
Y
图3.4主函数模块流程图
3.2.2功能1模块
该模块的功能是通过键盘扫描程序的按键选择选择功能1(串口传输),并且将数字显示到数码管上面。
要实现单片机与PC机的串行通信,数码管显示电路图如图3.5所示
图3.5数码管显示电路图
功能1模块利用单片机的串行口,实现PC机的串行通讯。
启动功能1时开启定时器,调用串行中断函数,通过while(!
flag)语句实现循环发送的功能,在串行中断子函数中先将PC机中输入的内容发送到单片机上,执行while(!
RI)。
在单片机将其内容回发给PC机之前需要进行是否返回小键盘选择功能的判定,通过if(temp==49)flag=1语句,判断是否是数1的ASCII码49,若是则将flag置1,达到跳出该循环的目的。
如图3.6所示。
N
N
NY
Y
图3.6功能1模块流程图
3.2.3功能2模块
本次课设实现单片机与PC机之间的串行通信需要串口通信需要用到MAX232芯片,由于标准的MAX232电平很高,可以达到正负15V,常用的TTL电平最高可以达到5V,所以需要MAX232芯片来进行转换。
将P3.0接RXD引脚,P3.1接TXD引脚
MAX232芯片如下图3.7所示,用MAX232接单片机与PC机后的电路图如图3.8所示
图3.7MAX232芯片
图3.8MAX232连接后的电路图
功能2模块实现小键盘发送数据的功能,需调用小键盘扫描函数和按键检测函数,将小键盘输入的数据发送到LED灯上。
启动功能2时同功能1一样先启动定时器工作,扫描小键盘使之能够在小键盘输入数据,对输入的数据进行判定,若为返回键(NEXT)则跳出该函数重新进行小键盘选择功能,使之能够循环使用;若为基本键,将扫描到的按键的键值通过查表的方式转为ASCII码,好发送回PC机中。
如图3.9所示
图3.9功能2模块流程图
4调试
4.1调试过程
主函数模块中的键盘扫描开始不太会,所以在本次课程设计开始做的时候就参照着实验指导书进行了细致地系统地学习,深刻地了解了其工作原理,以便后来理解代码以及编写代码。
功能1即PC机发送数据模块进行编代码时,由于平时学习单片机时用的是汇编语言编程,这次课程设计要求用C语言进行编程,结合着实验箱上的各器件和接线方法进行编程。
因为以前实验时候做过串口通信实验,所以对这部分还是挺熟悉的,将以前写的实验原理汇编语言转化为C语言。
有时候调试的时候忘记连实验箱的线,急的满头大汗,最后发现真是又高兴又无奈。
编写代码过程中还会存在一些小的语法错误,通过keil软件不断进行调试的过程中,根据其给出的错误提示,来进行检查修改。
4.2调试结果
根据此次课程设计题目的要求,在老师和同学的帮助下,经过上述的各种调试过程,实现了课设上面的所有要求,可以在按键1时数码管显示1,进行PC机发送数据,发送给单片机,单片机再将数据发给PC机。
按键2时数码管显示2,将小键盘输入的数据发送给PC机。
但是由于课设简单,孙老师让增加一个界面,类似于串口大师的,经过一天多的学习,只做完了对话框,没有将之与单片机连接到一起。
参考文献
[1]张毅刚,刘杰.MCS-51单片机原理及应用[M].哈尔滨:
哈尔滨工业大学出版社,2008
[2]张义和.例说51单片机:
C语言版[M].北京:
人民邮电出版社,2010
[3]段晨东,爨莹.单片机原理及接口技术[M].北京:
清华大学出版社,2008
[4]伟福Lab8000系列单片机仿真实验系统使用说明书[M].南京伟福实业有限公司,2015
[5]高峰.单片微型计算机原理与接口技术[M].北京:
科学出版社,2007
附录(关键部分程序清单)
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
xdataucharkey_at_0x8001;//定义键盘行地址
xdataucharled_at_0x8002;//定义键盘列地址并定义段码显示所在列
xdatauchardat_at_0x8004;//定义段码输出地址
ucharascii[]={48,49,50,51,52,53,54,55,56,57,0x41,0x42,0x43,0x44,0x45,0x46};
ucharledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uintk1;
ucharflag;
uchartemp;
voidpcsend();
voidkeysend();
inti,j,p;
unsignedchartestkey()//数码管显示函数
{
led=0;
return(~key&0x0f);
}
uintgetkey()//键盘扫描函数
{uintk;
led=0xfb;//扫描左数第四列
switch(key)
{
case0x0e:
k=13;while(testkey());return(k);//下数第一行d
case0x0d:
k=12;while(testkey());return(k);//下数第二行c
case0x0b:
k=11;while(testkey());return(k);//下数第三行b
case0x07:
k=10;while(testkey());return(k);//下数第四行a
default:
break;
}
led=0xf7;//扫描左数第三列
switch(key)
{case0x0e:
k=14;while(testkey());return(k);
case0x0d:
k=3;while(testkey());return(k);
case0x0b:
k=6;while(testkey());return(k);
case0x07:
k=9;while(testkey());return(k);
default:
break;
}
led=0xef;//扫描左数第二列
switch(key)
{case0x0e:
k=15;while(testkey());return(k);
case0x0d:
k=2;while(testkey());return(k);
case0x0b:
k=5;while(testkey());return(k);
case0x07:
k=8;while(testkey());return(k);
default:
break;
}
led=0xdf;//扫描左数第一列
switch(key)
{case0x0e:
k=0;while(testkey());return(k);
case0x0d:
k=1;while(testkey());return(k);
case0x0b:
k=4;while(testkey());return(k);
case0x07:
k=7;while(testkey());return(k);
default:
break;
}
led=0xfe;
switch(key){case0x0e:
k=100;while(testkey());return(k);
default:
return(-1);break;}
}
voidmain()//主函数
{
TMOD=0x20;//设置定时器工作方式和初值
TH1=0xF3;
TL1=0xF3;
SCON=0x50;
PCON=0x80;
while
(1){
k1=getkey();
led=2;
flag=0;
dat=ledmap[k1];
if(k1==1||k1==2)
{
switch(k1)
{case1:
pcsend();IE=0x00;k1=0;break;
case2:
keysend();k1=0;break;
}
}
}
}
voidpcsend()//PC发送函数
{
TR1=1;
IE=0x90;
while(!
flag);
}
voidkeysend()//小键盘发送函数
{uintkk=0;
ucharknum;
TR1=1;
kk=getkey();
while(kk!
=100)
{
kk=getkey();
if(kk==-1)
continue;
led=2;
knum=ascii[kk];
SBUF=knum;
while(!
TI);
TI=0;
}
}
voidInt1()interrupt4//串行口中断函数
{
while(!
RI);
temp=SBUF;
RI=0;
SBUF=temp;
while(!
TI);
TI=0;
if(temp==49)
flag=1;
}