用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...

如题所述

  用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
  分内容转自:《51单片机C语言创新教程》温子祺等著。

  原理:
  软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮
  度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了人眼视觉暂留的特点。一般来说,每一个数码管点亮时间为1~2ms就可以了。如果某一个数码管点亮时间过长,则这个数码管的亮度过高,如果某一个数码管的点亮时间过短,则这个数码管的亮度过暗。因此我们必须设计一个定时器来定时点亮数码管,在该例子中,定时器的定时为5ms,即每个数码管点亮时间为5ms,扫描四个数码管的时间为20ms。

  源码:
  /*实验名称:数码管实验
  *描 述:在该章节的数码管实验当中,
  使用动态驱动数码管的方式来编写程序,
  程序的实现方式是数码管从0-9999循环显示
  *作 者:温子祺
  *修改日期:2010/5/4
  */
  #include "stc.h"

  #define HIGH 1
  #define LOW 0

  #define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
  #define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;}

  #define SEG_PORT P0

  unsigned char Timer0IRQEvent=0;
  unsigned char Time1SecEvent=0;
  unsigned int TimeCount=0;

  unsigned char SegCurPosition=0;

  code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
  //code unsigned char SegPosition[4]={0xfe,0xfd,0xfb,0xf7};
  code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};
  unsigned char SegBuf[4] ={0};

  void LS164Send(unsigned char byte)
  {
  unsigned char j;

  for(j=0;j=7;j++)
  {

  if(byte&(1(7-j)))
  {
  LS164_DATA(HIGH);
  }
  else
  {
  LS164_DATA(LOW);
  }

  LS164_CLK(LOW);
  LS164_CLK(HIGH);

  }

  }

  void RefreshDisplayBuf(void) //刷新显示缓存
  {

  SegBuf[0] =TimeCount%10;
  SegBuf[1] =TimeCount/10%10;
  SegBuf[2] =TimeCount/100%10;
  SegBuf[3] =TimeCount/1000%10;

  }
  void SegDisplay(void)
  {

  unsig......绿竹别其三分景 红梅正报万家春 春回大地
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-25
怎么显示法?1~9吗?用T0还是T1或者两个都用?