无论什么时候我们都要以实际应用的角度去考虑程序的编写
2. 无论什么时候都不要让 CPU 白白浪费等待尤其是延时(超过
1MS) 这样的地方
3. 设计相应驱动电路时候应该仔细阅读芯片的数据手册了解每
个引脚的驱动能力以及整个芯片的驱动能力
4. 最重要的是如何去释放 CPU( 如果是 led 每 500ms 闪烁一次那
么可以设置1ms 为基准定时器定时1ms 后进入相应操作使计数加1判
断达到 500 时进入 led(), 这些函数执行的时间是相当短的如果主程
序中还有其他函数则 CPU 会顺次往下执行对于其它函数(有的话)也
要采取相同的措施保证其不堵塞 CPU 若全部基于这种方法执行我们
的小系统依旧可以保证多个任务(多个函数)同时进行系统的实时性
得到了一定的保证
) 这是写出合格程序的基础
5. 数码管显示动态显示的亮度比静态显示要差一点所以在限流
电阻时应略小于静态显示电路中动态扫描显示刷新频率最好大于
50HZ 即每显示一轮的时间不超过 20ms 每个数码管显示的时间不能太
长也不能太短时间太长会影响刷新率导致总体显示呈现闪烁的现象
时间太短发光二级管的电流导通时间也就短会影响总体的显示亮度
一般控制在 1ms 左右最佳
6. 模块化编程初学单片机的时候(开始是C语言)是接触一些芯
片实现独立的功能如 DS1302DS18B20 等程序也不会很大所以所有的
程序都放在一个文件里面
随着学习的逐步深入程序也愈来愈大这给调试带来了一定的困
难后来了解了模块化编程这个概念运用之后大大地改善了程序的可
读性和可移植性
下面简单的介绍
C 语言源文件*.c 稍微比较大的设计都会涉及到众多模块我们
可以被各自独立的模块封装到不同的*.c 源文件中该文件中定义模块
函数申明部分一般不放入
C 语言头文件*.h 把各个模块的的申明文件(说模块的接口比较
合适)放在相应的*.h 头文件中相应的模块对应相应的.h头文件.形
如
ifndefDS1302H
defineDS1302H
/* 模块ds1302.c 文件中函数等的申明文件*/
endif
// 上面几个条件编译和宏定义是为了防止重复包含
这样我们就把各个模块的接口函数都引出到各自的头文件中然
后在主程序中调用这些模块的*.h 头文件即可
这点和 C++ 中的类很像
在数据类型定义的时候有时候用 typedef 会取得很好的效果
说到模块化编程以前曾看过不少大虾的例子他们的源文件和输
出下载文件是放在项目文件夹下地不同文件夹中如源文件放在 src
文件夹中输出*.hex 放在 output 文件夹中这样整个项目就更显得清
晰明了
7. 多任务程序这个概念在前面也有提到就是充分地利用 CPU 来
实现多任务的前后台操作相当于自己用程序构造一个基于前后台的
多任务操作系统换句话说就是通过定时器中断合理地分配 CPU 资源
来响应不同的任务
多个任务需要 CPU 关照的频度不一样我们选择最快的那个频度
来作为定时器的节拍(通常为最小公倍数这样方便定时器分配)然后
通过定时器分频即满足各个任务的响应节拍
比如任务 A频度为 50HZ 任务 B为 40HZ 这样我们就可以去定时
器中断节拍为 200HZ 每个任务设定一个节拍控制计数器 C当 C计数 4
次时任务切换到 A计数到 5次切换 B……