单片机与pc机软件开发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单片机与PC机通讯系统键盘选择按键模块PC机发送数据模块单片机发送数据模块3详细设计3.1硬件电路设计8051单片机内部的总体电路图如图3.1所示,图3.18051单片机电路图3.2软件设计3.2.1主程序键盘扫描模块该模块的功能是用户从小键盘输入数据,以进行功能选择。将某一键按下,通过扫描键盘,向列扫描码地址(0X8002H)逐列输出低电平,然后从行码地址(0X8001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是哪个键。该模块中键盘扫描的电路图和键盘扫描电路如图3.2和3.3所示图3.2键盘电路图开始初始化地址参数输出列扫描信号列扫描信号移位读入行信号该列有键输入6列扫描完按照行列计算键值查表得键码等待按键释放是否是否结束图3.3键盘扫描流程图主函数模块首先设置定时器及波特率的选择,根据标志位k1的值选择是PC模式发送数据还是小键盘模式发送数据,并根据功能选择模块中对各模式的信息的进行相应的初始设置。通过小键盘选择功能控制数据的输出方式,还能接受新的键值来执行相应的功能。读取的键值要先判断是否是无效键,是无效键要执行死循环程序,按下“1”或“2”键才能继续显示。如下页图3.4所示NNYYY图3.4主函数模块流程图开始设置定时器工作方式及波特率率小键盘输入为值是1或者值是否为1上微机键盘发送数据结束按小键盘1键用小键盘发送数据按小键盘NEXT键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所示。NNNYY图3.6功能1模块流程图开始启动定时器,允许串行口中断上微机输入传输数据数据由SBUF传入Temp接收完发送完成?将Temp中的数据传到SBUFRI=0TI=0返回断点小键盘输入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模块流程图开始启动定时器1工作YNYN调用键盘扫描函数按键为NEXT让第二个数码管显示将键值相对应的ASCII码发送到变量knum中返回断点发送完成TI=0从temp中输出数据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附录(关键部分程序清单)#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintxdataucharkey_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);//下数第一行dcase0x0d:k=12;while(te