51单片机与迪文DGUS屏通信例程之三: 单片机程序编写

(原文来自公众号:芯知识学堂;作者:singleyork,在此特别鸣谢!) 相信接触过stc15系列单片机的小伙伴们,应该会对其编程风格比较熟悉,没错,stc15系列单片机可以采用库函数编程,官方提供了标准的函数库,我们只需要利用好库函数,便可大大简化配置流程,从而提高编程效率。由于笔者这里的教程不是关于51单片机的基础教程,所以此处省去了新建工程以及如何添加库文件等操作。
首先,我们要养成良好的习惯,在使用任何一款板子的时候,先建一个配置板载资源的文件,当然要是板子比较复杂的话,可以分模块配置多个,由于笔者使用的板子比较简单,所以就只添加了一个名为“bsp_io.h”的文件,顾名思义,就是一些输入输出的配置而已了。
接下来,我们来配置一下串口参数,在之前的帖子中我们知道,迪文dgus屏的串口通信波特率配置的是115200,那么,我们在单片机程序中,自然也要讲串口通信的波特率配置成115200,其他的就不需要修改了:
程序中有需要用到串口定时向触摸屏刷新数据,所以,这里我们也配置一个定时器,并设置起中断频率为1000hz,即:1ms中断一次。
接下来,我们需要根据板子上的io分布,来配置一下io口的输入输出模式,所有输入口均配置成“准双向口”,所有输出口均配置成“强推挽模式”。
另外,程序中也有用到两路0-5v电压的采集,所以此处我们还需要对adc相关的参数进行配置,本例程中采用的是ad口分别是p10和p11,查询方式获取ad值:
至此,系统配置相关的东西基本就完成了,接下来,我们就需要自己写一些应用相关的函数了,本例中,笔者写了四个函数:
uart1_monitor(); //串口1数据监控
uart1_send(); //串口1发送指令
adc_sampling(); //adc采样
giop_staterefresh();//gpio状态刷新
其中,uart1_monitor()函数,主要是用对串口中断接收到的数据进行解析,比如:dgus屏按键返回的指令、参数设置的指令等;uart1_send()函数,主要用来定时向dgus屏写入数据,比如:数据变量显示、图标变量显示等; adc_sampling()函数主要是对外部两路0-5v模拟量输入进行采样处理; giop_staterefresh()函数主要是用来实时刷新输入输出口的状态。
那么,我们首先来看下uart1_monitor()函数:
在这个函数中,主要是串口中断完成数据接收后,对其中两条指令进行解析,第一条指令是关于dgus屏的点动控制,也就是实现前面介绍的功能,在dgus屏上,点击y0按键,板子对应的y0口输出on,状态图标变成绿色;再一次点击y0按键,板子对应的y0口输出off,状态图标变成红色,其他按键及板子上的输出口也按照同样的逻辑执行。
第二条指令,就是一条关于时间参数设置的指令,通过触摸屏设置一个时间参数,下发到单片机,可用过某些应用场合下定时用,比如,定时让一个led输出on、off,从而实现闪烁效果等。
关于这两条指令每个字节的含义,在前面建dgus工程时也有说明,在此就不再赘述。
接下来,我们来看下uart1_send()串口发送函数,这个函数其实也很好理解,就是按照前面建dgus工程时说的指令格式,用一条指令来实现对数据变量显示和图标变量显示的控制。
这个串口发送数据的时间间隔是150ms,这个150ms的定时时间是通过定时器0来实现的:
同时,在这个定时器中断函数中,还设定了ad采用的时间间隔,即:10ms进行一次ad采样,然后,为了能让采集到的数据更准确一点,我们通过多次采样求平均值的方式进行处理,当然,还有更多更好的方式,笔者能力有限,也就不好献丑了,在此只给大家提供一个比较简单的处理方式。
最后一个函数,就是giop_staterefresh()io状态刷新的函数了,这里主要是通过一个比较简单方法,来获取当前板子上的一些输入输出状态,然后通过串口发送到dgus屏显示。
笔者能力有限,所以在本例中使用的都是一些比较笨的办法,但是笔者相信大家肯定会有更多更好的办法来实现该项目的功能,欢迎大家站内私信或者向直接通过论坛问答频道向笔者提问。
最后,也就是本项目中比较关键的一个知识点,那就是关于dgus屏的指令的接收处理,在前面介绍有介绍过迪文dgus屏的指令构成:
本例中,dgus工程配置的时候,就将帧头设置成了5a a5,由于没有启用crc校验,因此,我们也不需要关注crc校验。对于接收迪文dgus指令的思路是这样的:
先判断帧头,如果帧头验证成功了,就意味着是dgus屏在下发指令,接下来,就要判断数据的长度,所以这个长度位len就要起到比较关键的作用了,这个长度位len本身就是指后面跟随数据的总长度,因为,我们只需要在接收到len个数据后,就可以认为是接收完成了,而后即时在接收到数据也不管了。当然,除非后面的数据又是以5a a5开头的,也就意味着是一帧新的数据的到来。
在串口接收数据完成之后,会让一个变量uart1rxfinish置1,然后再uart1_monitor()函数中,一旦检测到uart1rxfinish为1后,就开始解析数据,解析完成后,将标志位uart1rxfinish清零。这样一来,就实现了对dgus屏指令的接收及解析。
至此,整个项目就完成了,只需把代码下载到板子中,并将板子跟dgus屏连接起来,就能看到项目要实现的效果了。在后续的操作文章中,笔者将会给大家介绍更多dgus屏和单片机的相关操作,敬请期待!如果小伙伴们喜欢这篇文章,认为他对你们有帮助,请不要吝啬你们的点赞和打赏哟……

指纹验证技术的两种方法,以及区别介绍
LM3421/LM343/LM3424/LM3429应用电路
大众汽车宣布支持特斯拉的北美充电标准
小米6、三星S8“重启门”,高通骁龙835莫名躺枪
青岛自动化码头的“人机大战”首战告捷 刷新世界纪录
51单片机与迪文DGUS屏通信例程之三: 单片机程序编写
一些完美的数字播放音响产品的详细概括第二部分
EMC测试中瞬态抗干扰失效的解决办法
数据中心的发展或将改变电力保护的现状
雷卯参加全国静电标准化技术委员会成立大会暨第一次全体委员会议
Qorvo QPF7219 Wi-Fi集成前端在贸泽开售 集成edgeBoost功能以扩大Wi-Fi 6覆盖范围
Arm Cortex-R52+ 增强时间关键型汽车设计
无线类产品(蓝牙wifi等)做RF测试时需要的定频样机怎么做?定频样机怎么把频道定好?
谷歌再将AI部门独立,是谷歌的AI研究成果到了集中落地的时候了吗?
无线OSI协议的概念
洁牙仪防水透气膜是如何实现洗牙器的IPX7防水
32位Cortex-M0内核微控制器蓝牙智能遥控器方案
中国半导体设备发展的现状是怎么样的
国产替代兼容TPS54628DDAR 4.5V至18V,6A COT同步降压转换器
浅谈中国移动元宇宙演进路线