Matlab与51单片机的串口通信
- 格式:doc
- 大小:3.79 MB
- 文档页数:20
文章标题:探索Matlab中的串口通信系统设计在当前的现代通信系统中,串口通信系统设计已经成为一项至关重要的任务。
在Matlab中,借助各种工具和函数,我们可以设计出高效、稳定和灵活的串口通信系统。
本文将从简单到复杂、由浅入深地探讨Matlab中的串口通信系统设计,为读者提供全面的了解和深入的思考。
1. 串口通信系统概述在进行Matlab中的串口通信系统设计之前,我们首先需要了解串口通信系统的基本概念和原理。
串口通信是通过串行接口进行数据传输的一种通信方式,它在各种领域中都有着广泛的应用,包括嵌入式系统、通信设备、工业控制等。
Matlab作为强大的工程计算软件,为我们提供了丰富的工具和函数来进行串口通信系统设计,包括串口对象、串口配置、数据读写等功能。
2. Matlab中的串口通信基本操作在Matlab中,我们可以通过串口对象来进行串口通信的基本操作。
我们需要创建一个串口对象,并进行相应的配置,包括波特率、数据位、停止位、校验位等参数。
我们可以使用该串口对象来进行数据的读写操作,可以发送数据到外部设备,也可以接收来自外部设备的数据。
通过Matlab中丰富的串口函数,我们可以轻松实现串口通信系统的基本功能。
3. Matlab中的串口通信系统设计在实际的工程应用中,我们通常需要设计更加复杂和灵活的串口通信系统。
在Matlab中,我们可以借助信号处理工具箱、通信工具箱等功能来进行串口通信系统的设计。
通过信号处理工具箱,我们可以实现对串口数据的解调、调制、滤波等操作,从而提高通信系统的稳定性和性能。
而通信工具箱中的各种算法和工具则可以帮助我们实现更加复杂的通信协议和数据处理。
4. 个人观点和总结在我看来,Matlab是一款非常适合进行串口通信系统设计的软件,它不仅提供了丰富的工具和函数,还具备强大的计算能力和灵活的编程环境。
通过Matlab,我们可以实现从简单到复杂的串口通信系统设计,为各种应用场景提供定制化的解决方案。
51单片机串口通信(相关例程) 51单片机串口通信(相关例程)一、简介51单片机是一种常用的微控制器,它具有体积小、功耗低、易于编程等特点,被广泛应用于各种电子设备和嵌入式系统中。
串口通信是51单片机的常见应用之一,通过串口通信,可以使单片机与其他外部设备进行数据交互和通信。
本文将介绍51单片机串口通信的相关例程,并提供一些实用的编程代码。
二、串口通信基础知识1. 串口通信原理串口通信是通过串行数据传输的方式,在数据传输过程中,将信息分为一个个字节进行传输。
在51单片机中,常用的串口通信标准包括RS232、RS485等。
其中,RS232是一种常用的串口标准,具有常见的DB-9或DB-25连接器。
2. 串口通信参数在进行串口通信时,需要设置一些参数,如波特率、数据位、停止位和校验位等。
波特率表示在单位时间内传输的比特数,常见的波特率有9600、115200等。
数据位表示每个数据字节中的位数,一般为8位。
停止位表示停止数据传输的时间,常用的停止位有1位和2位。
校验位用于数据传输的错误检测和纠正。
三、串口通信例程介绍下面是几个常见的51单片机串口通信的例程,提供给读者参考和学习:1. 串口发送数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendChar(unsigned char dat){SBUF = dat; // 发送数据while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志}void main(){UART_Init(); // 初始化串口while (1){UART_SendChar('A'); // 发送字母A}}```2. 串口接收数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_Recv(){unsigned char dat;if (RI) // 检测是否接收到数据{dat = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志// 处理接收到的数据}}void main(){UART_Init(); // 初始化串口EA = 1; // 允许中断ES = 1; // 允许串口中断while (1)// 主循环处理其他任务}}```3. 串口发送字符串```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendString(unsigned char *str){while (*str != '\0')SBUF = *str; // 逐个发送字符while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志str++; // 指针指向下一个字符}}void main(){UART_Init(); // 初始化串口while (1){UART_SendString("Hello, World!"); // 发送字符串}}```四、总结本文介绍了51单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。
基于Matlab和AVR单片机的串行数据通信设计摘要:介绍了基于matlab和avr单片机通过pc机进行通信的方法。
通过matlab下的通信类serial类元件库实现串行通信,并利用avr单片机对采集到的数据进行相应处理。
关键词:串行通信; serial类对象; avr单片机; matlab串行通信serial communication based on matlab and avryi lei, nie huanhuan, liu renping(north china university of technology, beijing, 100144, china)abstract: the authors present in this paper an approach for serial communication based on matlab and avr through pc and explain how to achieve the serial communication based on the component library of matlab and act respectively according to the data which the mcu collects.key words: serial communication; serial class object; mcu of avr; serial communication of matlab0 引言matlab是mathworks公司开发的一种科学计算软件。
matlab运行稳定、可靠、使用方便,是广大科研人员进行科学研究的得力助手。
matlab不仅具有强大的科学计算功能,还具有满足一般要求的数据采集以及界面设计开发等功能[1]。
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度的通信方法。
基于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进行串口调试的两种方法方法1:在command window界面下输入tmtool,打开Test & Measurement Tool窗口,在Hardware→Serial下面找到已连接的串口设备(单片机开发板通过USB转串口,对应COM2),在communicate选项卡中对串口进行设置即可。
需要注意的是,程序功能是上位机发送16bit字符串,单片机通过串口接收并回显给上位机,这16bit的字符串是不包含字符串结束标志\n的,因此在sending data下面的data format下拉菜单中,要选择%s而不是%s\n。
为了使接收字符串的时间变短,可以在configure选项卡中将timeout选项设置为1.0。
方法2:直接在command window环境下用matlab提供的函数对串口进行操作,仍然以COM2为例。
在command window环境下依次输入以下代码:
s=serial('COM2') %将串口2赋给s
s.status%查看串口2的状态
fopen(s)%打开串口2
s.status
fprintf(s,'987654321abcdef')%给串口2的发送缓存写入数据987654321abcdef fscanf(s)%从串口2的接收缓存读数据
fclose(s)%关闭串口2
s.status
delete(s)
clear s
每一个语句的执行情况如下图所示:
其中需要注意的是fprintf()函数默认采用%s\n格式,因此在这里只能输入15个字符,系统会在15bit字符串的末尾自动添加字符串结束标志\n,该标志不能在数码管上显示。
在嵌入式当中,串口是一种是用的比较多的通信和调试方式,串口主要还是用于通信,虽然是比较老的一种通信方式,但是现在依然保留并有着其活力,基本所有单片机等嵌入式处理器都保留有串口模块。
调试只是串口的一个被用来是用的附加功能,想对于昂贵的在线调试工具,它有着很多其他方面的优势,直观的显示程序运行的状态和相关变量。
由于其长时间的使用,相关技术和程序也比较成熟,很多工具都提供对串口通信和调试的支持,MATLAB,gdb等,串口监视和调试助手等也随处可以得到,相对于其嵌入式通信方式,它简单实用,适合初学者和速率要求不高的场合。
之前用过蓝牙虚拟串口将串口无线化,单片机间串口通信,wifi模块和ARM7串口通信,单片机于PC机串口通信,这次的综合课程设计需要在PC上对串口数据进行频谱的分析,于是就想使用MATLAB数学计算软件,应该相对简单点,果然,在提供相关数学运算函数的前提下,对各种设备的支持也很强大,在这里说一下我我在这次试验中对MATLAB对串口操作的理解。
前提还是阅读MATLAB自带的help文档,这是软件提供的最权威和全面的支持,但是很多人却忽略。
检索对自己有用的信息也是一种能力。
在MATLAB中有三种方式来操作串口,但是最终原理都是一样的。
1,simulink工具箱仿真2,Instrument control toolbox3,使用MATLAB变成语言,编写自己的程序控制在Instrument control toolbox中,就像个串口助手,可以以图像化的方式设置各种参数,进行各种操作。
在工具箱中,可以将你进行的操作实时的转换成m 文件,如果你不知道怎么编写控制串口的m文件,可以进行相关操作,然后参考生成的m文件进行编程。
simulink工具箱相对而言是比较高级的功能仿真工具,一般是在隐藏硬件细节的前提下功能仿真,如果你不熟悉原理,使用起来会一头雾水,特别是出错时,所以建议在熟悉了底层实现的前提下使用。
Matlab中的串口通信与硬件控制在科学与工程领域,与硬件设备的通信和控制是一个非常重要的环节。
例如,根据传感器的读数来控制机器人的运动、通过串口与测量仪器进行数据交互等等。
Matlab作为一种功能强大的数学软件,提供了强大的串口通信与硬件控制功能,能够帮助工程师和科学家们简化开发流程并降低开发难度。
一、串口通信基础串口通信是一种实现设备之间数据传输的常见方式。
在Matlab中,我们可以通过Serial对象来实现与串口设备的通信。
首先,需要了解一下串口通信的基本概念。
1. 波特率(Baud Rate)波特率是指每秒传输的比特数。
它决定了数据传输的速率。
在串口通信中,发送端和接收端的波特率必须保持一致,否则数据会出现错误。
2. 数据位(Data Bits)数据位是指每个字符中实际的数据位数。
常见的数据位数有5位、6位、7位和8位。
一般来说,数据位较多可以提供更高的数据传输精度。
3. 校验位(Parity Bit)校验位是一种用于检测数据传输错误的方法。
它可以用于检验数据位中有效数据的奇偶性,常见的校验位有None、Even和Odd三种模式。
4. 停止位(Stop Bit)停止位是指每个字符的结束位数。
常见的停止位有1位和2位,通常使用1位即可。
二、Matlab中的串口通信Matlab提供了Serial对象来实现与串口设备的通信。
首先,我们需要创建一个Serial对象,并设置合适的串口参数。
例如,我们可以使用如下代码创建一个Serial对象:```matlabs = serial('COM1'); % 创建一个Serial对象,指定串口为COM1set(s, 'BaudRate', 9600); % 设置波特率为9600set(s, 'DataBits', 8); % 设置数据位为8位set(s, 'Parity', 'None'); % 设置校验位为Noneset(s, 'StopBits', 1); % 设置停止位为1位```接下来,我们可以打开Serial对象并开始串口通信:```matlabfopen(s); % 打开Serial对象```可以使用`fwrite`函数向串口写入数据,使用`fread`函数从串口读取数据。
数字信号处理2012电子信息工程专业答辩报告姓名杨全任伟学号********* *********成绩Matlab与51单片机的串口通信一、简介从Matlab6.0版本开始,Mathworks公司在软件中增加了设备控制箱(instrument control toolbox),提供了对RS-232/RS-485通信标准串口(九针串口)通信正式支持(本实验采用USB转串口)利用该工具箱serial类及instrcallback()回调函数,能可靠地进行实时串地通信。
Matlab支持面向对象技术,用一个对象将计算机串口封装起来,只要创建串口对象,对串口对象操作就是对串口操作,非常方便。
使用serial函数就可创建串口对象,通过定义串口对象的属性,能定义串口的通信模式,从串口对象属性也能了解串口的状态,即可以通过MATLAB的串口通讯函数读写数据。
二、 Matlab串口函数serial 创建一个串口对象,格式:s = serial('coml' )fopen 打开串口对象,格式:fopen(s)fwrite 其他程序能对该串口进行读写操作fwrite(s,’’)fread 读取串口数据,格式: fread(s)fclose 关闭串口对象,格式:fclose(s)free 解除Matlab对串口对象的控制,使delete 删除对象s,格式:delete(s)clear 从工作空间中删除对象s,格式:clear(s)三、实现功能利用MATLAB串口通信函数,读写51单片机(STC89C52R+)数据,运用keil编写时钟程序,烧录到单片机中,时钟程序实现的功能是实现时钟的显示,并且能用开发板上的三个按钮进行时钟的修改,一个按钮进入修改模式(复位),另两个实现时间的增减。
编辑MATLAB程序,实现对单片机的控制。
读写串口操作。
初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口读写操作支持二进制和文本(ASCII)两种方式。
当Matlab通信数据采用西方(ASCII)方式时,读写串口设备命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备命令分别是fread、fwrite。
四、具体实现4.1开发板4.2 实现流程先创建创建串口设备对象,配置串口初始化的对象属性,连接窗口物理设备(开发板),写发送通信握手信号;进行读写操作(串口发送接收数据)。
4.3 时钟程序见附录(添加串口接收部分)4.4 Matlab的操作如下%%%%%%默认COM4属性设置%%%%%s=serial('com4')%开启串口COM4的函数并设置属性Serial Port Object : Serial-COM4Communication SettingsPort: COM4BaudRate: 9600Terminator: 'LF'Communication StateStatus: closedRecordStatus: offRead/Write StateTransferStatus: idleBytesAvailable: 0ValuesReceived: 0ValuesSent: 0>> fopen(s);%打开s(COM4串口)>> fwrite(s,'00000000')>> fwrite(s,'00000000')%显示清零;及时拍下数码管显示如下图fwrite(s,'00 0C FE')%数码管显示00010及时拍下数码管显示如下图>> fwrite(s,'00 0C FE')%写入数据>> v=fread(s,30); %读取前30个数据>> dec2hex(v) %转换成16进制输出ans =8080A0888080A889808008808080MATLAB串口输出的数据与串口输出的数据作比较可以发现读取的数据一样,由于时钟程序反馈的数是变化的所以不能够比较准确的将它们一个不差的比较出来。
五、总结:用MATLAB的串口功能与一般的串口调试助手的功能是一样的,都能准确的读写数据,可以接受和发送一般十六进制的数。
总的来说本实验还有一些要改的地方比如说,在51程序的设计方面有些地方编写的不太好(基本功能:波特率9600,发出十六进制的数据,触发串口中断,接收十六进制数完成功能调试),用MATLAB串口和超级串口来接收和发送数据的时候不太理想,会出现一些误差使得反馈值计算错误,由于MATLAB的GUI(图形用户界面)的设计上知识的不足没能完成,如果编写好回调函数,使用MA TLAB的GUI 做一个电子时钟显示就更好了。
六、附录51程序(添加串口发送和接收功能可以进行MATLAB的GUI设计)#include <REGX52.H>#define LED_SELECT P2// 数码管位选#define LED_DATA P0// 数码管段选#define KEY_PIN P3// 定义按键接口//变量定义和单片机引脚unsigned char light[]={1,2,3,4,5,6,7,8};//数码管位选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,*/0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff, //熄灭};enum{LED_GOOUT = 10,};unsigned char LEDBuffer[6]; //显示缓冲区unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char count;bit Timer1sFlg;/*--------------------函数声明----------------*/void AT89S51Config(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(); //AT89S51配置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 AT89S51Config(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 ); //操作对象是TI TI=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; //小时个位送显示缓冲区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[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);}数字信号处理课程报告答辩记录。