MATLAB环境下PC机与16位单片机串行通信的研究

合集下载

matlab中的串口通信通信系统设计

matlab中的串口通信通信系统设计

文章标题:探索Matlab中的串口通信系统设计在当前的现代通信系统中,串口通信系统设计已经成为一项至关重要的任务。

在Matlab中,借助各种工具和函数,我们可以设计出高效、稳定和灵活的串口通信系统。

本文将从简单到复杂、由浅入深地探讨Matlab中的串口通信系统设计,为读者提供全面的了解和深入的思考。

1. 串口通信系统概述在进行Matlab中的串口通信系统设计之前,我们首先需要了解串口通信系统的基本概念和原理。

串口通信是通过串行接口进行数据传输的一种通信方式,它在各种领域中都有着广泛的应用,包括嵌入式系统、通信设备、工业控制等。

Matlab作为强大的工程计算软件,为我们提供了丰富的工具和函数来进行串口通信系统设计,包括串口对象、串口配置、数据读写等功能。

2. Matlab中的串口通信基本操作在Matlab中,我们可以通过串口对象来进行串口通信的基本操作。

我们需要创建一个串口对象,并进行相应的配置,包括波特率、数据位、停止位、校验位等参数。

我们可以使用该串口对象来进行数据的读写操作,可以发送数据到外部设备,也可以接收来自外部设备的数据。

通过Matlab中丰富的串口函数,我们可以轻松实现串口通信系统的基本功能。

3. Matlab中的串口通信系统设计在实际的工程应用中,我们通常需要设计更加复杂和灵活的串口通信系统。

在Matlab中,我们可以借助信号处理工具箱、通信工具箱等功能来进行串口通信系统的设计。

通过信号处理工具箱,我们可以实现对串口数据的解调、调制、滤波等操作,从而提高通信系统的稳定性和性能。

而通信工具箱中的各种算法和工具则可以帮助我们实现更加复杂的通信协议和数据处理。

4. 个人观点和总结在我看来,Matlab是一款非常适合进行串口通信系统设计的软件,它不仅提供了丰富的工具和函数,还具备强大的计算能力和灵活的编程环境。

通过Matlab,我们可以实现从简单到复杂的串口通信系统设计,为各种应用场景提供定制化的解决方案。

单片机与PC之间的串行通讯 毕业论文

单片机与PC之间的串行通讯  毕业论文

毕业设计(论文)题目单片机与PC之间的串行通讯系(院)计算机科学技术系专业通信工程班级学生姓名学号指导教师职称单片机与PC之间的串行通讯摘要随着计算机技术的发展,特别是单片机技术的迅猛发展,单片机被广泛应用于大量工业控制系统。

单片机拥有占有空间小,价格低廉,开发应用程序容易的优势,可用于恶劣的工业环境中,单片机的数据采集和现场控制能力被广泛应用于分布式控制系统中。

但因为单片机的计算能力是有限的,而且用它也很难进行复杂的数据处理,因此这就要求我们往往在具有繁多功能的控制系统中采用上,下位机系统,单片机被使用为下位机系统采集数据和控制设备,而使用PC机为上位机系统处理复杂数据和控制单片机。

当今,在大量解决通信系统通信受阻的常用方案中,通过PC机自带的RS-232串行通讯端口与外设实现通讯这一方案备受人们的青睐。

故由上知,实现单片机与PC机之间的串行通讯具有重要的意义。

本论文设计详细介绍了使单片机与PC机之间能够进行串行通讯的软件和硬件的实现。

在硬件设计中,通过RS-232串行通讯端口将单片机与PC机相互连接,PC机把数据传输至单片机系统,单片机系统会将这一传输数据显示在LED数码管上;在软件设计中,利用Visual Basic6.0中的MSComm串行通讯控件来编写PC机的串口通讯程序。

在对此设计正确测试后,证明我们的设计能够实现单片机与PC机之间的串行通讯。

