标题: 51单片机99秒倒计时求解惑 [打印本页]

作者: 是否x    时间: 2020-10-28 20:31
标题: 51单片机99秒倒计时求解惑
问一下下边这个程序的mb是什么?99是怎么算出来的?谢谢

#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d,0x7d , 0x07 ,
                     0x7f  , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71};
u16 i=1000;
u8 j=100,mb[2];

void Timer0Init()
{
TMOD|=0x01;
TH0=0XFC;
TL0=0X18;
TR0=1;
}

void delay(u16 i)
{
while(i--);
}

void digdisplay()
{
u8 i;
for(i=0;i<2;i++)
{
  switch(i)
  {
   case 0:
         LSA=0;LSB=0;LSC=0;break;
   case 1:
         LSA=1;LSB=0;LSC=0;break;
  }
  P0=smgduan[mb[1-i]];
  delay(1);
  P0=0x00;
}
}

void main()
{
  Timer0Init();
  while(1)
  {
   if(TF0==1)
   {
           TF0=0;
        TH0=0XFC;
        TL0=0X18;
        i++;
   }
   if(i==1000)
   {
           i=0;
        j--;
        if(j==0)j=100;
   }
   mb[0]=j/10;
   mb[1]=j%10;
   digdisplay();
  }
}


作者: wulin    时间: 2020-10-29 06:10
这个程序只是演示99~00秒循环倒计时。十进制两位数取模(十位)保存在缓存数组mb[0],取余(个位)保存在缓存数组mb[1]。数码管动态显示程序轮流显示mb[ ]中的数据。
作者: man1234567    时间: 2020-10-29 08:00
这个程序貌似演示100~00秒循环倒计时,可将j=100改成 j=99 。
作者: sunny118    时间: 2020-10-29 08:57
采用了定时器0查询溢出方式,定时器的初始值FC18,也就是定时(0xFFFF-0xFC18))*1us=1000us也就是1ms,计数变量i等于1000次后,累积时间达到1000*1ms=1s,那么秒计数j就减一,做倒计时,实现99-00秒倒计时
作者: 器车人    时间: 2020-10-29 10:17
mb是数组,时间是通过中断得出来的,中断1000次,1ms一次,1k就是1s
作者: idrende    时间: 2020-10-29 11:05
mb[2]是一个有两个元素的一维数组,分别表示时钟的个位和十位。99是由上面的字码里的数字组成的。直接显示的
作者: robinsonlin    时间: 2020-10-29 12:41
典型定时器的应用问题。
查询方式的定时器应用,通过判断TF0是否溢出,来对全局变量 i 累加。从程序上来猜测,你这个定时器应该是1ms的定时(不给MCU运行频率,没有注释,这里只能是猜了)。当累积到1000时,也就是近似1秒钟的时间(至于为什么是近似,等你弄清楚定时器中断方式,就明白了),这时对全局变量 j 累减。
TF0这个寄存器的变化,是芯片内部自己执行的,因为程序已经执行了Timer0Init()。定时器就已经开始自动运行了。
作者: liuru281687    时间: 2020-10-29 12:50
99是时钟的各位和十位,换算成16进制直接在数码管上显示的
作者: 是否x    时间: 2020-10-29 19:09
感谢大佬们的解答
作者: 是否x    时间: 2020-10-29 19:11
man1234567 发表于 2020-10-29 08:00
这个程序貌似演示100~00秒循环倒计时,可将j=100改成 j=99 。

我也是这么想的   但是烧录到单片机上是从99开始
作者: 张小不懂    时间: 2020-10-30 16:26
mb就是数组,mb[0],mb[1]分别存放十位和个位,j==100定义的时候就初始化了
作者: 似水年华1231456    时间: 2020-12-22 08:22
也可以用LED来显示
作者: 似水年华1231456    时间: 2020-12-22 08:28
实现99秒累加,个位十位分别累加




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1