基于单片机无线电子点菜系统硬件设计及实现
单片机最小系统是整个开发板的控制中心,它由电源,复位电路和晶振组成。电源采用5V供电,晶振为12MHZ。为了便于调试,将P0.4-P0.7和发光管相连,发光管为共阳极连接,这是因为开发板初上电或者或者复位后,所有的I/O口均为高电平。由于不使用外部存储器,因此将EA接高电平。为了方便调试和降低成本,因此选用USB(Universial Serial Bus,通用串口总线)方式供电。USB的即插即用特性,使对开发板供电非常方便。图3.1所示为单片机最小系统。
图3.1单片机最小系统
3.2.2 串行口电平转换部分
大多数PC机都有一个串行通讯端口RS-232用于两台计算机间进行串行通讯。RS - 232通讯接口是一种标准化的串行接口,是为DTE(Data Terminal Equipment,远程通讯连接终端设备)与DCE (Data Communication Equipment,数据通讯设备)定义的物理接口。RS-232采用非平衡连接(又称为单端线路),在这个线路中,信号电压加到一条导线上,所有的信号电压都使用一个公共的接地线。为了提高抗干扰能力和增加传送距离,RS一232的每个脚线的信号和电平规定采用负逻辑电平,DC(-15一5V)规定为逻辑”1″,DC(+ 5-+15V)规定逻辑”0″, DC(-5一+5V规定为过渡区)。由于单片机的输入、输出电平为TTL电平,与 PC机RS-232标准串行接口的电气规范不一致,因此要实现单片机与PC机之间的数据通读,必须进行电平转换。选用的电平转换芯片为MAX232,它的工作电压为+5V,和单片机的工作电源相同。
由于STC89C58RD+单片机支持ISP下载,因此通过这个串行口既可以用来和PC机通信,又能将程序下载到单片机,不用购买昂贵的编程器。图3.2所示为串口电平转换部分。
图3.2 串口电平转换部分
3.2.3 LED部分
由于单片机复位后,各个引脚输出都为高电平,因此选用共阴极的LED数码管。每个数码管的使能端com1,com2,com3,com4分别接到P1.0,P1.1,P1.2,P1.3,当向使能端输出低电平,即可选通相对应的数码管。74LS244为三态输出的八组缓冲器和总线驱动器,选用的四位八段数码管本身已经集成了译码器,这样既简化了线路的连接,又降低了错误发生的概率。图3.3为LED部分。
图3.3 LED部分本文引用地址://m.amcfsurvey.com/article/172695.htm
3.2.4 开发板和无线数据传输模块接口部分
这一部分有两部分组成:由于nRF2401的工作电压为1.9V-3.6V,工作电压超过3.6V就会烧坏芯片。而开发板的电源为5V,因此为了使系统工作,必需要有5V电平转换为3.3V电平的部分。为了实现这一过程,选用LM1117-MAX3.3作为核心芯片。LM1117是一个低压差电压调节器系列,其压差在1.2V输出,负载电流为800mA时为1.2V。LM1117提供电流限制和热保护,电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在±1%以内。LM1117系列具有LLP、TO-263、SOT-223、TO-220和TO-252 D-PAK封装;此外为了使两个模块直接相连,将P2口的部分引脚用排针引到一起,排针间距为 100mil,标准 DIP 插针。图3.4为开发板和无线数据传输模块接口部分,图3.5为5V电平转3.3V电平部分。
图3.4 开发板和无线数据传输模块接口部分
图3.5 5V电平转3.3V电平部分
3.2.5 键盘部分
图3.6 键盘部分
键盘部分用来实现人机通信。有四个按键开关构成,分别为S5(P3.3/INT1), S6(P3.4/T0), S7(P3.5/T0), S5(P3.2/INT0),正常情况下均为高电平。当键按下后,输出为低电平。由于四个键盘的组成一样,这里只画出了S5的电路图。图3.6为键盘部分。
3.3 无线数据传输模块
通过仔细的比较和反复的论证后,决定选用nRF2401芯片作为无线模块的核心芯片,它的特点在上一章已经详细论述,这里不在重复。nRF2401芯片的典型应用电路如图3.7所示。
图3.7 nRF2401芯片的典型应用电路
从图11可以看出,只需要很少外围电路就可以组成无线数据传输模块。
它与开发板的接口电路为图3.8
各个接口的要求如下:
(1) VCC脚接电压范围为 1.9V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。
(2) 除电源 VCC 和接地端,其余脚都可以直接和普通的 5V 单片机IO 口直接相连,无需电平转换。当然对 3V 左右的单片机更加适用了。
(3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。
(4)6脚,12脚为接地脚,需要和开发板的逻辑地连接起来。
图3.8 无线数据传输模块与开发板的接口电路
3.4 无线数据传输模块和开发板的PCB图设计
PCB板是一块绝缘材料,在表面合理安放各种电子元件,并安排连接电子元件引脚间的铜膜导线,在不同的表面间有连接不同表面的铜导孔。
随着电子技术的不断发展进步,PCB在复杂程度和应用范围方面都有了长足的进步,按复杂程度来分,可以将PCB板分为3类:1.单面印刷电路板;2.双面印刷电路板;3.多层印刷电路板。为了方便布线,本系统所用的开发板和无线数据传输模块均为双层印刷电路板。
PCB的生成主要由四个过程组成:其一是原理图的生成;其二是根据已经生成的原理图产生对应的网络表,网络表是PCB图和原理图的纽带;第三步是新建一个PCB文件,并导入网络表;第四步是将合理布局元件,并用导线将元件的引脚连起来。
3.4.1 开发板的PCB图
将开发板的原理图按照以上的步骤生成相应的PCB图。如图3.9所示:
在PCB图设计的所有过程中,原理图在上一节已经生成。网络表的生成也比较简单。由于PCB图上使用元件的封装来代表元件,因此原理图中各个元件都要明确有自己的封装方式,而且在绘制PCB图前必须将用到的封装所在的封装库调入。否则,在调入网络表的过程中将会出现元件丢失的错误。
图3.9 开发板的PCB图
开发板上主要用到两个封装库:Advpcb.ddb和Miscellaneous.ddb.另外由于USB电源接口,电源开关,键盘和四位八段数码管没有对应的封装,因此需要使用元件库编辑器建立新元件封装。图3.10为键盘封装,图3.11为USB封装,图3.12为开关封装,图3.13为四位八段数码管封装。
图3.10 键盘封装 图3.11 USB封装
图3.12 开关封装 图3.13 四位八段数码管封装
各个元件的封装的引脚的序号必须和原理图中引脚的序号保持一致,不然将会在调如网络表过程中出现管脚丢失的错误。
下面再重点分析一下布线的过程。
布线是完成产品设计的重要步骤,可以说前面的准备工作都是为它而做的,在整个PCB中,以布线的设计过程限定最高,技巧最细、工作量最大。本系统的PCB布线为双面布线,布线的方式有两种:自动布线及交互式布线。但由于自动布线效果不好,往往实际的效果和预计效果有很大的出入,因此全部使用交互式布线。布线过程中充分考虑到如何降低元件字之间互相的干扰。
首先根据印制线路板电流的大小,尽量加租电源线宽度,减少环路电阻,它们的关系是:地线>电源线>信号线。同时使电源线、地线的走向和数据传递的方向一致,这样有助于增强抗噪声能力。线条有讲究:有条件做宽的线决不做细;高压及高频线应园滑,不得有尖锐的倒角,拐弯也不得采用直角。
由于采用双层设计,因此不可避免地将会使用到过孔。过孔太多,沉铜工艺稍有不慎就会埋下隐患。所以,设计中应尽量减少过线孔。此外,应该合理布置电源滤波/退耦电容:一般在原理图中仅画出若干电源滤波/退耦电容,但未指出它们各自应接于何处。其实这些电容是为开关器件(门电路)或其它需要滤波/退耦的部件而设置的,布置这些电容就应尽量靠近这些元部件,离得太远就没有作用了。
3.4.2 无线数据传输模块的PCB图
由于无线数据传输模块的核心芯片工作在2.4GHZ,因此在设计PCB图时对干扰的控制要格外重视。在PCB设计时,必须考虑到各种电磁干扰,注意调整电阻、电容和电感的位置,特别要注意电容的位置。
nRF2401的PCB为双层板,底层一般不放置元件,顶层的空余地方敷上铜,这些敷铜通过过孔与底层的地相连。nRF2401的供电电源应通过电容隔开,这样有利于给nRF2401提供稳定的电源。在PCB中,尽量多打一些通孔,使顶层和底层的地能够充分接触。nRF2401模块的PCB如图3.14所示。
图3.14 无线数据传输模块的PCB图
第四章硬件驱动程序和串行口调试工具
驱动程序是硬件电路的灵魂,没有驱动的硬件电路是没有用的。STC89C58RD+是51类单片机,可以像开发其他51单片机驱动一样开发它的驱动程序。单片机软件开发平台选择比较流行的Keil uVision2,因为现在关于Keil uVision2软件的资料很多,这样上手就会很快。
串行口调试工具是用来将PC机上的数据通过串行口发送到单片机,和PC机接收从单片机发送过来的数据。选用Visual C++ 6.0来开发串行口调试工具,Visual C++ 6.0是微软公司推出的一款优秀开发工具,代码紧凑,运行速度快,而且比较适合低层开发。
4.1 硬件驱动程序
整个数据传输系统有两部分组成:与PC机相连的开发板为主机端,它不能移动,接收从机端发送过来的数据,并向从机端发送指令;可以移动的为从机端,它由开发板和无线数据传输模块组成。由于两端的地位和功能不同,因此对应的驱动程序也不同。
使用Keil uVision2开发硬件驱动程序,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。51 的编程语言常用的有二种,一种是汇编语言,一种是 C 语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而 C 语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且 C 语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用 C 语言的开发周期通常要小于汇编语言很多。综合以上C语言的优点,在开发时选择了C51语言.
4.1.1 主机端硬件驱动程序
主机端的硬件驱动程序主要有两种功能:实现开发板通过串行口和PC机通信;实现开发板通过某些I/O口和无线数据传输模块进行通信。
STC89C58RD+单片机的串行口是一个全双工通信接口,即能同时进行发送和接收,它可以作UART用,也可以作为同步移位寄存器用,其祯格式和波特率可以通过软件编程来设置,在使用上非常方便。
STC89C58RD+单片机串行口的工作方式和波特率由控制寄存器SCON和特殊功能寄存器PCON组成。
串行口控制寄存器SCON:
D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 TI RI
特殊功能寄存器PCON:
D7 D6 D5 D4 D3 D2 D1 D0
SMOD
串行口可以通过软件设置四种工作方式,各种工作方式的数据格式和波特率均有所不同,这四种工作方式如下:
1. 方式0
当设定SM1、SM0为00时,串行口工作于方式0,在方式0下,RXD为数据输入/输出端,TXD为同步脉冲输出端,发送或接收的数据为8位,低位在前,高位在后,方式0的波特率固定震荡频率的1 /12,也就是每一机器周期传送一位数据。方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。发送完毕后,硬件自动将TI置1。再次发送数据前,需要软件将TI位清0。
REN为1时,单片机允许接收数据。RXD为数据接收端,接受数据保存到SBUF接收缓冲器中。发送完毕后,硬件自动将RI置1。再次接收数据前,需要通过软件将RI清0。
2. 方式 1
当设定SM1、SM0为01时,串行口工作方式1。方式1为波特率可变的8位异步通信方式,由TXD发送RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前)和1位停止位(高电平),波特率取决于定时器 的T 溢出率(1/溢出周期)和波特率的选择位SMOD。
3.方式2和方式3
当设定SM0、SM1为10或11时,串行口工作于方式2或方式3,这两种方式都是9位异步通信,仅波特率不同,适用于多机通信。在方式2或方式3下,数据由TXD发送RXD接收,1帧数据为11位,1位起始位(低电平),8位数据位(低位在前),1位可编程位(第9位数据,用作奇偶校验或地址/数据选择),1位停止位(高电平)。与方式1相比,多了一位可编程位,发送时,第9位数据为TB8,接收时,第9位数据送入RB8。
通过以上单片机串行口各种工作方式的比较,由于使用一个开发板和PC机进行单独的通信,因此工作方式1比较适合系统的要求。通过设置合适的波特率和帧格式,来实现开发板和PC机之间准确的数据传递。
由于PC机和单片机的处理速度的不同,PC机给开发板发送数据时,单片机采用中断的方式进行数据接收。通过软件设置单片机的传输属性参数为”9600,N,8,1″,来实现和PC机端串行口传输速率同步。开发板向PC机发送数据时,采用查询方式,这样可以节省单片机有限的资源。
开发板还要通过专门的接口和无线数据传输模块进行数据交换,由于系统设计为点对点通信,因此只使用了nRF2401一个信道。nRF2401的数据传输方式为同步传输,因此使用普通的I/O口通过软件方式模拟SPI方式传输。
nRF2401有四种工作模式:收发模式,配置模式,空闲模式和关机模式[16][17]。工作模式由PWR_UP 、CE、TX_EN和CS三个引脚决定,详见表4.1。
表4.1 nRF2401的各种工作模式的设置方式
工作模式 PWR_UP CE CS
收发模式 1 1 0
配置模式 1 0 1
空闲模式 1 0 0
关机模式 0 * *
前文已经讲过有关nRF2401的收发方式,这里重点讨论一下它的配置方式。nRF2401的所有配置工作都是通过CS、CLK1和DATA三个引脚完成,把其配置为ShockBurstTM收发模式需要15字节的配置字。
ShockBurst TM的配置字可以分为以下四个部分:
(1) 数据宽度:声明射频数据包中数据占用的位数。这使得nRF2401能够区分接收数据包中的数据和CRC校验码;
(2) 地址宽度:声明射频数据包中地址占用的位数。这使得nRF2401能够区分地址和数据;
(3) 地址:接收数据的地址,有通道1的地址和通道2的地址;
(4) CRC:使nRF2401能够生成CRC校验码和解码。
nRF2401的配置字如表4.2所示:
在配置模式下要保持PWR_UP引脚为高电平,CE引脚为低电平,配置字从最高位开始,依次写入nRF2401。在CS引脚的下降沿,新送入的配置字开始工作。
表4.2 nRF2401的配置字
位 位数 名字 功能
Shockb
Brst T
M 配置 143:120 24 TEST 保留
119:112 8 DATA2_W 接收频道2有效数据长度
111:104 8 DATA1_W 接收频道1有效数据长度
103:64 40 ADDR2 接收频道2的地址,最高为5字节
63:24 40 ADDR1 接收频道1的地址,最高为5字节
23:18 6 ADDR_W 接受频道地址位数
17 1 CRC_L 8位或16位CRC校验
16 1 CRC_EN 使能CRC校验
常用器件配置 15 1 RX2_EN 使能第二频道
14 1 CM 通信方式设置
13 1 RFDR_SB 发射数据速率
12:10 3 XO_F 晶震频率
9:8 2 RF_PWR 发射输出电源
7:1 7 RF_CH# 频道设置
0 1 RX_EN 接收或发送操作
开发板通过串行口和PC机交换数据的流程图如下:
图4.1 开发板和PC机通过串行口交换数据的流程图
开发板通过IO口和无线数据传输模块进行数据交换的流程图为图4.2。
图4.2开发板通过IO口和无线数据传输模块进行数据交换的流程图
4.1.2 移动端驱动程序
移动端的开发板的结构和PC机端的开发板的结构完全相同,但由于它不需要和PC机通信,只需要和无线数据传输模块进行通信。因此相对另一端的驱动简单一些。具体编程规则在上一节已经详细叙述,这里不再多说,具体的程序是PC机端程序的一部分。
4.2 串行口调试工具
串行口调试工具是用微软公司的visual c++6.0[20][21]开发的。几乎所有世界级的软件,从业界领先的Web浏览器到面向任务的企业应用,都是使用Microsoft Visual C++开发系统来开发的。要用C++来开发Windows和Web上的高性能应用程序,Visual C++是效率最高的首选工具。Visual C++ 6.0在不牺牲灵活性、性能和控制力度的同时,给C++带来了更高水平的生产效率。它具有可视化的界面,封装了大量的类,使界面制作变的很简单,使用它可以方便快捷地开发Windows环境下的应用程序。visual c++6.0专门为串行口通信提供了Mscomm[20][21]控件,使用该控件程序员不必花时间去了解比较复杂的API函数,通过简单修改控件的属性和使用控件提供的方法就可以实现对串口的配置,完成串口发送和接收数据。
4.2.1串行通信的基本原理
串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。 在Windows环境下,串口是系统资源的一部分。 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API通信函数。在本次课程设计中,所用到的是MFC的MSComm控件,下面先将这个关键的控件做一下简单的介绍。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,为应用程序提供串行通信功能,它为应用程序提供了通过串行接口收发数据的简便方法。MSComm控件在串口编程时非常方便,其实际上是调用了API函数,但我们不必再了解复杂的API函数就可控制串行通信。通信的过程,实际上是对属性的操作和对控件事件的响应。
在Windows操作系统中,串行通信采用”事件通知”方式,支持数据按块传送。进行通信时,Windows开辟一个用户定义的输入输出缓冲区,每接收一个字符就产生一个低级硬件中断,串行驱动程序立即取得控制权,并将字符放入输入数据缓冲区,然后将控制权返还正在运行的应用程序。如果输入数据缓冲区满了,驱动程序用当前定义的流控制机制通知发送方停止发送数据。发送数据也采用类似的处理方式,应用程序将需要发送的数据放入输出数据缓冲区,串口每发送一个字符就产生一个低级硬件中断。
Visual C++ 6.0通信控件Mscomm提供了功能完善的串口数据的发送和接收功能,Mscomm 控件具有两种处理方式:一是事件驱动(Event-driven)方法,一是查询法。
1)事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。
2)查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的”确定”响应。
在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。
在VC++中,MSCOMM控件只对应着1个C++类–CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。
MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性。
表4.3 MSCOMM控件的重要属性
属 性 说 明
CommPort 通信端口号
Settings 以字符串形式表示的波特率、奇偶校验、数据位
PortOpen 通信端口的状态,打开或是关闭
Input 接收数据
Output 发送数据
InputMode 接收数据的类型:0为文本;1为二进制
表4.4 程序中用到的所有控件,以及它们的ID
控件 ID 标题
按钮 ID_SEND 发送
按钮 ID_CLEAR 清空
编辑框 IDC_EDIT_SEND
编辑框 IDC_EDIT_RCV
静态文本 IDC_STATIC 接收缓冲区
静态文本 IDC_STATIC 发送缓冲区
组框 IDC_STATIC 端口选择
单选按钮 IDC_1 端口1
单选按钮 IDC_2 端口2
mscomm IDC_MSCOMM
表4.5 用到的变量和变量的类型
Control IDS Type Member
IDC_EDIT_SEND CString m_str_send
IDC_EDIT_RCV CString m_str_recv
IDC_MSCOMM CMSComm m_mscomm
Object IDS Messages Function
ID_SEND BN_CLICKED OnSend
ID_CLEAR BN_CLICKED OnClr
IDC_1 BN_CLICKED On_Com1
IDC_2 BN_CLICKED On_Com2
IDC_MSComm OnComm OnComm
4.2.2程序设计原理
第一步:初始化串行口。调用SetCommPort()函数,选择使用的端口好,然后设置波特率发送接收的处理方式,以及数据的传输方式,最后将串口打开。
第二步:发送数据。将要发送的字符串变成特定的类型后,调用函数SetOutput(),将数据发送到发送缓冲区
第三步:接受数据。将接收缓冲区中的数据通过GetInput()函数读出,并将它转换为Cstring类型,显示在界面上。
程序的各个主要部分和一些流程图:
(1)登陆界面后,程序首先将接收缓冲区和发送缓冲区清空
程序如下:
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
(2)然后进行串行口的初始化,也即是设置MSComm控件的各种属性。首先要进行端口的选择,由于所用到的计算机只有两个串行口,因此本程序只给了两个选择,具体的程序代码如下:
void CMyDlg::On_Com1()
{
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE);
m_mscomm.SetCommPort(1);
m_mscomm.SetSettings(”9600,n,8,1″);
m_mscomm.SetRThreshold(1);
m_mscomm.SetSThreshold(0);
m_mscomm.SetInputLen(0);
m_mscomm.SetInputMode(1);
m_mscomm.SetPortOpen(TRUE);
}
void CMyDlg::On_Com2()
{
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE);
m_mscomm.SetCommPort(2);
m_mscomm.SetSettings(”9600,n,8,1″);
m_mscomm.SetRThreshold(1);
m_mscomm.SetSThreshold(0);
m_mscomm.SetInputLen(0);
m_mscomm.SetInputMode(1);
m_mscomm.SetPortOpen(TRUE);
}
1)CommPort:分别选1和2。
2) Setting设置或返回串行端口的波特率:9600、无奇偶校验位、数据位数为8、1位停止位。
3) InBufferSize:设置接收缓冲区为1024字节。
4) RThreshold:设置当接收缓冲区内字节个数为1时,触发MSCOMM的OnComm事件,然后由计算机将接收缓冲的数据读出,并将接收缓冲区清空。
5) InputLen:值为0,设置INPUT读取整个缓冲区的内容。
6) OutBufferSize:设置发送缓冲区为512字节。
(3)发送数据的源程序代码
void CMyDlg::OnSend()
{
if(!m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(TRUE);
UpdateData(TRUE);
m_mscomm.SetOutput(COleVariant(m_str_send)); //发送数据
}
将文本框内的字符串送到变量m_str_send中,然后将字符转化为ColeVariant类型的数据,再通过SetOutput函数将数据发送到发送缓冲区中。
(4)接收数据的源程序代码
void CMyDlg::OnComm()
{
VARIANT variant_tmp;
COleSafeArray safearray_tmp;
LONG len,i;
BYTE buf[2048];
CString str_tmp;
if(m_mscomm.GetCommEvent()==2)
{
variant_tmp=m_mscomm.GetInput();
safearray_tmp=variant_tmp;
len=safearray_tmp.GetOneDimSize();
for(i=0;ilen;i++)
safearray_tmp.GetElement(i,buf+i);
for(i=0;ilen;i++)
{
BYTE ch=*(char*)(buf+i);
str_tmp.Format(”%c”,ch);
m_str_recv+=str_tmp;
}
}
UpdateData(FALSE);
}
当m_mscomm.GetCommEvent()==2时候,数据到来,触发OnComm事件,调用该函数。首先通过m_mscomm.GetInput()将接收缓冲区内的数据读到变量variant_tmp中,再将variant_tmp赋予safearray_tmp来实现数据类型转化为ColeSafeArray。通过safearray_tmp.GetOneDimSize()求出接收到的字符的总长度,再将每个ColeSafeArray变量转化为Byte类型的变量,最后转化为字符类型,并将它显示在文本框内。
void CMyDlg::OnComm() 的流程图:
图4.3 void CMyDlg::OnComm() 的流程图
(5)清空功能函数源代码
void CMyDlg::OnClr()
{
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
}
总的程序流程图如图4.4所示
图4.5是PC机通过端口1向单片机发送数据时候的图型界面。进入界面后,首先要进行根据连接的串行口选择要初始化的端口,然后使用键盘在发送缓冲区内输入一系列的字符。等单片机开发板上电后,单击发送按键将数据发送出去。
图4.6是PC机通过串口接收单片机发送过来的数据时候的图形界面。在缓冲区接收的数据为二进制形式,程序内已经将这些二进制转化为字符串在界面上显示。
图4.7是串行口调试工具初始运行时候的图形界面。
事件驱动方式时,由计算机直接管理,字节之间不可控,而且单片机串行口和PC机串行口速率差别较大,接收程序一定要精心合理的设计,才能使传输稳定可靠,否则很容易出现意想不到的问题。在调试过程中,如果不小心将串行口调试工具的波特率和开发板串行口的波特率设置为不同,就会出现错误。程序中已经将串行口的波特率设置为9600bps,这样可以避免错误。
图4.5通过端口1进行发送时候的图型界面
图4.6 通过串口接收时候的图形界面
图4.7 串行口调试工具的运行界面
第五章 总结与展望
5.1 全文总结
通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
首先在毕业设计刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。通过对这些资料的学习,我大致了解了无线通信的发展现状以及未来的发展趋势,认识到目前无线通信方面的各种各样的协议,以及它们之间的竞争。了解了无线通信方面的先进技术,这些都为我未来的学习指明了方向。
我毕业设计主要涉及硬件和软件两个方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先在硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel 99 SE设计原理图和简单的PCB图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系列单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路的引脚和连接方法,如LED数码管,键盘等。
在软件方面,通过串行口调试工具的开发,我基本掌握了Visual C++ 6.0的使用方法,加深了对类封装的理解。通过开发板驱动程序的开发,使我熟练掌握了Keil uVision2,熟悉了51系列单片机内部的寄存器和编程规则,以及如何控制外围电路。
当然,由于单片机功能的局限性,当面对很复杂的系统时像无线点菜系统,单片机就不太合适。这是因为单片机的引脚过少,能够使用操作系统过于简单,不能进行复杂的工作调度,也不能驱动复杂的外围电路,因此使用单片机完全实现点菜系统的要求比较困难。
近几年来,处理器已经发展到32位机,尤其是以ARM(Advanced RISC Machines)为内核的32位处理器受到越来越多嵌入式开发人员的青睐。ARM处理器支持复杂的嵌入式操作系统,例如Win CE,UClinux等。可以进行复杂的功能调度,而且能够驱动比较复杂的外围电路例如触摸屏等。这样使用ARM处理器和嵌入式操作系统,配合嵌入式移动数据库技术,更能完成点菜系统的要求。所以,毕业设计也给我将来的学习指明了一个方向。
单就本论文而言,主要完成了以下工作:
1.在ZigBee协议的基础上,以51系列单片机为处理器,配合一定的外围电路构建了硬件开发平台。
2.用C51语言为硬件部分编写驱动程序,并用Visual C++6.0开发了串口调试工具。
5.2 研究展望
目前,无线通信的各种技术呈现百花齐放的局面。但是随着经济的发展,人民需求的提高,无线通信技术依然有很大的发展空间。在以下方面仍然有很长的路要走。
1随着IP(Internet Protocol,网际协议)技术的发展,无线通信网和IP网有融合的趋势。尤其是多媒体信息需求的增加,多媒体信息对实时性要求不高的特点,使得利用无线通信网传输多媒体信息成为一大热门。
2随着人民生活水平的提高,生活方式的转变,无线通信技术必然向移动化和便携化方向发展。
3由于无线频谱资源有限和无线通信传输信道的特殊性,使得如何提高频谱资源的利用率以及提高抗干扰能力成为未来很热门的研究方向。
4 现代微电子技术发展迅猛,摩尔定理仍然有效,集成电路技术已经发展到SOC,32位的ARM处理器已经得到了广泛的应用。因此在未来越来越复杂的嵌入式系统开发中,32位处理器和嵌入式操作系统将得到更广泛的应用。
c++相关文章:c++教程
波段开关相关文章:波段开关原理
尘埃粒子计数器相关文章:尘埃粒子计数器原理
晶振相关文章:晶振原理
蓝牙技术相关文章:蓝牙技术原理
上拉电阻相关文章:上拉电阻原理
矢量控制相关文章:矢量控制原理
评论