关键词:单片机;串行通讯;RS-232;Visual Basic6.0;MsCommSerial Communication between SCM and PCAbstractWith the development of computer technology, especially the rapid development of the SCM technology, SCM has been widely used in industrial control systems. The SCM has the advantage of possession of a small space, low price, easy to develop applications that can be used in harsh industrial environments, data acquisition and site control capabilities of the microcontroller is widely used in distributed control systems. Single-chip computing power is limited, and it is difficult to use it for complex data processing, so this is often used in the control system has a range of functions, the controller system, the microcontroller is used for the next bit machine system data acquisition and control equipment, using a PC as the host computer system to handle complex data and control SCM. Today, a large number of commonly used programs address communication system communication disruption, comes via a RS-232 serial communication interface with peripherals, communication of this program much people of all ages. Therefore, by the Sounds, the communication between the SCM and PC has an important significance.The design details of this paper between the SCM and PC serial communications software and hardware implementations. SCM and PC through the RS-232 serial communications port in the hardware design of interconnected PC machine data transfer to the SCM system, SCM system will transmit data is displayed on the LED digital tube; in software design, MSComm communication control in Visual Basic 6.0 to write the PC's serial port communication program. This design the right tests to demonstrate that our design can achieve serial communication between SCM and PC.Key words:SCM;Serial Communication;RS-232;VB6.0;MSComm目录第一章绪论 (1)1.1 本课题的目的和意义 (1)1.2本课题的国内外研究现状 (1)1.3此次设计的工作内容 (2)第二章串行通讯基础知识 (3)2.1串口通讯的理论基础 (3)2.1.1 并行接口与串行接口 (3)2.2 RS-232串行通讯接口标准 (3)2.3MSCOMM串行通讯控件 (4)2.3.1 MSComm串行通讯控件处理通讯的方式 (4)2.3.2 MSComm串行通讯控件的属性 (5)第三章课题总体设计与分析 (6)3.1 课题的可行性分析 (6)3.2 课题指标设计 (6)3.2.1 通讯协议的设计 (6)3.3 课题的硬件与软件的设计与分析 (6)3.4课题功能分析 (7)第四章串行通讯的硬件电路设计 (8)4.1 单片机的选型及其简介 (8)4.2 串行接口的基本结构的认识 (8)4.3 电平转换芯片MAX232 (10)4.4 电路原理图 (11)第五章串行通讯程序设计 (14)5.1 PC机的串行通讯程序 (14)5.2单片机的串行通讯程序 (17)第六章仿真调试与结果分析 (19)6.1 PROTUES仿真软件简介 (19)6.2 仿真结果分析 (19)结语 (21)参考文献 (22)致谢 (23)附录 (24)第一章绪论1.1本课题的目的和意义现代信息网络技术的一个突出特点,是使所有的设备在工业控制系统相互连接,形成网络,在中央软件管理下,形成一个有机的整体。

单片机与PC机串行通信

单片机与PC机串行通信
1.4.1
小键盘选择功能:首先设置定时器及波特率,然后在设计键盘扫描函数和按键检测函数,使之能实现小键盘的选择功能。输入不同的数实现调用不同的函数,从而实现不同的功能。
1.4.2
功能1:设计PC发送函数,此功能还需要有串行口中断函数。目的是实现单片机可以接收PC机发送的数据,并且将其发送给PC机。设置一个返回键,让按键1实现返回小键盘选择功能,可以重新选择功能1还是功能2。
若选择“2”,即要实现功能2,须调用小键盘扫描函数,将数据显示到数码管上,同时然后将该数据转化成acsii码的形式通过串行口发送到PC机上。当从小键盘按键NEXT时,返回初始状态,可以进行功能1和2的重新选择。
2
本课设主要分3个模块,第一个模块是主程序中的键盘扫描,通过键盘扫描程序来获取从小键盘输入的键值,此次课设里面用到的键盘的按键主要有三个,一个是‘0’,一个是‘1’,另一个是‘2’。当输入‘0’时,结束。当输入的是‘1’时,进入第二个功能模块,由PC机发送数据,将数据发送给单片机,然互在传给PC机。当输入数值‘2’时,进入第二个模块,将数据由单片机小键盘输入,发送给PC机。模块调用图如下页图2.1所示
这样就可以通过输出的列码和读取的行码来判断按下的是哪个该模块中键盘扫描的电路图和键盘扫描电路如图32和33所示沈阳航空航天大学课程设计报告32键盘电路图开始初始化地址参数输出列扫描信号列扫描信号移位读入行信号该列有键输入6列扫描完按照行列计算键值查表得键码等待按键释放33键盘扫描流程图沈阳航空航天大学课程设计报告主函数模块首先设置定时器及波特率的选择根据标志位k1的值选择是pc模式发送数据还是小键盘模式发送数据并根据功能选择模块中对各模式的信息的进行相应的初始设置
(2)课程设计要求:
①认真完成课程设计任务;

PC与单片机串行通信的协议策略研究及应用_杨艳华

PC与单片机串行通信的协议策略研究及应用_杨艳华

