迪文科技论坛

 找回密码
 立即注册
搜索
查看: 6148|回复: 12

【开源】项目实战六:51单片机&迪文DGUS屏之单片机程序编写

[复制链接]

3

主题

2

回帖

52

积分

注册会员

Rank: 2

积分
52
发表于 2020-2-12 14:58:41 | 显示全部楼层 |阅读模式

大家好,我是微信公众号『芯知识学堂』的SingleYork,之前在『电子芯吧客』论坛有发表过51单片机与迪文DGUS屏通信的基本例程,在这里也给大家分享一下,欢迎喜欢我或者喜欢工控的小伙伴们持续关注哟……有问题可以直接站内私信或者向我提问,互相交流一下心得和经验……

相信接触过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屏连接起来,就能看到项目要实现的效果了。



温馨提示:



如果你在看本文有任何疑问,或者对工控、硬件设计、单片机比较感兴趣,欢迎站内私信或提问,本项目讲解完毕成后,将会在社区提供跟本项目相关的所有资料下载。


本项目所有源码下载链接:




链接:https://pan.baidu.com/s/1H5UkDHU-_ZKmHoTEwZNrGw


提取码:2fe0







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

17

主题

41

回帖

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2020-7-29 19:22:49 | 显示全部楼层
看完了,按着例程走了一遍,很好的例程,楼主有没有T5屏的DGUS II项目实战
回复

使用道具 举报

3

主题

2

回帖

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2020-7-30 16:26:11 | 显示全部楼层
Eve 发表于 2020-7-29 19:22
看完了,按着例程走了一遍,很好的例程,楼主有没有T5屏的DGUS II项目实战

有在用T5L,但是还没写教程
回复

使用道具 举报

17

主题

41

回帖

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2020-7-30 16:40:20 | 显示全部楼层
哦哦 T5L和T5是不是都用DGUS V7版本以上的呀
回复

使用道具 举报

0

主题

178

回帖

1101

积分

金牌会员

Rank: 6Rank: 6

积分
1101
发表于 2020-7-30 18:39:55 | 显示全部楼层
还是有区别的
T5是V7388
T5L是v7618
回复

使用道具 举报

0

主题

1

回帖

35

积分

新手上路

Rank: 1

积分
35
发表于 2020-8-18 18:20:27 | 显示全部楼层
必须大赞一下
回复

使用道具 举报

5

主题

15

回帖

187

积分

注册会员

Rank: 2

积分
187
发表于 2022-10-31 00:25:46 | 显示全部楼层
谢谢楼主分享这么好的教材
回复

使用道具 举报

2

主题

10

回帖

71

积分

注册会员

Rank: 2

积分
71
发表于 2023-6-3 17:40:15 | 显示全部楼层
很全很好的教程,赞
回复

使用道具 举报

0

主题

5

回帖

39

积分

新手上路

Rank: 1

积分
39
QQ
发表于 2023-8-29 11:50:58 | 显示全部楼层
作者有没有用MSP430的芯片写过
回复

使用道具 举报

3

主题

25

回帖

166

积分

注册会员

Rank: 2

积分
166
发表于 2023-10-20 12:00:26 | 显示全部楼层
下载后,杀毒软件提示有病毒!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-5-15 03:02 , Processed in 0.097209 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表