1. 不管什么时分咱们都要以实践使用的视点去考虑程序的编写。
2. 不管什么时分都不要让CPU白白浪费等候,尤其是延时(超越1MS)这样的当地。
3.规划相应驱动电路时分,应该仔细阅读芯片的数据手册,了解每个引脚的驱动才能,以及整个芯片的驱动才能。
4.最重要的是,怎么去开释CPU(假如是led每500ms闪耀一次,那么能够设置1ms为基准,守时器守时1ms后,进入相应操作使计数加1,判别到达500时,进入led(),这些函数履行的时刻是适当短的,假如主程序中还有其他函数,则CPU会依次往下履行,关于其它函数(有的话)也要采纳相同的办法,确保其不阻塞CPU,若悉数根据这种办法履行,咱们的小体系仍旧能够确保多个使命(多个函数)一起进行,体系的实时性得到了必定的确保。),这是写出合格程序的根底。
5.数码管显现,动态显现的亮度比静态显现要差一点,所以在限流电阻时应略小于静态显现电路中,动态扫描显现改写频率最好大于50HZ,即每显现一轮的时刻不超越20ms,每个数码管显现的时刻不能太长也不能太短,时刻太长会影响改写率,导致整体显现出现闪耀的现象,时刻太短发光二级管的电流导通时刻也就短,会影响整体的显现亮度,一般操控在1ms左右最佳。
6.模块化编程,初学单片机的时分(开端是C言语),是触摸一些芯片完结独立的功用,如DS1302,DS18B20等,程序也不会很大,所以一切的程序都放在一个文件里边。跟着学习的逐渐深化,程序也愈来愈大,这给调试带来了必定的困难,后来了解了模块化编程这个概念,运用之后大大地改进了程序的可读性和可移植性。下面简略的介绍
C言语源文件*.c 略微比较大的规划都会涉及到很多模块,咱们能够被各自独立的模块封装到不同的*.c源文件中,该文件中界说模块函数,声明部分一般不放入
C言语头文件*.h 把各个模块的的声明文件(说模块的接口比较适宜),放在相应的*.h头文件中,相应的模块对应相应的.h头文件.形如
#ifndef __DS1302_H__
#define __DS1302_H__
/*模块ds1302.c文件中函数等的声明文件*/
#endif
//上面几个条件编译和宏界说是为了避免重复包括
这样咱们就把各个模块的接口函数都引出到各自的头文件中,然后在主程序中调用这些模块的*.h头文件即可。这点和C++中的类很像。
在数据类型界说的时分,有时分用typedef会获得很好的作用。
说到模块化编程,曾经曾看过不少大虾的比方,他们的源文件和输出下载文件是放在项目文件夹下地不同文件夹中,如源文件放在src文件夹中,输出*.hex放在output文件夹中,这样整个项目就更显得明晰明晰。
7.多使命程序,这个概念在前面也有说到,便是充分地使用CPU来完结多使命的前后台操作,适当于自己用程序结构一个根据前后台的多使命操作体系,换句话说便是经过守时器中止合理地分配CPU资源来呼应不同的使命。多个使命需求CPU照顾的频度不一样,咱们挑选最快的那个频度来作为守时器的节拍(一般为最小公倍数,这样便利守时器分配),然后经过守时器分频,即满意各个使命的呼应节拍。比方使命A频度为50HZ,使命B为40HZ,这样咱们就能够去守时器中止节拍为200HZ,每个使命设定一个节拍操控计数器C,当C计数4次时,使命切换到A,计数到5次切换B……
一起咱们也很清楚的知道,有些使命需求很长的时刻,如DS18B20温度传感器完结一次温度转化需求很长的时刻(相关于单片机的us级来说),这样咱们就能够将器材驱动使命在区分为:初始段,发动段,获取成果段,等子使命段,可别离设定标志位(switch+case句子),在需求等候较长时刻的当地,答应CPU去履行其他使命,别的可在主程序使命轮训中增加break来完结使命的优先级区分。