从你编写的程序看,你还未找到编程的感觉,或者说基本不理解单片机是如何工作的。
一般编程思维是这样的:把单片机当成一个人,比如说就是你自己,你将如何实现所要求的功能?
构思的过程如下:
第一步:分解任务
本任务要求实现, 让指示灯按如下规律闪烁:
要求一:开始时 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 再开始。
自己再尝试一下!
文章评论(0条评论)
登录后参与讨论