Matlab与51单片机的串口通信
matlab中的串口通信通信系统设计
文章标题:探索Matlab中的串口通信系统设计在当前的现代通信系统中,串口通信系统设计已经成为一项至关重要的任务。
在Matlab中,借助各种工具和函数,我们可以设计出高效、稳定和灵活的串口通信系统。
本文将从简单到复杂、由浅入深地探讨Matlab中的串口通信系统设计,为读者提供全面的了解和深入的思考。
1. 串口通信系统概述在进行Matlab中的串口通信系统设计之前,我们首先需要了解串口通信系统的基本概念和原理。
串口通信是通过串行接口进行数据传输的一种通信方式,它在各种领域中都有着广泛的应用,包括嵌入式系统、通信设备、工业控制等。
Matlab作为强大的工程计算软件,为我们提供了丰富的工具和函数来进行串口通信系统设计,包括串口对象、串口配置、数据读写等功能。
2. Matlab中的串口通信基本操作在Matlab中,我们可以通过串口对象来进行串口通信的基本操作。
我们需要创建一个串口对象,并进行相应的配置,包括波特率、数据位、停止位、校验位等参数。
我们可以使用该串口对象来进行数据的读写操作,可以发送数据到外部设备,也可以接收来自外部设备的数据。
通过Matlab中丰富的串口函数,我们可以轻松实现串口通信系统的基本功能。
3. Matlab中的串口通信系统设计在实际的工程应用中,我们通常需要设计更加复杂和灵活的串口通信系统。
在Matlab中,我们可以借助信号处理工具箱、通信工具箱等功能来进行串口通信系统的设计。
通过信号处理工具箱,我们可以实现对串口数据的解调、调制、滤波等操作,从而提高通信系统的稳定性和性能。
而通信工具箱中的各种算法和工具则可以帮助我们实现更加复杂的通信协议和数据处理。
4. 个人观点和总结在我看来,Matlab是一款非常适合进行串口通信系统设计的软件,它不仅提供了丰富的工具和函数,还具备强大的计算能力和灵活的编程环境。
通过Matlab,我们可以实现从简单到复杂的串口通信系统设计,为各种应用场景提供定制化的解决方案。
51单片机串口通信(相关例程)
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单片机的串行数据通信设计摘要:介绍了基于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]。
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度的通信方法。
51单片机串口通信程序。。含详细例子
{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
MATLAB串口通讯
if recdta==255 %找帧头
rectr=rectr+1; %接收计数器加1
recbuf(rectr)=recdta; %送入接收缓冲区
elseif recdta==framelen&rcbuf(1)==255 %验证接收长度和帧头
%以下程序用以数据进行滤波
inbuffer2=filter(…., Inbuffer1);
%以下程序用以对滤波后数据进行文件存储
fid = fopen('C:\MATLAB7\work\data.txt','a+'); %创建并data.txt文件
fprintf(fid,'%3d',inbuffer2); %将滤波后数据存储到fid文件设备中
%根据具体通讯协议提取数据
…
%接收滤波后的数据
….
plot(…) %输出显示
end
else rectr=0; %未找到帧头清计数器
end %接收结束
end %主循环结束
g.inputbuffersize=256; %设置输入缓冲区为256b,缺省值为512b
g.Terminator='LF'; %设置输入缓冲区为256b,缺省值
recbuf=zeros(1,40); %清接收缓冲区(40)
framelen=23; %帧长度(每帧23byte)
%修改后的instrcallback.m文件如下:
function instrcallback(obj, event)
%以下是用户自行添加的通信事件处理及通信数据处理的中断服务程序代码
%定义存储串口30个字节通信数据的数组
MATLAB与51单片机通信
桂电二院科协出品,版权所有,转载不究。
maswell_xiao@
程序的最后用 dat = fread(s)读取单片机给 MATLAB 发送的数据,显然 dat 的数据对应的 ASCALL 码正好是单片机程序里对应的‘has been received’
桂电二院科协出品,版权所有,转载不究。
以上三种格式等价,都可以设置串口 1 的波特率为 4800。
2. fopen 函数,打开串口对象,格式为
fileID = fopen(filename) fileID = fopen(filename, permission) fileID = fopen(filename, permission, machineformat) fileID = fopen(filename, permission, machineformat, encoding) [fileID, message] = fopen(filename, ...) fIDs = fopen('all') [filename, permission, machineformat, encoding] = fopen(fileID)
当使用 serial 函数创建一个串口对象而不用时要用该函数删除对象 s。这个与 fclose 不 同的是,fclose 仅仅是关闭串口对象暂时不用,delete 函数是直接删除,若使用 delete 函数删除对象还想再用时就要用 serial 函数重新创建串口对象用 fopen 打开对象。而 fclose 不用再创建对象。当使用 MATLAB 占用串口时,其他软件不能使用该串口,如串 口小助手。
在串口中可以这样用 clear(s)。clear 函数从工作空间删除变量,并释放系统内存。
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进行串口调试的两种方法方法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串口编程
在嵌入式当中,串口是一种是用的比较多的通信和调试方式,串口主要还是用于通信,虽然是比较老的一种通信方式,但是现在依然保留并有着其活力,基本所有单片机等嵌入式处理器都保留有串口模块。
调试只是串口的一个被用来是用的附加功能,想对于昂贵的在线调试工具,它有着很多其他方面的优势,直观的显示程序运行的状态和相关变量。
由于其长时间的使用,相关技术和程序也比较成熟,很多工具都提供对串口通信和调试的支持,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作为一种功能强大的数学软件,提供了强大的串口通信与硬件控制功能,能够帮助工程师和科学家们简化开发流程并降低开发难度。
一、串口通信基础串口通信是一种实现设备之间数据传输的常见方式。
在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`函数从串口读取数据。
MATLAB与51单片机通信
桂电二院科协出品,版权所有,转载不究。
maswell_xiao@
TH1=0xFD; //11.0592MHz 晶振下,波特率 9600
TR1=1; //使能定时器 1
EA=1;
//允许总中断
ES=1;
//允许串行中断
while(1) {
SendString("Are you OK"); while(flag); flag=1; for(i=0;i<BufferLength;i++)//象征性 LED 显示。 {
maswell xiao 于桂电二院科协 maswell_xiao@ 2012/5/5 凌晨
SendByte(*(pString+i)); } return 1; } void delay(uint a) { uint i,j; for(i=0;i<a;i++)
for(j=0;j<110;j++); } void main() {
uint i; TMOD=0x20; //使用八位重载定时器 1 SCON=0x50; //允许接受,串行工作模式 1 ,10 位异步,定时器控制 TL1=0xFD; //11.0592MHz 晶振下,波特率 9600
P2=Buffer[i]; delay(500); } SendString("has been received"); } }
void SerialReceive() interrupt 4 {
static uchar i=0; if(RI) {
RI=0; Buffer[i]=SBUF; i++; if(i==BufferLength)i=0; flag=0;//成功接收到数据标志。 } }
Matlab与51单片机的串口通信
数字信号处理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的串口通信
通俗易懂!单片机与Matlab的串口通信
Matlab提供了对串口进行打开、关闭、以及串口参数设置等操作的一系列函数。
利用这些函数可以选择串口号、设置串口通信参数( 波特率、数据位、停止位、校验位等)、进行中断控制、流控制。
从建立串口通信到结束串口通信的完整流程包括以下几个步骤:
1、创建串口对象,实现该功能的函数为:
obj=serial(port,’PropertyName’,PropertyValue,....);
例如:obj= serial(com3,’BaudRate’4800)
或使用以下默认设置,创建串口对象,在命令串口输入以下代码,第二句是查看其obj默认状态
obj = serial(‘com3’);
obj
其中有两个重要设置项
BaudRate: 9600 % 波特率默认9600。
MATLAB串行通信的实现方法
MATLAB串行通信的实现方法1.硬件串口通信方法硬件串口是计算机与外部设备(如传感器、微控制器等)之间进行数据传输的接口。
要使用硬件串口进行通信,首先需要连接计算机和外部设备。
接下来,可以按照以下步骤在MATLAB中实现串行通信:步骤1:确定串口参数使用MATLAB提供的命令`instrhwinfo('serial')`来查看计算机上可用的串行端口和其相关信息。
根据需要,选择合适的串口参数,包括波特率、数据位、停止位和校验位等。
步骤2:创建串行端口对象使用`serial`函数创建一个串行端口对象,并指定串口号和参数。
例如,`s = serial('COM1', 'BaudRate', 9600)`将创建一个串行端口对象s,并设置波特率为9600。
步骤3:打开串口使用`s`对象的`fopen`函数打开串口连接。
例如,`fopen(s)`将打开与外部设备的串行通信连接。
步骤4:收发数据使用`s`对象的`fread`和`fwrite`函数进行数据的接收和发送。
例如,`data = fread(s, n)`将从串口接收n个字节的数据并存储在变量`data`中,`fwrite(s, data)`将发送变量`data`中的数据到串口。
步骤5:关闭串口`fclose(s)`将关闭串行通信连接。
2.虚拟串口通信方法虚拟串口是一种通过软件模拟的串口,可以在计算机上模拟硬件串口的功能。
使用虚拟串口进行通信时,不需要实际的硬件设备,只需要安装虚拟串口软件即可。
以下是使用虚拟串口进行通信的方法:步骤1:安装虚拟串口软件步骤2:创建虚拟串口对在虚拟串口软件中创建一个虚拟串口对,一个作为发送端口,一个作为接收端口。
将发送端口与接收端口进行连接。
步骤3:创建串行端口对象使用`serial`函数创建一个串行端口对象,并指定虚拟串口对的接收端口。
例如,`s = serial('COM3', 'BaudRate', 9600)`将创建一个串行端口对象s,并设置波特率为9600。
基于matlab的51单片机通信系统设计
基于Matlab的51单片机通信系统设计一、概述1. 单片机单片机是一种集成了微处理器核、存储器、定时器、I/O接口和通信接口等功能的芯片,它能够独立完成特定的任务。
51单片机是由Intel公司推出的一种经典的8位单片机,具有稳定性强、功能丰富的特点,广泛应用于嵌入式系统、自动化控制等领域。
2. MatlabMatlab是一种专业的数学计算软件,具有强大的数据处理、图像处理和通信系统设计能力,广泛应用于科研、工程和教育领域。
结合Matlab的图形用户界面(GUI)设计功能,可以简化通信系统的设计和调试过程,提高工程实施效率。
3. 通信系统通信系统是指通过信号传输技术进行信息交换的系统。
在工程领域,通信系统设计涉及到信号处理、数据传输、误码率分析等方面,需要针对特定的应用场景进行系统设计和性能评估。
二、51单片机通信系统设计方案1. 系统框图设计通过Matlab的Simulink工具箱,可以方便地设计通信系统的系统框图,包括信号源、调制器、信道、解调器和信号接收等组件。
基于这些组件,可以快速搭建一个简化的通信系统模型,用于后续的仿真和性能分析。
2. 信号处理算法设计利用Matlab的数学计算和信号处理工具箱,可以设计数字信号处理算法,例如调制解调、多址接入等,用于在51单片机上实现通信系统的核心功能。
3. 通信协议实现51单片机具有丰富的通信接口,包括串口、SPI、I2C等,可以方便地与外部设备进行数据交换。
利用Matlab、Simulink和51单片机的开发工具,可以实现常见的通信协议,例如UART、CAN、Ethernet等,用于实现与外部设备的数据通信。
4. 性能评估与优化利用Matlab的仿真功能和51单片机的调试工具,可以对设计的通信系统进行性能评估和优化。
可以通过仿真分析系统的传输速率、误码率、功耗等性能指标,找出系统的瓶颈并进行针对性的优化。
三、系统实现与验证1. 硬件设计根据通信系统的设计方案,可以进行51单片机的硬件设计和接口电路设计,包括外部传感器和执行器的接口电路、通信接口电路等。
51单片机串口通信
51单片机串口通信串行口通信是一种在计算机和外部设备之间进行数据传输的通信方式,其中包括了并行通信、RS-232通信、USB通信等。
而在嵌入式系统中,最常见、最重要的通信方式就是单片机串口通信。
本文将详细介绍51单片机串口通信的原理、使用方法以及一些常见问题与解决方法。
一、串口通信的原理串口通信是以字节为单位进行数据传输的。
在串口通信中,数据传输分为两个方向:发送方向和接收方向。
发送方将待发送的数据通过串行转并行电路转换为一组相对应的并行信号,然后通过串口发送给接收方。
接收方在接收到并行信号后,通过串行转并行电路将数据转换为与发送方发送时相对应的数据。
在51单片机中,通过两个寄存器来实现串口通信功能:SBUF寄存器和SCON寄存器。
其中,SBUF寄存器用于存储要发送或接收的数据,而SCON寄存器用于配置串口通信的工作模式。
二、51单片机串口通信的使用方法1. 串口的初始化在使用51单片机进行串口通信之前,需要进行串口的初始化设置。
具体的步骤如下:a. 设置波特率:使用波特率发生器,通过设定计算器的初值和重装值来实现特定的波特率。
b. 串口工作模式选择:设置SCON寄存器,选择串行模式和波特率。
2. 发送数据发送数据的过程可以分为以下几个步骤:a. 将要发送的数据存储在SBUF寄存器中。
b. 等待发送完成,即判断TI(发送中断标志位)是否为1,如果为1,则表示发送完成。
c. 清除TI标志位。
3. 接收数据接收数据的过程可以分为以下几个步骤:a. 等待数据接收完成,即判断RI(接收中断标志位)是否为1,如果为1,则表示接收完成。
b. 将接收到的数据从SBUF寄存器中读取出来。
c. 清除RI标志位。
三、51单片机串口通信的常见问题与解决方法1. 波特率不匹配当发送方和接收方的波特率不一致时,会导致数据传输错误。
解决方法是在初始化时确保两端的波特率设置一致。
2. 数据丢失当发送方连续发送数据时,接收方可能会出现数据丢失的情况。
MATLAB 串口通信资料
为了将模拟信号采集到,并对其经AD变换后的数字信号进行保存并处理,包括一些简单的如数字滤波和傅里叶变换等,或者之后可能用到现代的信号处理方法,于是考虑使用stm32负责信号的采集,将数据经232串口送入PC进行处理。
在PC端进行数据接收的方法也很多,典型的应该是用VC++吧?但考虑到MATLAB在信号处理方面比较适合,于是用了MATLAB 的串口通信。
单片机方面,stm32f103rb的工作包括时钟、中断、IO口、串口及AD的初始化,然后启动转换,便可以向串口发数据。
需要注意的是,当向串口发送连续两个数据时(比如16位的高低8位),在等待第一个数据发送完成的方式选择上,不能查询发送完成标志位(TC)。
若采用了查询发送完成标志位,第二个数据将覆盖第一个数据。
解决办法是采用查询发送数据寄存器空标志位(TXE)。
这次的主要工作放在了MATLAB上,因为之前对MATLAB的串口通信不熟,所以是边学边做的,然后顺便又利用GUIDE做了个简单的界面,基本达到要求,等具体用到的时候再去完善吧。
要使用MATLAB接收串口数据,首先需要新建一个串口对象,并初始化,包括波特率,停止位,有无校验,输入输出缓冲区大小等。
scom=serial('COM1'); %串口com1scom.BaudRate = 9600; %波特率scom.InputBufferSize = 1024; %输入缓冲区scom.OutputBufferSize = 1024; %输出缓冲区scom.ReadAsyncMode = 'continuous'; %异步通信时,连续读串口数据scom.BytesAvailableFcnMode = 'byte'; %中断触发事件scom.BytesAvailableFcnCount = 100; %当缓冲区数据scom.BytesAvailableFcn = @instrcallback; %调用回调函数以上是串口的部分属性及相应的修改,若要查看全部属性,可使用语句get(scom),并根据需要自己的修改相关属性。
MATLAB与单片机的串行通信接口设计
The Design of Serial Communication Interface Between MATLAB and MCU 作者: 谢芳芳 王焱玉
作者机构: 湖南工业职业技术学院电气工程系,湖南长沙,410208
出版物刊名: 湖南工业职业技术学院学报
页码: 4-5页
年卷期: 2013年 第6期
主题词: MATLAB 单片机 串行通信 接口设计
摘要:为了在MATLAB环境下对单片机现场采集数据进行分析处理,需要设计单片机与MATLAB之间的串行通信接口。
本设计利用DS18820和STC89C52RC现场采集温度数据,上位机中的MATLAB软件采用回调函数实时获取单片机传来的数据并在图形界面上显示,设计给出了串行通信接口的硬件方案与程序。
运行调试结果表明,单片机与MATLAB之间有效地实现了数据通信,以此为基础,可在MATLAB环境下对数据进行深入分析与处理。
MATLAB环境下地串口通信软件
西安电子科技大学第二十一届“星火杯”大学生课外学术科技作品竞赛科技发明制作类说明书作品名称:MATLAB环境下的串口通信软件作品类别:计算机软件开发和设计类作品作品编号:_______________________________作品功能简介及使用说明书MATLAB环境下的串口通信软件,图形化操作界面。
用于对计算机的串口进行设置,数据收发,数据处理。
可实现串口开关,串口属性设置,串口状态检测。
可通过本软件对下位机发送指令。
根据回传的数据,绘制实时数据曲线,可切换显示模式,曲线图,回传数据可保存。
可根据回传数据的变化情况发送相应的指令。
演示视频中为此软件作为温度监测系统上位机软件的应用。
此软件可作为通用的串口通信调试器。
编译后生成EXE文件,可脱离MATLAB环境运行。
程序主界面:使用说明:光盘中有功能演示视频串口选择区如串口成功打开,按钮变为绿色,并弹出提示框串口设置区波特率设置等待时间与奇偶校验设置可选择或编辑波特率默认为无奇偶校验串口状态检测按钮点击显示串口名,串口开关状态,波特率,记录状态数据发送区点击Send Now按钮将编辑框中的数据通过串口发往下位机数据接收区文本框中为从计算机从串口接收到的数据。
点击Clear按钮清空接收区。
数据可点击工具栏中的相应按钮保存。
温度控制部分曲线显示模式选择设置报警温度局部显示按钮与整体显示按钮温度超过范围将提醒并发送相应指令代码到下位机数据曲线图曲线图显示模式可选择,图片,数据可另存。
点击Clear Figure按钮清空曲线图点击工具栏中的保存按钮,选择保存路径与存储格式。
部分程序源代码:function varargout = MyfirstGui(varargin)% MyfirstGui M-file for MyfirstGui.fig%串口通信调试器与温度监控系统上位机软件% 2009.8~11%发送按钮回调函数function Send_Callback(hObject, eventdata, handles) global s;SendingSrting=get(handles.SendString,'String');fprintf(s,'%c',SendingSrting);%清除按钮回调函数function Clear_Callback(hObject, eventdata, handles)set(handles.Received,'String','Received:');global ReceivedFromMcu;ReceivedFromMcu='Reveived:';%串口设置部分%串口开关设置% --- Executes on button press in COM1.function COM1_Callback(hObject, eventdata, handles)% Hint: get(hObject,'Value') returns toggle state of COM1 global s;button_state = get(hObject,'Value');if button_state == get(hObject,'Max')set(1,'BackgroundColor','default');set(2,'BackgroundColor','default');set(3,'BackgroundColor','default');set(4,'BackgroundColor','default');delete(s);s=serial('com1');s.BytesAvailableFcnMode='byte';s.BytesAvailableFcnCount=1;s.BytesAvailableFcn=@ReceiveButton;fopen(s);set(hObject,'BackgroundColor','green');message='COM1 is Open';msgbox(message);elseif button_state == get(hObject,'Min')fclose(s);set(hObject,'BackgroundColor','default');end%编辑波特率function EditBaudRate_Callback(hObject, eventdata, handles)% Hints: get(hObject,'String') returns contents of EditBaudRate as text% str2double(get(hObject,'String')) returns contents of EditBaudRate% as a doubleglobal s;user_entry = str2double(get(hObject,'string'));if isnan(user_entry)errordlg('You must enter a numeric value','Bad Input','modal')uicontrol(hObject)returnends.BaudRate=user_entry;message=['Baudrate=' get(hObject,'string')];msgbox(message);% --- Executes during object creation, after setting all properties.function EditBaudRate_CreateFcn(hObject, eventdata, handles)% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');end% 选择波特率function SelectBaundRate_Callback(hObject, eventdata, handles)% Hints: contents = get(hObject,'String') returns SelectBaundRate contents as cell array% contents{get(hObject,'Value')} returns selected item from% SelectBaundRateglobal s;val = get(hObject,'Value');switch valcase 1s.BaudRate=9600;set(handles.EditBaudRate,'string',' ');case 2s.BaudRate=4800;set(handles.EditBaudRate,'string',' ');case 3s.BaudRate=14400;set(handles.EditBaudRate,'string',' ');case 4s.BaudRate=28800;set(handles.EditBaudRate,'string',' ');end% 选择等待时间function TimeOut_Callback(hObject, eventdata, handles)% Hints: contents = get(hObject,'String') returns TimeOut contents as cell array% contents{get(hObject,'Value')} returns selected item from TimeOutglobal s;val = get(hObject,'Value');switch valcase 1s.TimeOut=10;case 2s.TimeOut=5;case 3s.TimeOut=2;case 4s.TimeOut=1;end% --- Executes during object creation, after setting all properties.function TimeOut_CreateFcn(hObject, eventdata, handles)% Hint: popupmenu controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');end%奇偶校验设置function Parity_Callback(hObject, eventdata, handles)% Hints: contents = get(hObject,'String') returns Parity contents as cell array% contents{get(hObject,'Value')} returns selected item from Parityglobal s;val = get(hObject,'Value');switch valcase 1s.Parity='none';case 2s.Parity='even';case 3s.Parity='odd';end%检查串口属性按钮function CheckSerial_Callback(hObject, eventdata, handles)global s;item1=;set(handles.Check1,'String',item1);item2=s.Status;set(handles.Check2,'String',item2);item3=s.Baudrate;set(handles.Check3,'String',item3);item4=s.RecordStatus;set(handles.Check4,'String',item4);%接收字符回调函数function ReceiveButton(hObject, eventdata, handles)global s;global ReceivedFromMcu;global Myhandles;global x;global y;global a;persistent Char_Buffer;persistent count;%%initialize the persistent variableif isempty(Char_Buffer)Char_Buffer=[];endif isempty(count)count=0;endReceived_Char=fscanf(s,'%c',1);%%ReceivedFromMcu will be displayed in the received zone ReceivedFromMcu=[ReceivedFromMcu Received_Char];%%Char_Buffer will be converted to numbersChar_Buffer=[Char_Buffer Received_Char];%%When the port has received a ' ',it means the begining of another %%converting action.if Received_Char==' ';Char_Buffer=[];end%%Check the Char_Buffer,if available,it will be sent to ySizeof_Char_Buffer=size(Char_Buffer);if (Sizeof_Char_Buffer(2)==4)&&(Char_Buffer(3)=='.');%%Give numbers to the figurey=[y sscanf(Char_Buffer,'%g')];x=[x count];count=count+1;end%%Get the last value of y[a,b]=size(y);if(b>0)a=y(1,end);end%%Plot the Temperature Lineif a>Myhandles.Highplot(Myhandles.axes1,x,y,'m^');elseif a<Myhandles.Lowplot(Myhandles.axes1,x,y,'b^');elseplot(Myhandles.axes1,x,y,'r^');endset(Myhandles.axes1,'YGrid','on');set(Myhandles.axes1,'YMinorGrid','on');%%Set axes according to DisplayModeif Myhandles.DisplayMode==0set(Myhandles.axes1,'YLim',[a-1.5 a+1.5]);elseset(Myhandles.axes1,'YLim',[a-10 a+10]);end%%Show the current temperatureif Received_Char~=' ';temp=['Current Temperature:',Char_Buffer];set(Myhandles.Current_Temperature,'String',temp);end%%Warning Functionslope=0;if b>50slope=y(b)-y(b-49);endif slope>0.2set(Myhandles.Warning,'Visible','on');set(Myhandles.Warning,'String','WARNING:Temperature is going up quickly!');elseif slope<0set(Myhandles.Warning,'Visible','on');set(Myhandles.Warning,'String','WARNING:Temperature is decling!'); elseset(Myhandles.Warning,'Visible','off');end%%Clear the received zone when it's fullSizeOfReceived=size(ReceivedFromMcu);if SizeOfReceived(2)>500ReceivedFromMcu='Rcecived:';endset(Myhandles.Received,'String',ReceivedFromMcu);%清除图像按钮function ClearFigure_Callback(hObject, eventdata, handles)global x;global y;x=x(end);y=y(end);plot(handles.axes1,x,y,'r.');%曲线显示模式选择% --- Executes on button press in Part.function Part_Callback(hObject, eventdata, handles)global Myhandles;global a;state = get(hObject,'Value');if state == get(hObject,'Max')%Change modeMyhandles.DisplayMode=0;end%Set axes according to DisplayModeif Myhandles.DisplayMode==0set(Myhandles.axes1,'YLim',[a-1.5 a+1.5]);elseset(Myhandles.axes1,'YLim',[a-10 a+10]);end% --- Executes on button press in Whole.function Whole_Callback(hObject, eventdata, handles)global Myhandles;global a;state = get(hObject,'Value');if state == get(hObject,'Max')%Change modeMyhandles.DisplayMode=1;end%Set axes according to DisplayModeif Myhandles.DisplayMode==0set(Myhandles.axes1,'YLim',[a-1.5 a+1.5]);elseset(Myhandles.axes1,'YLim',[a-10 a+10]);end%设置报警温度function Low_Callback(hObject, eventdata, handles)% Hints: get(hObject,'String') returns contents of Low as text% str2double(get(hObject,'String')) returns contents of Low as a double global Myhandles;user_entry = str2double(get(hObject,'string'));if isnan(user_entry)||user_entry >=Myhandles.Higherrordlg('You must enter a rightful numeric value','Bad Input','modal')uicontrol(hObject)returnendMyhandles.Low=user_entry;message=['Warning Low Temperature=' get(hObject,'string')];msgbox(message);function High_Callback(hObject, eventdata, handles)% Hints: get(hObject,'String') returns contents of High as text% str2double(get(hObject,'String')) returns contents of High as a double global Myhandles;user_entry = str2double(get(hObject,'string'));if isnan(user_entry)||user_entry <=Myhandles.Lowerrordlg('You must enter a rightful numeric value','Bad Input','modal')uicontrol(hObject)returnendMyhandles.High=user_entry;message=['Warning High Temperature=' get(hObject,'string')];msgbox(message);%工具栏部分% -----保存图片----------------------------------------------------function Save_ClickedCallback(hObject, eventdata, handles)[file,path] = uiputfile ( {'*.jpg';'*.png';'*.bmp';'*.tif'},'Save Figure');if isequal(file,0) || isequal(path,0)return;endf=fullfile(path,file);h=getframe(handles.axes1);h=frame2im(h);imwrite(h, f);% -----新任务 ----------------------------------------------------function New_ClickedCallback(hObject, eventdata, handles)global s;Clear_Callback(hObject, eventdata, handles);ClearFigure_Callback(hObject, eventdata, handles);delete(s);set(1,'Value',0);set(2,'Value',0);set(3,'Value',0);set(4,'Value',0);set(1,'Value',0);set(1,'BackgroundColor','default');set(2,'BackgroundColor','default');set(3,'BackgroundColor','default');set(4,'BackgroundColor','default');set(handles.Warning,'Visible','off');set(handles.Current_Temperature,'string','Current Temperature:');% -----打开---------------------------------------------------function Open_ClickedCallback(hObject, eventdata, handles)[file,path] = uigetfile ( {'*.jpg';'*.png';'*.bmp';'*.tif'},'Read Figure'); if isequal(file,0) || isequal(path,0)return;endf=fullfile(path,file);I = imread( f);imshow(I);% -------保存数据 -----------------------------------function SaveReceivedString_ClickedCallback(hObject, eventdata, handles) global ReceivedFromMcu;[file,path] = uiputfile ( {'*.mat'},'Save Figure');if isequal(file,0) || isequal(path,0)return;endf=fullfile(path,file);save (f,'ReceivedFromMcu');补充说明:演示视频中与此软件通信的是STC单片机系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字信号处理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);}数字信号处理课程报告答辩记录。