综合技术交流
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

如何使用单片机做一个简单的计数器

  有些人会问单片机控制一位数码管和控制多位数码管有什么不同呢?首先我们看一下电路上的不同,电路见下图,图中为4位共阴级数码管,4位数码管的A-B-C-D-E-F-G-Dp共用了单片机P2口。看到这里,我请大家思考一下,我们要如何实现数码管显示不同的数字呢?或许会有朋友问了,为什么要共用单片机P2呢?这是因为单片机的资源有限,不可能使用这么多的IO口来做数码管显示。如果不共用P2.0,单片机的IO口开销太大。实际应用中,不可能用如此多的IO来控制数码管。
   1.png
  作者在第一次看到这个图的时候,感觉一脸“懵逼”,心想这这么可能实现吗?明显同一时刻只能显示一个数码管,实际也确实是这样子的,同一时刻只能让一个数码管显示数字。那么我们到底如何实现多位数码管显示呢?这里要引入“刷新频率”这个概念了,比如现在的手机屏幕刷新频率可以做到120Hz,也就是说一秒钟手机屏幕刷新120次。一般来说当事物刷新频率超过50Hz的时候,我们人眼就感知不到事物的变化了。也就是说,在很短的时间内,只要我们让图中四位数码管显示不同的数字,便可以骗过人的眼睛,让人感觉数码管再显示不同的数字,这样我们就可以用这个电路来实现计数器了。
  核心代码如下:
  备注:按键每按下一次,计数变量SysDataVar.u16SegNumber增加1,增加后的数字实时显示在数码管上面。刷新频率计算:每5ms扫描一次,一共有4个数码管,所以F=1000ms/5ms/4=50Hz。
  if(ptiM_Delay(2,4))//定时2 每5ms执行一次
  {
  switch(SEGnumber)
  {
  case 0x00:
  {
  CloseALLSEG();
  LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber/1000];
  OpenOneSEG(0);
  }break;
  case 0x01:
  {
  CloseALLSEG();
  LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber%1000/100];
  OpenOneSEG(1);
  }break;
  case 0x02:
  {
  CloseALLSEG();
  LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%100/10];
  OpenOneSEG(2);
  }break;
  case 0x03:
  {
  CloseALLSEG();
  LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%10];
  OpenOneSEG(3);
  }break;
  }
  SEGnumber++;
  if(SEGnumber 》 3)
  {
  SEGnumber = 0x00;
  }
  }
  看一下效果图:
   2.png

回帖(1)

王栋春

2021-1-14 22:12:35
学习了解一下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分