原创 关于“指示灯点亮”程序的构思

2009-4-2 15:21 2190 6 6 分类: MCU/ 嵌入式

     从你编写的程序看,你还未找到编程的感觉,或者说基本不理解单片机是如何工作的。


     一般编程思维是这样的:把单片机当成一个人,比如说就是你自己,你将如何实现所要求的功能?


      构思的过程如下:


      第一步:分解任务


     本任务要求实现, 让指示灯按如下规律闪烁:


       要求一:开始时 0.5次/秒,逐渐变快,直至 5次/秒,然后再恢复到 0.5次。


       要求二:每个闪烁的频率维持 3秒。


       要求三:从 0.5 次/秒 到 5 次/秒分为 10 档,即每次变化 0.5次。


       (以上分解过程一定要做,将表述的任务尽量拆分成单个的内容,逐一列出,因为这样就意味着每个分解项都会涉及一个变量和相应的处理! )


        第二步:用自己的理解来使任务形象化:


        本任务实际上就是:


         1、以 0.5次/秒闪烁 3 秒


         2、以 1 次/秒闪烁 3 秒


         3、以 1.5次/秒闪烁 3 秒


         4、以  2 次/秒闪烁 3 秒


         ……


         依此类推,直到 5次/秒闪烁 3 秒。


          然后回头:


          1、以 4.5次/秒闪烁 3 秒


          2、以  4 次/秒闪烁 3 秒


          3、以 3.5次/秒闪烁 3 秒


          ……


          依此类推,直到 0.5次/秒。


          这就是实现的内容,中间有一个含糊的地方,就是 5 次/秒处是停留 3 秒还是 6秒?这个留给你自己思索。


          但是从编程角度看,停留 6 秒比较简单,因为这样上升、下降过程就完全一样了,不用特殊处理。


          (不要小看这个步骤,它能帮你理解如何实现,因为单片机相对智商比较低,需要比较“死板”的步骤才能执行!)


         第三步:描述实现方法


          根据上述描述,可以这样实现:


          分为 20个状态,对应上升、下降过程;


          每个状态对应一个显示速率,一个显示时间,或者用次数,因为可以将显示时间换算为闪烁的次数,如:  0.5次/秒显示3 秒 ——〉显示 1.5次,5次/秒显示3秒 ——〉显示 15次, 为了便于处理,可以亮、暗都计数,则变为 3次 —〉30次。


 


          第四步:根据实现方法确定变量


           1、需要有状态计数,指示当前所处的状态 ——  cur_stat


           2、需要有显示速度控制,即亮暗时间,因为亮、暗时间相等,所以只需要一个变量 —— disptime


           3、指明当前是量还是暗的标志,以方便控制一次显示结束 —— cur_disp,此变量是逻辑值,所以可以用位变量。


           4、控制每一个显示频率(即状态)的维持时间,为了简化,用次数代替时间(如果用时间还要产生一个 1秒的计时器)—— disp_cnt。


           5、根据上述实现方法构建一个数据结构,便于程序循环处理,因为单片机的程序就是一个循环,而所做事也是一个循环。


            而好的数据结构往往可以使程序处理大大简化,此处为了实现上述任务,建议构建一个 20  项的 2维常数数组,每项对应一个状态,而每项中的 2 维分别对应次此状态的显示速度和次数,用来控制程序中各个状态的显示,如下:


             a_dispCtrl [20][2] ={1000,3,


                                             500,6,


                                              333,9,


                                              250,12


                                              ……


                                                       }


           以上数据前一项为显示时间的ms 数,后一项为次数,亮、暗都计数。


           基于这个数组我想应该可以编写出来了:


           基本逻辑是:


           先对显示时间减计数,到零后控制显示,显示计数;


           显示计数到零后,状态计数,根据状态获取数组中新的显示时间和次数的初始化值。


           状态计数到 20 后结束,或者从 0 再开始。


           自己再尝试一下!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条