电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
昆仑通态人机界面与单片机通信实战教程四:单片机程序的设计
分 享
扫描二维码分享
昆仑通态人机界面与单片机通信实战教程四:单片机程序的设计
芯知识学堂
串口通信
单片机
芯知识学堂SingleYork
关注
发布时间: 2020-01-06
丨
阅读: 1588
大家好,我是『芯知识学堂』的SingleYork,前面给大家介绍了“昆仑通态人机界面与单片机通信实战教程三:脚本驱动与HDMI工程的关联”,今天笔者就要来给大家介绍这个教程的最后一个内容,那就是:“昆仑通态人机界面与单片机通信实战教程四:单片机程序的设计”。 该例程笔者选用的是自己做的,以STC15W4k48S4这款单片机开发的一款带有14路输入和12路输出的控制板(3D图如下),软件开发平台为keil4。 ![](https://cf04.ickimg.com/bbsimages/202001/98f066497f303ac7aa5f6a7d78bf007c.png) 那么,我们首先来开打keil软件,新建一个工程: ![](https://cf04.ickimg.com/bbsimages/202001/c6b96c94687dd1ac49fc555f03b4949a.png) 我们给新建的工程名,命名为“MCGS_Demo”,并且保存到自定义的文件夹中: ![](https://cf04.ickimg.com/bbsimages/202001/5af1db110b634d0bc3c5fc8db77db352.png) 选择单片机型号为STC15W4K32S4,准确的说,这应该是STC15W4K32S4这个系列,在后面单片机程序下载的时候,可以选择这个系列下的某一个型号的单片机。 ![](https://cf04.ickimg.com/bbsimages/202001/a820ca43cbdd87f0e7c77770f392a0c9.png) 选定好单片机后,我们点击“OK”按钮即可,然后会弹出如下对话框,这个地方我们选择“是”或者“否”都没有太大的影响: ![](https://cf04.ickimg.com/bbsimages/202001/6204cd935889b04116d02d8c85e12c3a.png) 笔者就以选择“是”为例,就这样,一个新的工程就建好了。刚建好的工程,默认只有这么一些东西: ![](https://cf04.ickimg.com/bbsimages/202001/61d283229b42530e7d2f17233c3f2f9d.png) 那么,为了便于后续项目的管理,以及工程的移植,我们来对整个工程的文件夹做一些管理,在原来的工程目录中,我们新建了BSP、Project、ReadMe、STCLib、SYSTEM、USER几个文件夹: ![](https://cf04.ickimg.com/bbsimages/202001/6cad9fbac56b6216207f8cbc7831cb92.png) 同时,我们将之前新建工程的时候生成的文件,全部移到了Project这个文件夹中: ![](https://cf04.ickimg.com/bbsimages/202001/171757ebdf6a4cb5e10f1815bc39de36.png) 然后,在BSP文件夹中,主要是放置一些板级支持包文件,笔者偷了一下懒,就没建额外的文件夹区分头文件和C文件了,就统一放到这个BSP文件夹中了: ![](https://cf04.ickimg.com/bbsimages/202001/8448841e27168f7481139054d28b309c.png) ReadMe这个文件夹中,主要是放置了一个ReadMe.txt的说明文档,主要就是关于这个工程的一些说明,该例程中,笔者主要是添加了“通信协议”的说明: ![](https://cf04.ickimg.com/bbsimages/202001/492dd3c480c58ff5e62aba2ed8a3def3.png) STCLib文件夹中,主要是放置了一个config.h的配置文件,这个文件主要是配置了系统使用的晶振频率,以及包含了STC15系列单片机的头文件,这里需要说明的是,软件中晶振频率的配置,要跟实际下载时晶振频率的选择要一致,否则,有些功能就可能出问题: ![](https://cf04.ickimg.com/bbsimages/202001/c14d5926eb49aac9c96dadf2a5c24b8a.png) SYSTEM这个文件夹中,主要放置了STC15系列单片机的一些库文件,在这个文件夹中,单独设置了两个文件夹inc和src,其中,inc文件夹主要是放置了该项目用到的相关库的头文件(.h文件),src文件夹中主要放置了该项目用到的相关库的一些源文件(.c文件): ![](https://cf04.ickimg.com/bbsimages/202001/e7d30d0f06d39b4bb46a03ed793b5907.png) ![](https://cf04.ickimg.com/bbsimages/202001/79802d395839e29ace6ec378c8f10480.png) ![](https://cf04.ickimg.com/bbsimages/202001/88a3109917e3fea64955d8d61a2b125f.png) 最后就是USER这个文件夹了,这个文件夹里面其实就只放置了一个main.c文件: ![](https://cf04.ickimg.com/bbsimages/202001/9ae878341bbba93347148b1794d73f3a.png) 接下来,我们在keil工程目录中,添加新的分组,并且将这些分组的组名,跟我们之前新建的文件夹名保持一致: ![](https://cf04.ickimg.com/bbsimages/202001/79b9daa1d0289bc2dcbece786ffe9f36.png) 然后,我们逐一用鼠标左键双击每个组名,给改分组中添加我们需要的文件,以USER这个分组为例,往其中添加main.c这个文件: ![](https://cf04.ickimg.com/bbsimages/202001/97660e6479053a4bf70fc83027738c8b.png) 那么,接下来,我们主要来看每个文件中的内容,说到这里,其实SYSTEM文件夹中的文件,我们基本不用管,因为这个是STC官方提供的一些库函数,只是有些库函数文件中有一些我们不需要的东西,直接删除就好了。我们最主要需要关心的就是USER和BSP这两个分组内的文件。 首先,我们来看bsp_gpio.h这个文件,这里主要是板载输入输出的一些宏定义: ![](https://cf04.ickimg.com/bbsimages/202001/ec018e4aa1744155c96db1340152ae04.png) bsp_gpio.c这个文件中,主要是对板载输入输出口模式进行了配置: ![](https://cf04.ickimg.com/bbsimages/202001/9f08885add6f3f65da36b0fd719dc3ab.png) bsp_timer.h和bsp_timer.c这两个文件,是对定时器进行了配置,不过,实际上本例中并没有用到定时器的相关功能,这里仅仅简单为大家介绍一下定时器的基本配置: ![](https://cf04.ickimg.com/bbsimages/202001/95a06abff75a7f3eb984ac7b75f0e087.png) ![](https://cf04.ickimg.com/bbsimages/202001/86a55c55afa8e90600bb0a61d1937180.png) bsp_usart.h和bsp_usart.c这两个文件,主要是对串口进行了配置,本例中使用的是串口1,波特率使用的是9600: ![](https://cf04.ickimg.com/bbsimages/202001/9a9347539554b4ab08d34954481a7f39.png) ![](https://cf04.ickimg.com/bbsimages/202001/4d190fbf4a1209f57077dce2c94e8346.png) 重头戏主要是在bsp_run.c和bsp_run.h这两个文件中,其bsp_run.h功能可能比较简单一些,仅仅只是声明了两个函数: ![](https://cf04.ickimg.com/bbsimages/202001/067e1070075947fc11216f2ce71ae0a1.png) 例程的主要功能,基本都是在bsp_run.c这个文件中实现: ![](https://cf04.ickimg.com/bbsimages/202001/94551593aeec12c298a0783f96cfdd0a.png) 这里,我们重点来看一下UART1的中断函数,这个函数中,主要实现了数据帧的帧头检验、和校验以及数据的缓存。当帧头校验、和校验OK后,让标志位F_Uart1_RX_Finish置1,然后进入数据解析函数: ![](https://cf04.ickimg.com/bbsimages/202001/3ff82a56be9d91727e299c47c5fd410a.png) ![](https://cf04.ickimg.com/bbsimages/202001/a67ac79534bc5f4ebe95a098a1272912.png) 该例程中,串口数据解析主要是解析两条指令,一个是触摸屏的“读指令”(轮询指令)、一个是触摸屏的“写指令”(按键操作): ![](https://cf04.ickimg.com/bbsimages/202001/a99b74cb463ef213cf943f6e722d6a6f.png) 其中,在接收到触摸屏的“读指令”(轮询指令)后,单片机会返回一条应答指令,该指令的具体含义请参考ReadMe.txt中的“通信协议”: ![](https://cf04.ickimg.com/bbsimages/202001/286f210b61f4982a2dbb293b61539e15.png) 在接收到触摸屏的“写指令”(按键控制)时,单片机会根据指令的具体内容,让对应的输出口输出不同的状态(本例中,笔者仅仅只是将输入口电平做了翻转): ![](https://cf04.ickimg.com/bbsimages/202001/12589c0e2c556168ec86220dc31d7c3c.png) 好了,最后我们就是来看下main.c里面的内容,正因为大部分功能实现都放在了bsp_run.c里面了,所以main.c里面的内容就相对比较简单了,除了调用了定时器配置函数、串口配置函数、GPIO配置函数,然后就是在while循环里面直接跑Device_App_Run函数: ![](https://cf04.ickimg.com/bbsimages/202001/ed4712d5408cb8ef09b64190ac9ff9fd.png) 程序部分就简单给大家分析到这里了,详细的代码大家可以下载本例的源码。现在,我们来开始下载单片机程序到我们的控制板中。 首先,我们打开STC的下载软件,单片机型号选择STC15W4K48S4,串口号根据大家电脑上的实际串口号选择,晶振勾选使用内部晶振,并且将内部晶振频率设置为11.0592MHz,然后点击“打开工程文件”,加载我们编译生成的.hex文件: ![](https://cf04.ickimg.com/bbsimages/202001/736b77da88d12965bbfb864b4e5abd24.png) 找到我们工程目录下Project->Objects文件夹中的MCGS_Demo.hex文件,点击“打开”按钮即可: ![](https://cf04.ickimg.com/bbsimages/202001/a621c10f05cd8103606a70722dbc8a68.png) 然后,我们点击“下载/编程”按钮,然后会出现“正在检测目标单片机”的提示: ![](https://cf04.ickimg.com/bbsimages/202001/e6777d4876df8403a740800771ee3988.png) 这个时候,给板子断电再上电(如果之前板子未上电,这个时候仅仅需要上电即可),程序便开始下载了: ![](https://cf04.ickimg.com/bbsimages/202001/1b8a63632b0ddb6e70afe88b7dbf87bc.png) 然后,静静地等待程序下载完成即可,当出现了“操作成功”的提示之后,就说明我们的程序成功下载了: ![](https://cf04.ickimg.com/bbsimages/202001/e5789c2686cc1b3a41c5975bdfdca21e.png) 接下来,我们需要来验证一下程序是否正确。我们先打开MCGS的HDMI工程,在“设备窗口”的“通用串口父设备”中设置串口号和波特率: ![](https://cf04.ickimg.com/bbsimages/202001/86f190f05681b3b3b94adf57571d82ac.png) 然后在“子设备”中,设置“最小采集周期”为200ms(这个大家可以根据实际需求设置,但是不宜设的太小): ![](https://cf04.ickimg.com/bbsimages/202001/a2b4fc1373f61fbe5ba7d307ddf8291a.png) 接下来,我们开始下载工程,准备模拟运行: ![](https://cf04.ickimg.com/bbsimages/202001/49ec0ac7e772e6aa4a880ac5bbf6a02e.png) 当显示“工程下载成功”后,我们点击“启动运行”即可模拟运行了,这个时候,我们可以点击触摸屏上的几个输出控制按钮,便可以看到触摸屏和板子上的输出状态都在改变,同时我们可以给板子输入口接入低电平,同样也能看到,当板子上的输入口状态发送改变时,触摸屏上的输如口状态也在改变: ![](https://cf04.ickimg.com/bbsimages/202001/e6dc68d1028fe2d7c654f501472ab2f1.png) 至此,本节的内容就全部介绍完毕了,关于这节内容,要是有不明白的地方大家可以关注我们的微信公众号『芯知识学堂』,然后在公众号菜单“获取资源”->“联系我们”中加入我们的群即可交流。 另外,如果需要例程源码的小伙伴们,可以直接在我们公众号回复“昆仑通态”,即可获取到关于该例程的源文件,源文件还在更新中,待例程编写完成,会全部上传到链接中,感谢大家的支持! 喜欢工控的小伙伴们,请大家记得多多支持SingleYork! 独学而无友,则孤陋而寡闻,欢迎大家将我们的文章分享到你们的朋友圈,或者分享给更多的好友,大家一起来互相学习,感谢大家的支持!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
芯知识学堂SingleYork
擅长:消费电子、工控电子、安防电子、光电显示、设计,制造及服务,测试仪器及设备
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交