标题:
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