PC与单片机的串口通信
PC与单片机的串口通信设计与实现
摘要
单片机经历TSCM、MCU、SOC三大阶段,以其超小型化、电路简单、功耗低等特点广泛应用于各个领域,本文提出了基于STC89C51单片机与PC串口通信的设计方案,从PC机对单片机数据的采集、显示,与PC机对单片机设备控制的两个方面分别论述。在介绍PC机与单片机之间串行通信硬件组成的基础上,详细介绍了在Windows环境下用VisualC++6.0的ActiveX技术设计串行通信程序的方法,并给出了通信程序中的部分关键源头代码。通过测定系统满足实时采集、实时处理和实时控制对速度的要求。
关键字:串行通信;VisualC++6.0;控件;单片机
Abstract
The design has been verificated, and the results show that the design can achieve a variety of functions.
Keyword:
第一章 绪论
1.1 单片机 概述
单片机也被称为微控制器[1] (Microcontroller),由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。它是70年代中期发展起来的一种大规模集成电路芯片,是CPU、RAM、ROM、I/O接口和中断系统集成于同一硅片的器件。单片机用于控制有利于实现系统控制的最小化和单片化[2],简化一些专用接口电路,如编程计数器、锁相环(PLL)、模拟开关、A/D和D/A变换器、电压比较器等组成的专用控制处理功能的单板式微系统。
按照用途不同,单片机可分为通用型与专用型两大类。
通用型:可开发的内部资源:RAM、ROM、I/O等功能部件,全部提供给用户。用户根据需要,设计一个以单片机芯片为核心的测试系统。
专用型:专门针对某些产品的特定用途而制作的单片机,针对性强且数量巨大。
1.2 课题的来源及研究意义
在各种单片机应用系统的设计中,常常遇到单片机与PC的通信问题,在速度要求不高、传送距离不远的场合一般采用RS232标准串行接口实现,在传送距离较远的场合,可以通过网络实现PC间的通信,与单片机相连的PC通过网络将数据发送到远程电脑,从而实现远程控制[3]。随着信息技术的发展,计算机和网络越来越普及,对单片机的远程控制与测量的要求也越来越多,而本地PC与单片机的串口通信是实现单片机远程控制的前提与基础。本文在结合现有研究的基础上,对相关的设计进行一定得改进和创新,设计一个本地PC机与单片机串口通信系统。通过VC可视化编程,使本地PC获取单片机指定存储器中数据,并并显示在PC程序页面上;也可通过VC可视化编程,控制单片机上的设备运行。
1.3本文所作的工作
本文主要研究了基于STC89C51单片机与PC的串口通信技术,并以此为基础
从两个方面进行设计实现。第一个方面,PC采集单片机中数据,以单片机采集温度,PC机获取温度并显示在人机界面上为实例。第二个方面,PC控制单片机中的设备,以通过PC中的人机界面,控制单片机上的LED灯状态。最后完成了代码编写、功能验证。
1.4论文的组织结构
第一章 对 单片机 进行了简要介绍,并对PC与单片机串口通信技术发展趋势以及本课题的来源和工作做了简要概述。
第二章 从整体上描述了STC89C51单片机结构和片内存储子系统。
第三章 对PC采集单片机数据的实现方案做了详细论述,主要论述了PC页面上VC代码的实现,与单片机中代码的实现。
第四章 对PC控制单片机设备的实现方案做了详细论述,主要论述了PC页面上的VC代码的实现、与单片机中代码的实现。
第五章 分别对两个方案进行了测试,充分验证了PC与单片机串口通信的正确性。
总结与展望 对本课题的工作做了小结,并谈了进一步研究和工作展望。 最后对给予我无私帮助的所有老师、同学和朋友表示感谢,并且给出本文的参考文献。
第二章 STC89C51单片机结构
STC单片机是一款增强型51单片机,完全兼容MCS-51[4]。STC89C51可以代替AT89C51,而且功能更强,速度更快,寿命更长,价格更低。该单片机具有40个引脚,采用双列直插DIP-40封装。STC89C51可以完成ISP在线编程功能,而AT89C51则不能。因此,将AT89C51中的程序直接烧录到STC89C51中后,STC89C51就可以代替AT89C51直接工作。STC推出的系列51单片机芯片全面兼容其它51单片机。STC89C51内部有E2PROM,可以再程序中修改,而且断电不丢失数据。此外,还增加了两级中断优先级等等,STC89系列单片机的基本特性如图所示:
图2.1 STC89C51结构
单片机89C51的串行端口有4种工作方式,通过编程设计,可以使其工作在任一方式,以满足不同场合的需要[5]。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;方式1主要用于双机之间或外设电路的通信;方式2、3除有方式1的功能外,还可用作多机通信,以构成多微机系统,方式2、3的区别在于波特率的不同。
单片机的串行通信的波特率[6]可以程控设定,在不同的工作方式下,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定。
单片机的串行端口有2个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率以及中断标志TI和RI。
单片机的串行端口有1个数据寄存器SBUF,该寄存器为发送和接收所共有,在一定条件下,向SBUF写入数据就启动了发送过程,读SBUF就启动了接收
过程。
单片机可以采用循环方式或中断方式实现串行数据的传送。在循环方式下,单片机循环对数据寄存器SBUF进行读写来实现数据的接收和发送;在中断方式下,对方式1、2来说,1帧数据发送或接收完后,TI/RI自动置1,请求串行中断,若CPU响应中断,则执行串行中断服务程序,并把TI/RI清0以再次响应中断。对在方式2、3下的接收,还要视串口控制寄存器SCON的设置才可确定RI是否被置位以及串口中断是否开放。
实时控制中,由于事件的突发性,常采用中断的方式进行数据传送,中断方式能更大限度地提高资源的利用率,使CPU在不进行数据通信时做其他的工作。下面重点介绍单片机在方式1下的中断方式编程[7]。
方式1是10位异步通信方式,其中包括1个起始位,8个数据位和1个停止位。波特率由定时器T1的溢出率和串口控制寄存器SMOD的状态确定,在CPU的晶振为11.0592MHz时,波特率常采用9600b/s。
第三章 PC采集单片机数据
本文中采用STC89C51单片机采集周围环境温度,PC机从单片机中取得该温度,并在人机界面显示出来。
系统由三个部分组成,分别是:数据采集部分[8]、单片机控制电路部分、PC机人机界面部分。
数据采集部分负责将模拟信号采入,转换成较小模拟信号传送给控制电路。由于单片机需要的是数字信号,因此,所采数据还需经过A/D转换芯片的转换才能送给单片机。
其中单片机控制电路部分为整个测试仪的核心部分,单片机要实现对硬件电路的控制。在主控电路板上,所有元件在允许范围内要排列紧密,减小电路板的面积,以期减小测试仪的体积,使测试系统尽可能小型化。
单片机与计算机连接是通过串行通讯实现的。单片机和计算机两部分的串口是通过标准串行通讯协议连接起来,以供数据传输,而在计算机终端需要编写一个人机界面来实现这一连接,这一界面用VisualC++6.0程序语言来编写,最终的数据处理以及图形显示都在这一界面里完成。
3.1 数据采集系统
数据采集(Data Acquisition)是信号分析与处理的一个重要环节,在许多工业控制与生产状态监控中,都需要对各种物理量进行数据采集与分析。试验测试产生的物理信号通过传感器转换为电压或者电流一类的电信号,然后通过数据采集卡将电信号采集传入PC ,借助软件控制数据采集卡进行数据分析、处理。数据采集系统一般由传感器,信号调理电路,A/D转换,数据采集卡,接收端组成。数据采集原理图如图所示
图3.1 数据采集原理图
系统的信号采集模块使用DS18B20温度传感器,它是Dallas公司生产的单总线(One-wire)数字化温度传感器,采用单根信号线传输数据,而且数据传输是双向的。能直接读出被测温度,不需使用A/D转换模块。因此可以通过简单的编
程实现温度显示与温度控制。
图3.2 DS18B20芯片结构
DS18B20具有如下特性:
1.测试范围:-55-125℃
2.转换精度:9-12位(包括符号位),可编程决定转换精度的位数。
3.测温分辨率:9位精度为0.5℃,12位精度为0.0625℃。
4.转换时间:9位精度为93.75ms,12位精度为750ms。
5.具有非易失去性,上、下 设定功能。
DS18B20采集的信号,由于已经为数字信号,因此直接存入单片机的外部数据存储器中;之后单片机将采集到的数据送入上位机,由VC6.O编写的数据处理软件进行处理显示。
3.2 硬件系统设计
3.2.1 系统结构图
图3.3 系统结构图
3.2.2 元器件的选择
单片机选择STC89C5l,STC系统单片机具有超强抗干扰性、高抗静电性、较低功耗,Power Down
信号采集模块使用DS18B20温度传感器。存储器选择Atmel公司的Ar24C32芯片,它是32K的电可擦写的EEPROM芯片。串行通讯选择常用的MAX232芯片,使用简单方便,加几个电容即可完成单片机与PC机的连接。
3.2.3 供电模块设计
本系统是单一电源系统,使用共地电源:+5V,在实验室内可提供两种供电方案:一是使用直流稳压电源,调节出+5V电压为系统供电;另一种方案是考虑到PC机的USB传输接口正是+5V电压,因此可以采用直接用PC机自带的USB接口为系统供电。PC机的USB接口由四根线组成:VCC、D+、D-、GND,本文主要用USB提供电源,因此只用到VCC和GND两根线,焊接时要注意不能错焊到D+或D-引脚上,否则Windows系统会提示“发现不可识别的设备”。
3.2.4 振荡复位电路
8051内部有一个高增益反相放大器,用于构成振荡器,引脚XTALl和XTAL2分别是此放大器的输入端和输出端。在XTALl和XTAL2两端跨接晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,见图
3.4。外接晶振时,C1和C2值通常选择为30pF左右;外接陶瓷谐振器时,Cl和C2约为47pF。Cl、C2对频率有微调作用,振荡频率范围是1.2MHz~12MHz。为了减少寄生电容,更好地保证振荡器稳定可靠地工作,谐振器和电容应尽可能安装得与单片机芯片靠近。
图3.4晶振电路
计算机在启动运行时,都需要复位,使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
图3.5 复位电路
8051复位结构见图3.5。复位引脚RST/VPD[10]通过片内一个斯密特触发器(抑制噪声作用)与片内复位电路相连,斯密特触发器的输出在每个机器周期的S5P2由复位电路采样一次。当RST/VPD引脚端保持两个机器周期(24个振荡周期)以上的高电平时,8051进入复位状态。
复位时,ALE和PSEN成输入状态,即ALE=PSEN=l,片内RAM不受复位影响。
复位后,PC指向0000H,使单片机从起始地址0000H开始重新执行程序。所以单片机运行出错或进入死循环,可按复位键重新启动。
单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。系统出现“死机"、“程序跑飞”等现象,主要是单片机的复位电路设计不可靠引起的。
复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。复位时必须使RST引脚加上持续两个机器周期(即24个振荡周期)的高电平。
本文采用时钟频率为12MHz,每机器周期为1μs,则只需2μs以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。
本文采用按键复位电路。该电路除具有上电复位功能外,若要复位,只需按
3.2.5 通讯接口设计
单片机与PC机进行通讯是通过串行通讯完成的。串行通讯是CPU与外界交换信息的一种基本通信方式。串行通讯分为同步和异步两种方式,同步通讯没有开始和结束的标志位,因此传输速度高,但这种方式对硬件结构要求较高;异步通讯设有一个起始位“0"和一个停止位“1",通讯双方只需按约定的帧格式来发送和接收数据,所以硬件结构比同步通讯方式简单,此外它还能利用校验位检测错误,所以这种通讯方式应用较为广泛。本文选择串行异步通讯[8],半双工传送方式,无奇偶校验位,即为常见的N.8.1帧格式。
3.3 单片机中软件系统设计
3.3.1 软件开发环境
(1)KEIL uVision2集成开发环境
KEIL软件是KEIL公司的产品。KEIL公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C5l编译器的功能不断增强,使用户可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uⅥsion2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVisioll2 DE可为它们提供单一而灵活的开发环境。
(2)ISP在线烧写程序软件
传统的编程方式,以单片机应用系统开发为例,如果想要对单片机进行写入程序[11],必须要先把单片机从电路板上取下来,然后用编程器进行编程烧写,写入程序后再次插入电路板调试。
ISP(In—System Programming)在线系统编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。无论在单片机上,还是在CPLD/FPGA上都得到了广泛的应用,ISP技术是未来发展的方向!
3.3.2 数据采集程序
采用DS18B20温度传感器采集温度,产生的为数字信号,因此无需使用A/D转换器。
主要步骤如下:
1. 启动并初始化DS18B20设备,代码如下:
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
2. 通过数据线向DS18B20中写入数据,代码如下:
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。
15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
3. 从DS18B20读出数据[12],并解析出温度,代码如下:
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负 { tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1; fg=0; //读取温度为负时fg=0
}
}
3.3.3 单片机中串口通信程序
在串行通信中[13],收发双方对发送或接收的数据速率(即波特率)要有一定的约定。通过软件对805l串行口编程可约定4种工作方式,本文选择方式l,可通过对串行口控制寄存器SCON编程实现。方式1波特率=2^SMOD/32·T1溢出率。
当定时器T1作波特率发生器使用时,通常是选用自动重装载模式,即模式2。在模式2中,TLl作计数用,而自动重装载的值放在THl内,设计数初值为X,那么每过“256-X”个机器周期,定时器T1就会产生一次溢出。为了避免因溢出而产生不必要的中断,此时应禁止T1中断。溢出周期为:
12/fosc·(256一X)
溢出率为溢出周期之倒数,所以
波特率=2^SMOD/32·fosc/(12·(256-X))
则定时器T1方式2的初始值为:
X=256-fosc·(SMOD+1)/(384·波特率)
本文选用定时器T1工作方式2作波特率发生器,波特率为9600波特[14],设波特率控制位SMOD为l,则
X=256一11.0592·10^6·(1+1)/384·19200=253=FDH
所以THl=TLl=FDH disbuf[3] = sdate/10; disbuf[2] = sdate%10; disbuf[1] = xiaoshu1; disbuf[0] = xiaoshu2; sdate = tempL/16+tempH*16; //整数部分 xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位 xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位 xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
串行通信部分下位机端用于单片机初始化的部分程序:
void main()
{
} TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; //串口初始化 SM0=0; SM1=1; EA=1; //开启总中断 ES=1; while(1) { } ES=0; num=0; SBUF=a;//数据a为温度(已经从温度传感器中获取到)发送数据while(!TI); TI=0; ES=1; //用定时器设置串口波特率 9600 a到SBUF,即将单片机的数据发送到计算机
3.4 PC中软件系统设计
3.4.1 MSComm控件
由于系统需要进行数据通讯,因此要用到VC6.0的通信功能[15]。MSComm控件是VC6.O提供的串行通信控件,利用它可以很方便的实现设备之间的串行口通信。它允许上位机与其他通信设备(如单片机)建立串口通信,还可以发送命令、进行数据交换以及监视和响应在通信过程中所发生的各种错误和事件,从而可以利用它创建全双工的、事件驱动的、高效实用的通信程序。
MSComm控件提供了两种处理通信问题的方法:事件驱动法和查询法。事件驱动通信是处理连接端口通信的一种有效方法。在串口接收缓冲区有字符,CD或TRS线上一个字符到达或一个变化发生的情况下,可利用MSComm控件的OnCom事件捕获并处理这些通信事件。OnCom事件还可以检查和处理通信错误。编程过程中可在OnCom事件处理函数中加入相应的处理代码。这种方法的优点是程序响应及时、可靠性高。
3.4.2 在VC程序中插入MSComm控件
打开VC++6.0,建立一个基于对话框的MFC应用程序,选择Project菜单下Add To Project子菜单中的 Components and Controls„选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。 选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在
ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图3.6所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
图3.6 VC控件列表
利用ClassWizard定义CMSComm类控制对象,打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时,在对话框头文件中自动加入了
//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES。
3.4.2 打开串口和设置串口参数
在程序中做一个打开串口按钮,在该按钮的处理函数中打开串口,如下代码:
图3.7 串口初始化页面
void CMyDlg::OnButtonOpenck()
{
小
m_Comm.SetInputLen(0);//设置接受的长度 if(!m_Comm.GetPortOpen()) { // TODO: Add your control notification handler code here //打开串口 CString SetSettings; UpdateData(true); SetSettings=m_strBaudRate+","+m_strParity.Mid(0,1)+","+m_strDa//关闭串口 if(m_Comm.GetPortOpen()) m_Comm.SetPortOpen(false);//必须在关闭串口的情况下对串口进taBits+","+m_strStopBits; 行初始化 m_Comm.SetCommPort(atoi(m_strCkNum.Mid(3,1)));//设置串口号 m_Comm.SetRThreshold(1);//设置响应事件发生的条件 m_Comm.SetInputMode(1);//以二进制方式接受数据 m_Comm.SetSettings(SetSettings);//设置波特率 m_Comm.SetInBufferSize(1024); m_Comm.SetOutBufferSize(521);//设置接收缓冲区与发送缓冲区的大
m_Comm.SetPortOpen(true);//串口初始化后打开串口 GetDlgItem(IDC_BUTTON_CLOSECK)->EnableWindow(true); GetDlgItem(IDC_BUTTON_OPENCK)->EnableWindow(false); //当前状态 m_ctrlPortStatus="STATUS:"+m_strCkNum+"
OPENED"+","+m_strBaudRate+","+m_strParity+","+m_strDataBits+","+m_strStopBits;
}
3.4.3添加串口事件消息处理函数OnComm()
打开ClassWizard->Message Maps,选择对话框类,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,刚才添加的函数就会执行,在OnComm()函数加入相应的处理代码就能实现想要的功能了。在函数中加入如下代码:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 } m_ctrlIconOpenoff.SetIcon(m_hIconRed); UpdateData(false);
for(k=0;k
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strRXData+=strtemp; //加入接收编辑框对应字符串 }
}
UpdateData(FALSE); //更新编辑框内容
}
下图为人机界面的数据接收显示窗体[16],窗体中文本框是用来显示单片机通过串口发给主机的温度数据。
图3.8 温度显示页面
3.5 本章小结
本章详细介绍了PC采集单片机数据的数据采集模块,硬件系统设计,单片机软件的组成与PC软件的组成,其中包括数据采集程序、以单片机为下位机的通信程序设计、MSComm的属性和驱动事件、以PC机为上位机的通信程序设计,以及人机界面部分的结构和功能。
第四章 PC控制单片机设备
本章主要以PC中的人机界面,控制单片机上的LED灯设备状态为例,论证了PC通过串口控制单片机设备的正确性。
系统由两部分组成,分别是:PC机人机界面部分、单片机控制电路部分。 单片机与计算机连接是通过串行通讯实现的[17]。计算机人机界面来用VisualC++6.0程序语言来编写,修改人机界面上设备状态控制单片机上对应的设备。上一章已经对单片机的硬件设计,VC中MSComm控件作了详细说明,本章不再累述,只从单片机软件设计与PC页面的软件设计两方面作详细讲述。
4.1 PC中软件系统设计
4.1.1 获取页面的选择状态
PC上人机界面如下图所示,选择需要点亮的LED灯,点击发送按钮,将数据发送至单片机。
图4.1 人机交互页面
将左侧的8个多选框控件关联到8个BOOL类型的变量中,当点击发送按钮时,通过读取这8个变量可以获取到页面的选择结果。代码如下所示:
void CMyDlg::OnSendData()
{
UpdateData(TRUE);//将页面数据存入关联的变量中
short state = m_check1 + m_check2
//调用串口发送数据
CString senddata;
senddata.Format(%d,state);
m_Comm.SetOutput(COleVariant(senddata)); //发送8位数据
TX_count+=m_strSend.GetLength(); //发送计数
CString strTemp;
} strTemp.Format("TX:%d",TX_count); m_ctrlTXCount.SetWindowText(strTemp); //显示计数 GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE); UpdateData(false);
4.1.2 向串口发送数据
代码如上所示,调用m_Comm控件的SetOutput方法向串口发送数据。
4.2 单片机中软件系统设计
单片机与电脑通过串口连接,单片机一直监听串口中数据,当接收到数据时,从缓存中取得数据[18],将数据各个位赋值到相应LED管脚,从而实现页面对单片机设备的控制。实现代码如下:
void main()
{
TMOD=0x20; //用定时器设置串口波特率 9600
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1; //开启串口中断
while(1)
{
if(num==1)
{
LED=dat;//将PC中传来的数据赋值给LED灯管脚
ES=1; //打开串口中断
num=0;
}
}
}
4.3本章小结
本章主要介绍了PC通过串口控制单片机设备的实现方案,以PC控制单片机LED灯为例,介绍了PC上人机界面的软件实现,以及单片机中的通信程序的实现。
第五章 实验及结果分析
PC采集单片机温度实验,数据分为两部分,一部分为实验时单片机测量到的温度值;另一部分为PC从单片机获取到的温度值[19]。通过对比同一时间的两部分数据,可以验证串口通信的正确性,与实时性。为了能够方便验证,将单片机采集到的温度数据显示在单片机中的数码管上。
使用上面的验证方法对系统进行测试,在一定时间内,观察PC人机界面与单片机数码管上数据,经过严格的测试,发现最终所有的测试结果和预期得到的结果完全相同。
PC控制单片机LED管实验,通过人机页面控制单片机的LED[20],只需比较选择的结果与实际单片机LED结果,若一致则可以验证串口通信的正确性。同样经过反复测试,所有的测试结果和预期得到的结果完全相同。
总结与展望
本文的主要内容以PC与单片机的串口通信为背景。 本课题在分析了单片机结构与VC6.0中MSComm控件基础上,设计并实现了PC读取单片机温度与PC控制单片机LED灯两个实验。其中,PC读取单片机温度实验,单片机从温度传感器中取得温度[21],发送至串口,PC中页面当检测到该串口有数据时,触发MSComm控件的OnComm()消息,在其中读取串口数据并且把数据显示到页面的List控件中[22],以便查看。PC控制单片机LED等试验,在人机页面上选择各个灯的状态,并点击发送按钮,将触发按钮的按下事件,在其中完成页面数据的获取,并把数据发送给单片机,当单片机收到此数据后,作出对应的控制。 在完成了设计以后,又对部分代码进行了较为完备的功能验证,进行了语法排错和对一些比较明显的设计缺陷进行排查,功能较好地满足了设计要求。 通过本论文的研究工作,不仅锻炼了科研工作能力,为今后的系统开发积累 了经验,而且还为进一步探讨单片机的设计提供了很好的借鉴。
所有的设计和功能验证目前已经完成,实现的功能还需要扩展还需要大量的工作去做。随着单片机的广泛应用和网络的不断发展,与单片机的串口通信将成为远程控制[23]的前提,被越来越重视。
致谢
在本论文完成之际,对我的导师 教授表示衷心的感谢。在论文完成期间,正是老师的耐心指点,才使得我的研究工作能顺利完成。老师渊博的知识,严谨的治学态度,给我留下了非常深刻的印象。同时感谢学校为我提供了一个良好的研究环境。非常感谢我的同学们在学习上和生活上对我的帮助。和我一起学习的同学 、 、 ,对我学习和生活上的帮助很大。我们经常在一起讨论问题,推动了我的课题进展,在此向他们一并致谢。最后,感谢我的父母给予我的无私的精神支持和物质帮助。
参考文献
[1]涂时亮.单片微机控制技术.复旦大学出版社,1994:253~258
[2]李名兆.单片机技术的应用与发展.电子与自动化,1996年,笫05期
[3]周元庆,刘海龙.基于Windows的串行通信及单片机采集程序设计.计算机应
用,2000年,第06期
[4]Inter Corporation.MCS-5l family of single chip microcomputers user’s
manual.Santa Clara,Calif,1981.
[5]张迎新.单片机初级教程.北京航空航天大学出版社,1999
[6]刘焕平.MCS5l单片机与RS.232C串行口连接.石家庄职业技术学院学报,2002
年,第02期
[7]P.Neelamegam and A.Rajendran. Linear heating system for measurement of thermoluminescence using 8031/51 microcontroller.Bulletin of Materials Sciencc,Volume 26,Number 5/2003年8月
[8]雷淑英,尹绍宏,王秀清.单片机控制的数据采集系统.天津轻工业学院学
报,2001年,第03期
[9]朱民雄.单片机接口技术及其应用.北京航空航天大学出版社,1992
[10]Huang Ji-wu,Yang Hong-wei and Ming Feng.Study on an application using
AT89c5l to measure frequency in UHF and VHF.Wuhan University Journa1 of Natural Sciences,Volume 7,Number 1/2002年3月
[11]王修才.单片机接口技术.复旦大学出版社,1996
[12]曹茂永,冯彦军,张逸芳.单片机高速数据采集系统.数据采集与处理,1997
年,第02期
[13]林继建,吴明光.PC机和单片机串行通信程序设计.计算机应用研究,2001
年,第05期
[14]李绍平,彭志平.MCS.51单片机串行通讯波特率设置的误差分析.茂名学
院学报,2002年,第04期
[15]希望图书创作室.Visual C++6.0技术内幕[M].第5版.北京:北京希
望电子出版社,1999.
[16]陆一倩.微型计算机原理与应用,哈尔滨工业大学出版社,1995:45
[17]迟钦河,赵仲生,乔桂芳,黄波.89C5l单片机在多通道数据采集系统中的
应用.自动化仪表,2000年,第06期
[18]朱民雄.单片机接口技术及其应用.北京航空航天大学出版社,1992
[19]汤勃,徐立伟,饶润生.基于VB的PC机与单片机串行通信程序设计.武汉理
工大学学报(交通科学与工程版),2002年,第04期
[20]匡万,毛幼菊.单片机与PC机串行通信的研究.微计算机信息,1998年,第
04期
[21]邵毅.单片机系统低功耗设计在数据采集系统中的应用.海洋技术,2005
年,03期
[22]黄克强,方志宏,陈章位,马兵.基于Windows环境的计算机与单片机系统
间的串行通讯.机电工程,1998年,第02期
[23]刘志中,马家栋,孙丽芳.单片机控制远程抄表系统.微电子学与计算机,
2002年,第05期