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

 我来答
匿名用户
2011-05-25
展开全部
  用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......绿竹别其三分景 红梅正报万家春 春回大地
百度网友97ef061
2011-05-25 · 超过31用户采纳过TA的回答
知道答主
回答量:167
采纳率:0%
帮助的人:69.4万
展开全部
怎么显示法?1~9吗?用T0还是T1或者两个都用?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式