单片机代码怎么写,方波占空比这些?

采用单片机内部定时器0,在P2.0口产生一个周期为1ms(0.001s,1KHz),占空比为1/5(高电平持续200us)的方波,并同时使6位数码管轮流显示8,间隔约0.5秒。

高低电平的问题

  1. 占空比是 1/5 说明需要1个高电平和4个低电平,
    需要一个循环计数器,[0~4],计数器是0的时候产生高电平,计数器不是0的时候产生低电平。
  2. 总周期是1ms,说明 高电平持续时间是 0.2ms,那么,定时器的最小时间间隔要以 0.2ms 为基准。
  3. 按照最简单的方案,精度最差的情况来实现:
    • 定时器触发的时间间隔设置为 0.2ms
    • 循环计数器从0开始,每次定时器触发时进行加1计数,如果计数器的值大于4时循环值为0,重新开始计数。
    • 循环计数器的值是0时,输出高电平,非0时输出低电平
  4. 如果需要提升精度,就要缩短定时器触发的时间间隔,最好是按照整数倍缩短,
    循环计数器也要按照倍数增加,维持高低电平的状态数也要按照倍数增加。

数码管轮显的问题

  1. 由于高低电平使用了定时器,并且定时器的触发间隔远小于轮显的时间间隔,那么,数码管的轮显间隔也可以利用同一个定时器。
  2. 计算两个时间间隔的周期倍数。题目缺少数码管数字的显示时长,那么,也按照间隔周期0.5秒来处理了。
    高低电平问题设置为 0.2ms,数码管轮显是 0.5s = 500ms
    数码管的间隔周期相当于高低电平定时器 0.2ms 的2500倍
  3. 设置一个循环计数器[0~5000],每次定时器触发时进行加1运算,直到计数器大于5000时重置为0,然后循环计数。
    这个循环计数器与高低电平的循环计数器不是同一个,请声明新的变量进行保存。
  4. 设置一个表示数码管开关状态的指示器变量,如果所有数码管都关闭,值为0,如果有数码管被点亮,值为非0(可以为1)
  5. 当循环计数器的值小于2500时,数码管是开启状态,可以显示数字8;
    当循环计数器的值大于等于2500时,数码管是关闭状态,不显示任何数字(是所有数码管都关闭)
    循环计数器的值可以触发数码管状态指示器变量的变化,我们需要在状态指示器变量变化的时候进行第7步的操作。
    每2500个周期中,只有一个周期可以触发状态指示器的变化。
  6. 再声明一个循环计数器[1~6],这是第三个循环计数器,请使用新的变量来保存计数器的值。
  7. 当数码管的状态指示器变量发生变化时,检查数码管的状态是由关到开,还是由开到关。
    如果状态指示器是由开到关,将第三个循环指示器进行加1计数。
  8. 定时器的每个触发周期,都对数码管的状态指示器进行检查,
    如果数码管是开启状态,则查看数码管的循环计数器(第三个计数器)的值,表示点亮第几个数码管,输出控制信号点亮对应的数码管即可
    如果数码管状态指示器是关闭状态,则关闭所有数码管。
  9. 上述过程可以保证数码管是轮显的,亮灭间隔都是0.5秒

  • 数码管的状态指示器和数码管的循环计数器可以合并为一个变量,也可以分开来表示不同的意义。
  • 数码管好像存在需要编码和不需要编码的两种情况的吧,具体的我不清楚,
    如果是需要编码的情况,输出信号应该是地址+编码;
    如果是不需要编码的情况,输出信号应该是地址+数字8.