我是靠谱客的博主 风中小海豚,这篇文章主要介绍单片机高级裸机编程(一)-- 数据驱动程序,现在分享给大家,希望可以做个参考。

我理解的所谓数据驱动程序的方法,简单而言:将数据与程序分析,将代码逻辑的组织转换成数字规律的统计。即将数据作为一个要处理的脚本(当做数据库),然后程序作为解释器,将脚本的内容用代码逻辑解释出来,实现编程功能。

这就要求我们将代码逻辑分解出其内在数据关系,这样我们就可以写出与数据无关的函数,这样的函数通用性很大,利于复用,耦合性也比较低,利于修改,且修改后不易出错。

这样的方法也有坏处,就是可读性变差,解决的办法就是多写点关于逻辑的注释。

下面举个例子:(来自书籍--单片机编程魔法师之高级裸编程思想,挺好的一本书,可以看看,可以去下载下载链接处,待有缘人! )

(1)要实现如下波形:

(2)我们 一般的实现方法:将上面分成16段(依据是波形存在不一样的时候作为分界点),每段单独分析。代码如下(使用51单片机实现)。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <reg51.h> sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; void delay(unsigned char d, unsigned int t) { unsigned int i; P1 = P1 & 0xF0 | d; for(i=0; i<t; i++); } main(void) { while(1) { delay(0x00, 749); // 阶段1 delay(0x01, 251); // 阶段2 delay(0x00, 749); // 阶段3 delay(0x03, 251); // 阶段4 delay(0x00, 749); // 阶段5 delay(0x01, 251); // 阶段6 delay(0x00, 749); // 阶段7 delay(0x07, 251); // 阶段8 delay(0x00, 749); // 阶段9 delay(0x01, 251); // 阶段10 delay(0x00, 749); // 論僇11 delay(0x03, 251); // 論僇12 delay(0x00, 749); // 阶段13 delay(0x01, 251); // 阶段14 delay(0x00, 749); // 阶段15 delay(0x0F, 251); // 阶段16 } }

(3)而采用数据驱动程序的方法:将每个阶段分离出数据,然后用一个函数统一处理。本例中使用数组来存储代表各个阶段的逻辑的数据,接着用一段代码就可解决,来代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <reg51.h> sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; #define STAGES 16 unsigned char code P1_1234[] = {0, 1, 0, 3, 0, 1, 0, 7, 0, 1, 0, 3, 0, 1, 0, 15}; unsigned int code Dts[] = {749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251}; void delay(unsigned char d, unsigned int t) { unsigned int i; P1 = P1 & 0xF0 | d; for(i=0; i<t; i++); } main(void) { int i; while(1) { for(i=0; i<STAGES; i++) delay(P1_1234[i], Dts[i]); } }

(4)好处:似乎没有看出了,牺牲了易读性,有得必有失,我们会的得到什么?

再举几个例子:实现以下波形。对于这个波形,如果我们不采用数据驱动程序的方法,那么相当于重写(重新分阶段,不难但是繁琐),而使用这种高阶的方法后,解释器代码一个字母都不用改变。

数据驱动程序的代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <reg51.h> sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; #define STAGES 8 unsigned char code P1_1234[] = {0, 1, 3, 7, 15, 7, 3, 1}; void delay(unsigned char d, unsigned int t) { unsigned int i; P1 = P1 & 0xF0 | d; for(i=0; i<t; i++); } main(void) { int i; while(1) { for(i=0; i<STAGES; i++) delay(P1_1234[i], 500); } }

(5)总结:

虽然数据驱动代码这种高阶的方法不是万能,但是对于相似的编程要求,则给我们提供了一种可复用的方法,避免一些简单却繁琐的工作任务。

还有, 用这种方法记得写注释,不然不仅别人看不懂, 就连几天后的你再次回顾时,都不知道是怎么写出来的。

最后

以上就是风中小海豚最近收集整理的关于单片机高级裸机编程(一)-- 数据驱动程序的全部内容,更多相关单片机高级裸机编程(一)--内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部