基于matlab的串口通信,基于Matlab GUI的单片机串口与PC的通信 附源码
我也是最近学习单片机和MATLAB的小白平时在看学习的时候 下载了一些有价值的参考文献
概述采用51单片机,atmel的STC89C52RC芯片,主要用到的是七段数码管用来做一个时钟,程序编写软件为keil,烧录软件为STC-ISP 4.88,串口调试软件用的是sscom42。
运用Matlab的GUI工具编辑一个可视化界面,用以跟单片机进行串口通信
实现功能运用keil编写时钟程序,烧录到单片机中,时钟程序实现的功能是实现时钟的显示,并且能用开发板上的三个按钮进行时钟的修改,一个按钮进入修改模式,另两个实现时间的增减。
编辑GUI界面,实现对单片机的控制,其中,GUI界面通过串口能不断的采样开发板上时钟的数值,并在GUI界面上进行显示。同样的,可以通过GUI界面实现对开发板上时钟的修改。
具体实现开发板部分:
B) Matlab GUI界面的编辑
效果图如下,操作说明:START点击开始,采集单片机时钟时间,ADJUST点击进入修改模式,同时单片机开发板亦会进入修改模式,EXIT点击关串口,退出界面,GET点击获取当前值,另外一些辅助按钮,滑块按钮都有各自功能,易于理解。
其中:添加控件,具体略
START添加callback:
global s
s=serial('COM10');
fopen(s);
handles.timer = timer('TimerFcn',{@mycallback,handles}, 'Period',0.01,'ExecutionMode','FixedRate');
start(handles.timer);
ADJUST添加callback:
a=get(handles.text8,'String');
set(handles.text28,'String',a);
a=get(handles.text10,'String');
set(handles.text27,'String',a);
a=get(handles.text13,'String');
set(handles.text25,'String',a);
a=get(handles.text14,'String');
set(handles.text24,'String',a);
a=get(handles.text15,'String');
set(handles.text22,'String',a);
a=get(handles.text16,'String');
set(handles.text21,'String',a);
global s
fwrite(s,0);EXIT添加callback:
global s
fclose(s);
close;GET添加callback:
global s
a=fread(s,6);
set(handles.text8,'String',a(6));
set(handles.text10,'String',a(5));
set(handles.text13,'String',a(4));
set(handles.text14,'String',a(3));
set(handles.text15,'String',a(2));
set(handles.text16,'String',a(1));调整时钟 调整分钟 调整秒钟 都添加callback:
global s
a=str2num(get(handles.edit1,'String'));
fwrite(s,a);SLIDER1添加callback:
a=get(handles.slider1,'value');
set(handles.edit1,'String',a);
C)操作说明
1. 开发板上的按钮修改时钟显示
2. 开发板上时钟显示
3. START前的开发板以及GUI界面,此时GUI界面的时钟无显示
4. START点击后GUI有了显示,与开发板显示一致
5. ADJUST点击后进入修改模式,开发板同步进入修改模式,同时GUI保留当前时间quondam time,随后分别调整秒钟 时钟 分钟,可以用编辑框,也可以用滑块.
6. 点击调整时钟后,显示调整结束。
7. 同时,也可以用单片机上的按钮调整时钟,同时GUI会实时返回设置值
时钟显示程序如下(并且加入了串口接收部分)
Main.c
#include
#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 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 ); //操作对象是TI
TI=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 ); //操作对象是TI
TI=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; //小时个位送显示缓冲区
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 ); //操作对象是TI
TI=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<
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);
}
完整的Word格式文档51黑下载地址:
2018-11-30 14:38 上传
点击文件名下载附件
基于matlab的串口通信,基于Matlab GUI的单片机串口与PC的通信 附源码相关推荐
- 【021】基于springboot的党务管理系统(含管理员、用户党支部三种身份(附源码数据库)
文章目录 一.运行结果截图 二.源码获取方式: 三.保姆级操作教程: 一.运行结果截图 (详细操作过程见文末,保姆级) 技术栈:springboot.mysql.vue.mybatis.layui 我 ...
- 基于BS架构的校园爱心捐赠与物品交换平台的设计与实现 毕业设计-附源码301133
目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2校园爱心捐赠与物品交换平台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 ...
- 基于Matlab模拟、检测和跟踪飞机着陆进场中异常的仿真(附源码)
目录 一.介绍 二.生成和标记轨迹 三.定义方案 四.运行方案并检测异常轨道 五.将跟踪异常报告与事实进行比较 六.总结 七.程序 该示例显示了如何自动检测最终接近机场跑道的飞机的偏差和异常.在此示例 ...
- 基于stm32单片机的模拟IIC时序(附源码)
我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...
- 基于SSM框架的救援物资的管理与分配系统的设计与实现 毕业设计-附源码291141
救援物质的管理与分配系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的时尚潮流,人类发 ...
- springboot+基于微信小程序的心理测评与活动管理的设计与实现 毕业设计-附源码191752
小程序+spring boot心理测评与活动管理系统 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用 ...
- 基于SSM的医院门诊预约挂号系统的设计与实现(文末附源码、论文)
摘要 现在社会中计算机网络技术的高速发展以及提高,在各行各业中的使用也逐渐增多,互联网俨然已经成为了当今社会密不可缺的一部分.现在的城镇人口飞速增加,看病的人也越来越多,医院挂号窗口一般都是排成长龙一 ...
- php+mysql+基于PHP MYSQL开发的化妆品店会员管理网站的设计与实现 毕业设计-附源码131102
PHP化妆品店会员管理系统 摘 要 在经济全球化的今天,建立以客户为中心的经营战略,可以加强企业和客户间的联系.对企业来讲,为客户提供一流的服务,是企业建立品牌.实现差别化服务.取得竞争的利器.一直以 ...
- (基于安卓app开发项目)英语学习记单词软件的毕业设计(java+j2ee+mysql)(附源码)
大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦.
- 【Python游戏】基于pygame实现的一个Dino Rush 恐龙宝贝冲冲冲的小游戏 | 附源码
前言 halo,包子们晚上好 很久没有更新啦,主要是小编这边最近有点小忙 今天给大家整一个Dino Rush 恐龙宝贝冲冲冲的小游戏 还是一个比较记经典的小游戏,还记这可谷歌浏览器上没有网也能打发时间 ...
最新文章
- “5G 消息”APP 短暂上线,它会干掉微信还是变成另一个飞信?
- LeetCode Add Two Numbers
- php -i | grep configure,PHP7中I/O模型内核剖析详解
- 给枚举值增加扩展数据
- jeb反编译导出Java工程_Android 反编译(JEB.android.decompiler)
- 2021年12月Python小屋编程比赛获奖名单
- 制药企业核算报表系统整体方案
- 用成交量判断股价走势是否正常
- 如何更流畅地使用 Google 搜索?
- 计算机用户在使用计算机文件时6,201606-计算机基础选择题(含答案)(6页)-原创力文档...
- 斯威夫特山地车_斯威夫特弦乐
- pytorch nonzero_[深度学习框架]PyTorch常用代码段
- 单调队列(数列中长度不超过k的子序列和的最值)
- 概要设计的作用_【教育年会与颁奖典礼】第六届中国人居环境设计学年奖
- java 坦克大战 素材_经典90坦克大战素材
- 697小说源码PC端+手机端+采集工具(源码带3000本小说的数据)
- Js实现继承的6种方式
- 计算机图形学:中点划线法(任意斜率)
- 全国湿地分类数据:内陆沼泽、盐碱地、红树林、潮汐平地
- 北京现代2015款途胜中控系统、多媒体系统、车机系统升级教程