PC与单片机的串口通信.docx
- 文档编号:9894258
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:25
- 大小:252.60KB
PC与单片机的串口通信.docx
《PC与单片机的串口通信.docx》由会员分享,可在线阅读,更多相关《PC与单片机的串口通信.docx(25页珍藏版)》请在冰豆网上搜索。
PC与单片机的串口通信
PC与单片机的串口通信设计与实现
摘要
单片机经历TSCM、MCU、SOC三大阶段,以其超小型化、电路简单、功耗低等特点广泛应用于各个领域,本文提出了基于STC89C51单片机与PC串口通信的设计方案,从PC机对单片机数据的采集、显示,与PC机对单片机设备控制的两个方面分别论述。
在介绍PC机与单片机之间串行通信硬件组成的基础上,详细介绍了在Windows环境下用VisualC++6.0的ActiveX技术设计串行通信程序的方法,并给出了通信程序中的部分关键源头代码。
通过测定系统满足实时采集、实时处理和实时控制对速度的要求。
关键字:
串行通信;VisualC++6.0;控件;单片机
Abstract
Thedesignhasbeenverificated,andtheresultsshowthatthedesigncanachieveavarietyoffunctions.
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.1STC89C51结构
单片机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数据采集系统
数据采集(DataAcquisition)是信号分析与处理的一个重要环节,在许多工业控制与生产状态监控中,都需要对各种物理量进行数据采集与分析。
试验测试产生的物理信号通过传感器转换为电压或者电流一类的电信号,然后通过数据采集卡将电信号采集传入PC,借助软件控制数据采集卡进行数据分析、处理。
数据采集系统一般由传感器,信号调理电路,A/D转换,数据采集卡,接收端组成。
数据采集原理图如图所示
图3.1数据采集原理图
系统的信号采集模块使用DS18B20温度传感器,它是Dallas公司生产的单总线(One-wire)数字化温度传感器,采用单根信号线传输数据,而且数据传输是双向的。
能直接读出被测温度,不需使用A/D转换模块。
因此可以通过简单的编程实现温度显示与温度控制。
图3.2DS18B20芯片结构
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系统单片机具有超强抗干扰性、高抗静电性、较低功耗,PowerDown 开发方便,而且价格低廉,而且其内核完全兼容51单片机,超强加密。 信号采集模块使用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)KEILuVision2集成开发环境 KEIL软件是KEIL公司的产品。 KEIL公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。 KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。 C5l编译器的功能不断增强,使用户可以更加贴近CPU本身,及其它的衍生产品。 C51已被完全集成到uⅥsion2的集成开发环境中,这个集成开发环境包含: 编译器,汇编器,实时操作系统,项目管理器,调试器。 uVisioll2DE可为它们提供单一而灵活的开发环境。 (2)ISP在线烧写程序软件 传统的编程方式,以单片机应用系统开发为例,如果想要对单片机进行写入程序[11],必须要先把单片机从电路板上取下来,然后用编程器进行编程烧写,写入程序后再次插入电路板调试。 ISP(In—SystemProgramming)在线系统编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。 无论在单片机上,还是在CPLD/FPGA上都得到了广泛的应用,ISP技术是未来发展的方向! 3.3.2数据采集程序 采用DS18B20温度传感器采集温度,产生的为数字信号,因此无需使用A/D转换器。 主要步骤如下: 1.启动并初始化DS18B20设备,代码如下: voidInit_DS18B20(void) { unsignedcharx=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中写入数据,代码如下: voidWriteOneChar(unsignedchardat) { unsignedchari=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],并解析出温度,代码如下: voidReadTemperature(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 } sdate=tempL/16+tempH*16;//整数部分 xiaoshu1=(tempL&0x0f)*10/16;//小数第一位 xiaoshu2=(tempL&0x0f)*100/16%10;//小数第二位 xiaoshu=xiaoshu1*10+xiaoshu2;//小数两位 disbuf[3]=sdate/10; disbuf[2]=sdate%10; disbuf[1]=xiaoshu1; disbuf[0]=xiaoshu2; } 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 串行通信部分下位机端用于单片机初始化的部分程序: voidmain() { TMOD=0x20;//用定时器设置串口波特率9600 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为温度(已经从温度传感器中获取到)发送数据a到SBUF,即将单片机的数据发送到计算机 while(! TI); TI=0; ES=1; } } 3.4PC中软件系统设计 3.4.1MSComm控件 由于系统需要进行数据通讯,因此要用到VC6.0的通信功能[15]。 MSComm控件是VC6.O提供的串行通信控件,利用它可以很方便的实现设备之间的串行口通信。 它允许上位机与其他通信设备(如单片机)建立串口通信,还可以发送命令、进行数据交换以及监视和响应在通信过程中所发生的各种错误和事件,从而可以利用它创建全双工的、事件驱动的、高效实用的通信程序。 MSComm控件提供了两种处理通信问题的方法: 事件驱动法和查询法。 事件驱动通信是处理连接端口通信的一种有效方法。 在串口接收缓冲区有字符,CD或TRS线上一个字符到达或一个变化发生的情况下,可利用MSComm控件的OnCom事件捕获并处理这些通信事件。 OnCom事件还可以检查和处理通信错误。 编程过程中可在OnCom事件处理函数中加入相应的处理代码。 这种方法的优点是程序响应及时、可靠性高。 3.4.2在VC程序中插入MSComm控件 打开VC++6.0,建立一个基于对话框的MFC应用程序,选择Project菜单下AddToProject子菜单中的ComponentsandControls…选项,在弹出的对话框中双击RegisteredActiveXControls项,则所有注册过的ActiveX控件出现在列表框中。 选择MicrosoftCommunicationsControl,version6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。 这时在ClassView视窗中就可以看到CMSComm类了,(注意: 此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图3.6所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。 图3.6VC控件列表 利用ClassWizard定义CMSComm类控制对象,打开ClassWizard->MemberViariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量: m_ctrlComm,这时,在对话框头文件中自动加入了//{{AFX_INCLUDES() #include"mscomm.h" //}}AFX_INCLUDES。 3.4.2打开串口和设置串口参数 在程序中做一个打开串口按钮,在该按钮的处理函数中打开串口,如下代码: 图3.7串口初始化页面 voidCMyDlg: : OnButtonOpenck() { //TODO: Addyourcontrolnotificationhandlercodehere //打开串口 CStringSetSettings; UpdateData(true); SetSettings=m_strBaudRate+","+m_strParity.Mid(0,1)+","+m_strDataBits+","+m_strStopBits; //关闭串口 if(m_Comm.GetPortOpen()) m_Comm.SetPortOpen(false);//必须在关闭串口的情况下对串口进行初始化 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.SetInputLen(0);//设置接受的长度 if(! m_Comm.GetPortOpen()) { m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PC 单片机 串口 通信