采用单片机内部定时器0,在P2.0口产生一个周期为1ms(0.001s,1KHz),占空比为1/5(高电平持续200us)的方波,并同时使6位数码管轮流显示8,间隔约0.5秒。
高低电平的问题
- 占空比是 1/5 说明需要1个高电平和4个低电平,
需要一个循环计数器,[0~4],计数器是0的时候产生高电平,计数器不是0的时候产生低电平。 - 总周期是1ms,说明 高电平持续时间是 0.2ms,那么,定时器的最小时间间隔要以 0.2ms 为基准。
- 按照最简单的方案,精度最差的情况来实现:
- 定时器触发的时间间隔设置为 0.2ms
- 循环计数器从0开始,每次定时器触发时进行加1计数,如果计数器的值大于4时循环值为0,重新开始计数。
- 循环计数器的值是0时,输出高电平,非0时输出低电平
- 如果需要提升精度,就要缩短定时器触发的时间间隔,最好是按照整数倍缩短,
循环计数器也要按照倍数增加,维持高低电平的状态数也要按照倍数增加。
数码管轮显的问题
- 由于高低电平使用了定时器,并且定时器的触发间隔远小于轮显的时间间隔,那么,数码管的轮显间隔也可以利用同一个定时器。
- 计算两个时间间隔的周期倍数。题目缺少数码管数字的显示时长,那么,也按照间隔周期0.5秒来处理了。
高低电平问题设置为 0.2ms,数码管轮显是 0.5s = 500ms
数码管的间隔周期相当于高低电平定时器 0.2ms 的2500倍 - 设置一个循环计数器[0~5000],每次定时器触发时进行加1运算,直到计数器大于5000时重置为0,然后循环计数。
这个循环计数器与高低电平的循环计数器不是同一个,请声明新的变量进行保存。 - 设置一个表示数码管开关状态的指示器变量,如果所有数码管都关闭,值为0,如果有数码管被点亮,值为非0(可以为1)
- 当循环计数器的值小于2500时,数码管是开启状态,可以显示数字8;
当循环计数器的值大于等于2500时,数码管是关闭状态,不显示任何数字(是所有数码管都关闭)
循环计数器的值可以触发数码管状态指示器变量的变化,我们需要在状态指示器变量变化的时候进行第7步的操作。
每2500个周期中,只有一个周期可以触发状态指示器的变化。 - 再声明一个循环计数器[1~6],这是第三个循环计数器,请使用新的变量来保存计数器的值。
- 当数码管的状态指示器变量发生变化时,检查数码管的状态是由关到开,还是由开到关。
如果状态指示器是由开到关,将第三个循环指示器进行加1计数。 - 定时器的每个触发周期,都对数码管的状态指示器进行检查,
如果数码管是开启状态,则查看数码管的循环计数器(第三个计数器)的值,表示点亮第几个数码管,输出控制信号点亮对应的数码管即可
如果数码管状态指示器是关闭状态,则关闭所有数码管。 - 上述过程可以保证数码管是轮显的,亮灭间隔都是0.5秒
- 数码管的状态指示器和数码管的循环计数器可以合并为一个变量,也可以分开来表示不同的意义。
- 数码管好像存在需要编码和不需要编码的两种情况的吧,具体的我不清楚,
如果是需要编码的情况,输出信号应该是地址+编码;
如果是不需要编码的情况,输出信号应该是地址+数字8.