云南大学学报(自然科学版),2007,29(S2):122~126C N 53-1045/N ISSN 0258-7971Journal of Yunnan UniversityPC 与单片机串行通信的协议策略研究及应用杨艳华(云南大学云南省电子计算中心,云南昆明 650223)摘要:通信协议是串行通信系统正常运行的关键.通过对PC 机与单片机多机串行通信协议中常见问题进行分析,提出了一种通信协议的制定策略.最后以某国际机场LED 显示系统为例,完成了系统的通信协议制定和软件实现,验证了此策略在多机串行通信中的可靠性.关键词:多机串行通信;通信协议;策略研究中图分类号:TP 301 文献标识码:A 文章编号:0258-7971(2007)S2-0122-05在工业控制及测量领域较为常见的PC 机与单片机组成的多机串行通信系统,一般以单片机为从节点(又称下位机),负责现场控制和实时数据采集;PC 机为主节点(又称上位机),负责对各从节点发来的数据进行分析、处理,并向各从节点发布命令,以实现对工业现场的集中监控与管理.由于主从节点间需不断进行信息交流,因此通信成为系统重要而基本的功能,一般以总线方式连接,采用RS -485/RS-422标准进行数据通信,结构见图1[1],这种系统结构可以十分方便地将许多设备组成一个控制网络.在通信过程中,PC 机可以向单片机发送数据,单片机也可以向PC 机发送数据,但单片机之间不直接进行数据通信.这种通信方式具有技术简单成熟、性能可靠、价格低廉、通信距离和数据传输速率适中等特点,所要求的软硬件环境和条件都很低,广泛应用于各种测控模块、摄像头云台、LED 显示屏、数控机床等单片机智能系统.目前,此类短距离有线智能系统通信的基础结构有不少是多机串行通信系统,串行通信也成了其中的核心技术.在多机串行通信系统中,在设计了可靠合理的硬件电路后,通信系统能否稳定可靠工作的关键就在于通信协议的设计,如果通信协议设计不合理,就常常会出现通信失败,导致系统无法正常工作.所以,要实现可靠的多机串行通信,必须充分考虑通信协议和通信软件的合理性.图1 多机串行通信系统结构Fig.1Structure of multi computer serial communicati on system收稿日期:2007-08-31作者简介:杨艳华(1974- ),男,云南人,高级工程师,硕士,主要从事电子与自动控制技术应用研究.1 常见问题分析在排除了多机串行通信系统的硬件电路设计不合理、硬件故障、受到电磁干扰等因素后,通信过程如果出现问题,就可判定是通信协议和通信软件的问题,下面将进行对比分析.1.1 通信不可靠 在通信过程中接收方有时能够接收到数据,有时又不能接收到数据,这就是通信不可靠.产生通信不可靠的原因是发送的数据字节之间或数据帧之间的延时太短,以至于接收方来不及接收和处理数据,造成本次通信不成功.在这种情况下,通信系统处于一个临界状态,接收方有时偶尔能够把数据正确接收下来,其余时间则不能正确接收.1.2 通信死机 接收方在工作一段时间之后就失去了对发送方通信的响应,除非重新开机启动,否则就一直收不到数据.这种现象产生的原因是系统通信协议设计上缺乏一种受到干扰后自动恢复的保护措施,导致数据接收方一直无法回到正常响应通信的状态.通信受到干扰后,传送的数据被破坏,导致丢失字节或标志码发生变化,接收方由于接收不到约定的字节数或标志码,一直处在等待数据的状态,从发送方来看接收方就处于通信死机状态.1.3 从节点接收错误 总线上有多个从节点时,在通信过程中会出现不应该响应的从节点也响应,但接收到的是混乱数据的现象.产生这种现象的原因是通信协议设计不合理,在对应的从节点响应通信的同时,总线上的某一段数据恰好满足了别的从节点响应的条件,虽然收到的数据毫无意义,但导致了不正确的接收和响应.2 通信协议制定策略通信协议中通信数据一般包括地址码、标识码、有效数据、校验码和结束码(可选),常用的校验码有异或、累加和、CRC等.每个单片机(下位机)设置一个唯一的地址码,作为与PC机(上位机)通信时该单片机的识别码,PC机可以没有地址码.在多机串行通信系统中,PC机作为主节点,是每一次主从节点进行数据通信的发起者.PC机与单片机之间的通信过程可以设计为:PC机首先发送要接收数据的单片机地址码,单片机收到地址码后,与自己的地址码进行比较,如果一致就把地址码回传给PC机并准备接收数据,如果不一致就不理会,PC机收不到回传表明地址码不存在或地址码对应的单片机通讯有故障,将报警提示.PC机收到回传的地址码后就表明对应的单片机已经回应, PC机接着就将数据发送给单片机.单片机接收完数据后,如果需要回传信息,就马上向PC机发送.整个通信过程就告完成.PC机向单片机发送的数据可以分成一帧一帧进行发送,帧的字节数采用固定长度.假设每一帧的长度约定为N个字节,校验码采用累加和,结束码使用55H,则PC机向单片机发送的数据帧格式可以设计如表1所示.表1 PC机发送数据帧格式Tab.1Frame data format transmitted from PC帧字节序号帧字节含义0地址码1帧标识码2~(N-3)帧数据N-2累加和(1~(N-3)字节之和)N-1结束码(55H)单片机向PC机上传的数据有3种:一是收到本机地址码后回传地址码;二是收到一帧数据后回传一个字节的标志码(如55H),表明通信成功;三是收到上传命令后将数据上传给PC机,数据帧长度可以事先约定,不再改变,假设数据帧长度为M 个字节,校验码采用累加和,则数据帧格式设计为表2所示.表2 单片机发送数据帧格式Tab.2Frame data format trans mitted from sin gle chip micro-compu ter帧字节序号帧字节含义0~(M-3)帧数据M-2累加和(0~(M-3)字节之和)M-1结束码(55H)针对前面提到的常见问题,在通信协议制定中也要考虑采取一定的措施来加以避免.2.1 准确定位要接收数据的从节点 PC机向单123第S2期 杨艳华:PC与单片机串行通信的协议策略研究及应用片机发送数据时,可以利用单片机的多机通信功能,准确定位接收数据的单片机.以MCS-51系列单片机为例,可以通过设置其串行口的工作模式控制寄存器SC ON 来实现多机通信功能[2],如图2所示,SM2为多机通信控制位,当通信模式设置为模式3(SM0=1,SM1=1)时,在SM2=1的条件下,只有接收到的第9位数据位(RB8,即PC 机发送的校验位)为1时,才置位RI 标志向C PU 发出中断请求,若RB8=0,则不响应本次接收.图2 串行口工作模式寄存器Fig.2Work mode register of serial portPC 机发送数据帧时,地址码采用Mark 校验,即校验位(发送的第9位数据位)为1,其它数据采用Space 校验,即校验位为0.这样,发送地址码时,所有单片机都能接收到,通过比较,如果是自己的地址码,就回传地址码并设置SM2=0,如果不是自己的地址码则保持SM2=1.那么,后面的数据发送过来时,只有地址码对应的单片机可以接收数据,其它的单片机不能接收.2.2 避免通信死机 为避免单片机通信死机,在接收数据的过程中,如果还没有接收到约定长度的字节数或标志码,就要根据情况设置一个等待定时,到了定时时间还未收到数据就把单片机恢复到初始状态,以响应下一次通信.对于PC 机来说,也要在接收不到约定长度的字节数或标志码超过一定时间后自动恢复到初始状态.这样,就保证了数据接收方在通信出错后不再漫长地等待数据而导致通信死机了.另外,要根据最远一个单片机的通信距离选择合适的波特率,以保证通信的可靠性.3 应用实例笔者运用上述通信协议策略,研发设计了某国际机场旅客登机引导LE D 多屏显示系统的通信协议和通信软件.LE D 多屏显示系统包括两部分:PC 机和单片机控制的LED 显示屏.PC 机通过单片机实现对LED 显示屏的控制,包括显示信息更新和显示方式的控制;LED 显示屏的核心是单片机,负责信息接收和显示屏信息显示.所以通信软件也分成两部分:PC 机端软件(又称上位机软件)和单片机端软件(又称下位机软件).在该LED 多屏显示系统中,PC 机操作系统为Windows XP,单片机采用的是Intel 公司的80C32.3.1 协议制定 LED 多屏显示系统中通信数据主要是由PC 机发送给单片机,数据为要显示文字信息的编码,单片机只是回传地址码和标志码,PC 机向单片机发送数据帧的格式如表3所示,帧长度为104个字节,通信过程则与前述一致.表3 LED 显示系统中PC 机发送数据帧格式Tab.3Frame data format transmitted from PC in LED displaysystem 帧字节序号帧字节含义0地址码1帧标识码2~101帧数据102累加和(1~101字节之和)103结束码(55H)显示的信息分成很多屏,每一屏对应一个数据帧,数据帧分为3种:起始帧、中间帧和结束帧,标识码分别为7FH,7E H,7DH,起始帧表示是本次通信的第1帧数据,中间帧表示是中间的数据帧,结束帧表示是最后一帧数据,单片机接收到结束帧就可以开始显示新收到的信息.另外,还可以向单片机发送时间帧,用于校准显示屏的时间并显示时间,标识码为5F H.由于1台PC 机要向多个单片机发送数据,所以启动了单片机的多机通信功能,单片机串行口设置为模式3.单片机的晶振频率为11.0592MHz,LED 显示屏通信距离在1000m 以内,每次发送的数据最多在10帧以内,LED 显示屏信息更新实时性要求不太高,故采用9600bps 的通信速率.3.2 上位机软件实现 PC 机端上位机软件开发用Delphi 7.0完成,串行口通信采用第3方Delphi 串口控件SPCOMM,操作系统为Windows XP.为实现多机通信功能,PC 机发送地址码时要采用Mark 校验,使校验位为1:C om m1.BaudRate:=9600;C om m1.Parity:=Mark;124云南大学学报(自然科学版) 第29卷Comm1.StartComm;Sleep(50);send char:=Char(send que[0]);/*地址码*/Comm1.WriteCommData(@send char,1);发送其它数据时,采用Space 校验,使校验位为0,其它从节点将不接收:Comm1.StopComm;Comm1.BaudRate:=9600;Comm1.Parity:=Space;Comm1.StartComm;Sleep(50);temp:=0;For I:=1To 101Do Beginsend char:=Char(send que[I]); Comm1.WriteC om mData(@send char,1);temp:=temp+send que[I];End;sendchar:=Char(te mp);Comm1.WriteCommData(@send char,1);send char:=Char($55);Comm1.WriteCommData(@send char,1);PC 机要在发送地址码后等待单片机回传地址码,在1帧数据发送完毕后也要等待单片机回传标志码(55H).另外,在程序中还要设定等待超过规定时间接收不到回传就放弃本次通信重新发送信息,以避免通信死机.3.3 下位机软件实现 由于单片机既要负责控制LED 显示屏信息显示,又要负责接收下传数据,设计单片机通信程序时,必须综合考虑2方面的因素:一是接收数据过程应尽量少占用CP U 的时间,以免影响LED 显示屏信息显示效果;二是对数据通信的响应要及时,以免造成数据丢失.基于上述考虑,单片机串行通信采用中断方式接收数据,并且把串行口中断设置为高优先级,保证数据的可靠接收.对LED 显示系统来说,数据主要是从PC 机发送到单片机,单片机只是回传1个字节的信息,将通信程序分为接收中断处理程序和通信处理程序,并将2部分程序巧妙地进行组合,从而构成整个单片机的通信程序.单片机通信程序采用Keil 软件公司的Keil C517.06版本开发,语言简洁,运行效率极高[3].3.3.1 接收中断处理程序 接收中断处理程序主要负责接收PC 机发送到单片机的数据,当接收到规定的字节数和标志码时,置数据接收完毕标志,以表明接收缓冲区内有待处理的数据并请求通信处理程序对其进行处理.接收中断处理程序不对数据进行直接处理,以减少中断占用的时间.接收中断处理程序流程图如图3所示.图3 单片机串行口接收中断程序流程图Fig.3Serial port recei ving in terruption flow chart of single chip microcomputer125第S2期 杨艳华:PC 与单片机串行通信的协议策略研究及应用如果未接收到规定的字节数或标志码,但在一定等待时间内无后续数据,则放弃本次数据通信,将接收状态标志恢复到初始状态.该操作在单片机定时中断中实现.3.3.2 通信处理程序 为尽量减少接收中断处理程序所占用的CPU时间,通信处理程序被放在主循环中调用.只有在接收到PC机送来的最后1帧数据的固定字节数和结束码(55H)并置位接收完毕标志后,才进行处理,否则不进行处理.这样就可以利用通信的间隙时间进行别的操作,从而消除了空等待时间,提高了CPU的利用率.通信处理程序可根据通信处理状态的不同来分别执行不同的路径:当接收到结束帧(7D H帧)后,将本次通信接收到的数据从接收缓冲区拷贝到数据存储区,退出中断处理程序并开始显示新信息;当接收到时间帧(5FH帧)后,将接收到的时间写入时钟芯片,退出中断处理程序并转到时间显示.4 结束语本文提出并实现了1种PC机与单片机多机串行通信系统的协议制定策略,上位机软件采用Windo ws下的Delphi7.0开发,下位机软件采用Keil C51开发.已成功应用于某国际机场旅客登机引导LED多屏显示系统、烟厂生产信息LE D显示系统、烤烟烟叶收购LED显示系统、监控系统摄像头云台控制等多个项目中,系统运行稳定,通信性能良好,得到了用户的广泛认可.参考文献:[1] 吴军辉,林开颜,徐立鸿.RS485总线通信避障及其多主发送的研究[A].何立民.单片机应用技术选编(10)[C].北京:北京航空航天大学出版社,2004.[2] 王晓君,安国臣.MCS-51及兼容单片机原理与选型[M].北京:电子工业出版社,2003.[3] 徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].北京:电子工业出版社,1998.Research and application of communication protocol strategybetween PC and single chip microcomputerYANG Yan-hua(Electronic Computing Center of Yunnan Province,Yunnan University,Kunming650223,China)Abstract:C ommunication protocol is a ke y factor in a serial communication system.It is analyzed that the usual problem in multi computer serial communication protoc ol between PC and single chip microc omputer,put for ward that a kind of c ommunication protocol strategy.At last,using the strategy,c ommunication protocol and communication software of the LED display system in an international airport is developed,the reliability in multi c omputer serial communica-tion is proved.Key words:multi computer serial communication;communication protocol;strategy research 126云南大学学报(自然科学版) 第29卷。

matlab环境下pc机与16位单片机串行通信的研究_图文(精)

matlab环境下pc机与16位单片机串行通信的研究_图文(精)

入深的从概述USB和驱动程序的基本理论,继而根据DriverWorks的开发流程,重点介绍了其中的USB开发的设计,针对USB及驱动程序开发的初学者,使其能够便捷的了解USB和WDM模型驱动程序,并掌握开发工具中USB驱动开发的要点,快速的进入到驱动程序开发的工作中去。

参考文献[1]王志强.USB设备驱动程序开发技术研究.微计算机信息,2006[2]宁立革.基于嵌入式操作系统的USB驱动程序开发.微计算机信息,2005.[3]武安河.Windows2000/XP WDM设备驱动程序开发[….北京:电子工业出版社,2006.[4]薛园园.uSB应用开发技术大全[”]北京:人民邮电出版社,2007.作者简介田心~航天信息股份有限公司、数字技术研究院、芯片研发工程师,主要研究方向是信息安全领域的芯片研发与设计。

■MATLAB环境下PC机与16位单片机串行通信的研究1.汉泽西1.郭正虹2.彭宏文1.甘志强(1.西安石油大学电子工程学院2.中国石油测井有限公司长庆事业部摘要:文章提出一种PC机与16位单片机串行通信的设计方案。

利用控制工具箱serial类对象实现PC机与单片机SPCE061A间的异步串行通信,给出设计方案的硬件电路和部分软件程序,并通过对实验结果的分析说明串行通信的可靠性。

关键词:MATLAB,单片机,串行通信Research of SeriaI Com rnunication between PC and MCU In MATLAB Envi ronment1.Han Zexi1.6uo Zhenghong2.Peng Hongwen1.Gan Zhiqiang(1.Xi’an Shiyou University,Department of Electric Engineer(2.Chinese Petroleum Oil wel l logging Limited companyChangqing Services departmentAbstract:A method of serial communication between PC and16一bitS MCU in MATLAB Environment iS described.ThiS article employs serial Class object of the Instrument Toolbox provided by MATLAB to real ize the asynchronous serial communication between PC and16一bitS MCUw--SPCE061A.Concludes design method’S hardware Circuit and part of software programe.It alSO explain the reliabilitv of the communication result througth the analysiS of experiment result.Keywords:MATLAB,MCU,Serial Communlcation0.引言随着计算机系统的广泛应用和网络的飞速发展,各种控制设备间的通信功能显得越来越重要。

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序
平台ATmega16
编程软件CodeVisionAV
实现功能:单片机与PC机(电脑)之间的串口通信。具体就是单片机最小系统上的AD键盘按键按下后发送键值到串口助手上显示,串口助手发送一串字符到最小系统上的lcd1602显示。
(程序或有冗余)
#include <mega16.h>
#include <delay.h>
data=rx_buffer[rx_rd_index]; //读取缓冲队列中的数据
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli") //关中断
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
// USART Receiver buffer:接收器缓冲
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

Matlab的GUI单片机串口PC的通信

Matlab的GUI单片机串口PC的通信

基于Matlab GUI的单片机串口与PC的通信概述1.采用51单片机,atmel的STC89C52RC芯片,主要用到的是七段数码管用来做一个时钟,程序编写软件为keil,烧录软件为STC-ISP 4.88,串口调试软件用的是sscom42。

2.运用Matlab的GUI工具编辑一个可视化界面,用以跟单片机进行串口通信实现功能1.运用keil编写时钟程序,烧录到单片机中,时钟程序实现的功能是实现时钟的显示,并且能用开发板上的三个按钮进行时钟的修改,一个按钮进入修改模式,另两个实现时间的增减。

2.编辑GUI界面,实现对单片机的控制,其中,GUI界面通过串口能不断的采样开发板上时钟的数值,并在GUI界面上进行显示。

同样的,可以通过GUI界面实现对开发板上时钟的修改。

具体实现1.开发板部分:A)时钟显示程序如下(并且加入了串口接收部分)Main.c#include <REGX52.H>#define LED_SELECT P2#define LED_DATA P0#define KEY_PIN P3//变量定义unsigned char light[]={3,2,0,7,5,4,1,6};static unsigned char count_1s=0 ;typedef enum{NULL, KEY_ENTER, KEY_UP, KEY_DOWN}TYPEDEF_KEY;enum SHOW_STATE{SHOW_NORMAL, SHOW_SEC_ADJ, SHOW_MIN_ADJ,SHOW_HOUR_ADJ, }ShowState;unsigned char code LEDMAP[] = //共阴极显示代码{0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90,0xff, //熄灭};enum{LED_GOOUT = 10,};unsigned char LEDBuffer[6]; //显示缓冲区unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char count;bit Timer1sFlg;//函数声明void A T89S51Config(void);void VariableInitial(void);void ShowNormal(void);void ShowSecondAdj(void);void ShowMinuteAdj(void);void ShowHourAdj(void);void Delay(unsigned int t);void Display(unsigned char * buf, unsigned char number); //动态显示unsigned char GetKey(void);/*——————————————————————————————主函数————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/main(void){AT89S51Config(); //A T89S51配置VariableInitial(); //变量初始化while(1){switch(ShowState){case SHOW_NORMAL:ShowNormal();break;case SHOW_SEC_ADJ:ShowSecondAdj();break;case SHOW_MIN_ADJ:ShowMinuteAdj();break;case SHOW_HOUR_ADJ:ShowHourAdj();break;default:break;}Display(LEDBuffer,6);}}/*——————————————————————————————配置函数————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void A T89S51Config(void){ TMOD|=0x20; //串口配置————————————————————————————————————————PCON&=0x7f;TH1=TL1=0xfd;TR1=1;SCON=0x50; //串口配置————————————————————————————————————————RCAP2H=0x0F;//T2定时器初值RCAP2L=0x00;ET2=1;//允许T2定时器中断TR2=1;//启动T2定时器EA=1;//开总中断}/*——————————————————————————————变量初始化————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void VariableInitial(void){ShowState = 0;Second = 0;Minute = 0;Hour = 0;Timer1sFlg = 0;count=0;}/*——————————————————————————————延时函数————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void Delay(unsigned int t){for (t; t>0; t--) ;}/*——————————————————————————————正常显示界面————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void ShowNormal(void){ unsigned char i;TYPEDEF_KEY key;//1秒钟到,显示值更新if(Timer1sFlg){Timer1sFlg = 0;Second++;if(Second >= 60){Second = 0;Minute ++;if(Minute >= 60){Minute = 0;Hour ++;if(Hour >= 24){Hour = 0;}}}for(i=0;i<6;i++){if(TI==0) //——————————给串口送数据,既给matlab 送数据———————————————————————————{ //———————————————————————————————————————————————————————SBUF=LEDBuffer[5-i];while (!TI ); //操作对象是TITI=0 ;}}}LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区LEDBuffer[2] = Minute % 10;LEDBuffer[3] = Minute / 10;LEDBuffer[4] = Hour % 10;LEDBuffer[5] = Hour / 10;key = GetKey();if(key == KEY_ENTER){ShowState = SHOW_SEC_ADJ;}if(RI==1){RI=0;TI=0;ShowState = SHOW_SEC_ADJ;}}/*——————————————————————————————秒钟调整————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void ShowSecondAdj(void){ unsigned char i;TYPEDEF_KEY key;LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区LEDBuffer[2] = LED_GOOUT; //熄灭LEDBuffer[3] = LED_GOOUT; //熄灭LEDBuffer[4] = LED_GOOUT; //熄灭LEDBuffer[5] = LED_GOOUT; //熄灭Display(LEDBuffer,6);key = GetKey();switch(key){case KEY_ENTER:ShowState = SHOW_MIN_ADJ;break;case KEY_UP:Second++;if(60 == Second){Second = 0;}break;case KEY_DOWN:if(0 == Second){Second = 59;}else{Second--;}break;}for(i=0;i<6;i++){LEDBuffer[2]=0;LEDBuffer[3]=0;LEDBuffer[4]=0;LEDBuffer[5]=0;if(TI==0) //——————————给串口送数据,既给matlab 送数据———————————————————————————{ //———————————————————————————————————————————————————————SBUF=LEDBuffer[5-i];while (!TI ); //操作对象是TITI=0 ;}}if(RI==1){ RI=0;Second=SBUF;TI=0;LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区ShowState = SHOW_MIN_ADJ;for(i=0;i<100;i++){Display(LEDBuffer,6);}}}/*——————————————————————————————分钟调整————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void ShowMinuteAdj(void){unsigned char i;TYPEDEF_KEY key;LEDBuffer[0] = LED_GOOUT; //熄灭LEDBuffer[1] = LED_GOOUT; //熄灭LEDBuffer[2] = Minute % 10; //分个位送显示缓冲区LEDBuffer[3] = Minute / 10; //分十位送显示缓冲区LEDBuffer[4] = LED_GOOUT; //熄灭LEDBuffer[5] = LED_GOOUT; //熄灭Display(LEDBuffer,6);key = GetKey();switch(key){case KEY_ENTER:ShowState = SHOW_HOUR_ADJ;break;case KEY_UP:Minute++;if(60 == Minute){Minute = 0;}break;case KEY_DOWN:if(0 == Minute){Minute = 59;}else{Minute--;}break;}for(i=0;i<6;i++){LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区LEDBuffer[4]=0;LEDBuffer[5]=0;if(TI==0) //——————————给串口送数据,既给matlab 送数据———————————————————————————{ //———————————————————————————————————————————————————————SBUF=LEDBuffer[5-i];while (!TI ); //操作对象是TITI=0 ;}}if(RI==1){ RI=0;Minute=SBUF;LEDBuffer[2] = Minute % 10; //分个位送显示缓冲区LEDBuffer[3] = Minute / 10; //分十位送显示缓冲区TI=0;Display(LEDBuffer,6);ShowState = SHOW_HOUR_ADJ;for(i=0;i<100;i++){Display(LEDBuffer,6);}}}/*——————————————————————————————时钟调整————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void ShowHourAdj(void){ unsigned char i;TYPEDEF_KEY key;LEDBuffer[0] = LED_GOOUT; //熄灭LEDBuffer[1] = LED_GOOUT; //熄灭LEDBuffer[2] = LED_GOOUT; //熄灭LEDBuffer[3] = LED_GOOUT; //熄灭LEDBuffer[4] = Hour % 10; //小时个位送显示缓冲区LEDBuffer[5] = Hour / 10; //小时十位送显示缓冲区Display(LEDBuffer,6);key = GetKey();switch(key){case KEY_ENTER:ShowState = SHOW_NORMAL;break;case KEY_UP:Hour++;if(24 == Hour){Hour = 0;}break;case KEY_DOWN:if(0 == Hour){Hour = 23;}else{Hour--;}break;}for(i=0;i<6;i++){LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区LEDBuffer[2] = Minute % 10;LEDBuffer[3] = Minute / 10;if(TI==0) //——————————给串口送数据,既给matlab 送数据———————————————————————————{ //———————————————————————————————————————————————————————SBUF=LEDBuffer[5-i];while (!TI ); //操作对象是TITI=0 ;}}if(RI==1){ RI=0;Hour=SBUF;TI=0;LEDBuffer[4] = Hour % 10; //小时个位送显示缓冲区LEDBuffer[5] = Hour / 10; //小时十位送显示缓冲区ShowState = SHOW_NORMAL;for(i=0;i<100;i++){Display(LEDBuffer,6);;}}}/*——————————————————————————————显示函数————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/void Display(unsigned char * buf, unsigned char number){unsigned char i;for (i = 0; i < number; i++){LED_SELECT = 0x00; //关所有LED (防止出现闪烁现象)LED_DATA = LEDMAP[*(buf + i)]; //送数据LED_SELECT = ~(1<<light[i]); //显示某1位数码管,其余关闭Delay(90); // 延时约1ms,参数与晶振大小有关}}/*——————————————————————————————定时器五————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/Timer2_server(void) interrupt 5 //*{TF2=0;count_1s++;if(20 == count_1s){Timer1sFlg = 1;count_1s =0;}}/*——————————————————————————————得到按键值————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/TYPEDEF_KEY GetKey(void){TYPEDEF_KEY key = NULL;if( ~KEY_PIN & 0x1c) //有键按下{Delay(1000); //去抖动if(~KEY_PIN & 0X04){key = KEY_ENTER;}else if(~KEY_PIN & 0X08){key = KEY_UP;}else if(~KEY_PIN & 0X10){key = KEY_DOWN;}else{return(NULL);}while(KEY_PIN != 0XFF) //等待键抬起{Delay(2);}return(key);}return(NULL);}B) Matlab GUI界面的编辑效果图如下,操作说明:START点击开始,采集单片机时钟时间,ADJUST点击进入修改模式,同时单片机开发板亦会进入修改模式,EXIT点击关串口,退出界面,GET点击获取当前值,另外一些辅助按钮,滑块按钮都有各自功能,易于理解。

MATLAB环境下的串行通信

MATLAB环境下的串行通信
的右边变量个数. plhs 指针数组变量 ,其元素是指向 mexArray 类型的输出参数变量的指针. prhs 指针数组变量 ,其元素是指向 mexArray 类型的输入参数变量的指针.
MATLAB 中函数调用的命令形式是 : [ a ,b ,c , …] = fun (d ,e ,f , …) . 其中 ,fun 为 MEX 文件 名 ,a ,b ,c 等为输出变量 (左边变量) ,d ,e ,f 等为输入变量 (右边变量) . 例如 ,调用名为 funmex 的 MEX 文件 ,其命令形式为[ u ,v ] = funmex(x ,y ,z) , funmex 中的 mexFunction 的参数传递如下 :
本文介绍的在 MATLAB 环境下利用 MEX 函数实现串行通信的方法 ,使 MATLAB 能通过串 行口获取外部数据 ,为利用 MATLAB 进行动态数据分析提供了方便 ,大大拓宽了 MATLAB 的应 用范围.
1 MATLAB 的 MEX 文件
MATLAB 的 MEX 文件是由 MEX 源代码文件经过适当的编译和链接而生成的动态链接子 程序. 用户可用 C/ C + + 编写子程序 ,然后通过 MATLAB 的 API 函数库将子程序编译成动态链 接函数 (库) ,即 MEX 文件. MEX 文件的作用类似于 MATLAB 的内建函数 ,可在 MATLAB 环境 中直接调用或链接这些子程序 ,以实现特定的任务.
nlhs = 2
nrhs = 3 plhs[ 0 ] - >‘NULL’, plhs[ 1 ] - >‘NULL’
prhs[ 0 ] - > x , prhs[ 1 ] - > y , prhs[ 2 ] - > z 在子程序调用开始 ,输出变量 u 和 v 对象还没有创建 ,所以 plhs 的各指针的地址还没定 义. 在入口子程序中 ,先根据需要创建 mexArray 类型的输出变量 ,并将其地址分别保留在 plhs[ 0 ]和 plhs[ 1 ]中 ,再通过两个指针 ,就可以在功能子程序中使用这些变量.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档