找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3296|回复: 12
打印 上一主题 下一主题
收起左侧

51单片机99秒倒计时求解惑

[复制链接]
跳转到指定楼层
楼主
ID:835382 发表于 2020-10-28 20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问一下下边这个程序的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();
  }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-10-29 06:10 | 只看该作者
这个程序只是演示99~00秒循环倒计时。十进制两位数取模(十位)保存在缓存数组mb[0],取余(个位)保存在缓存数组mb[1]。数码管动态显示程序轮流显示mb[ ]中的数据。
回复

使用道具 举报

板凳
ID:584814 发表于 2020-10-29 08:00 | 只看该作者
这个程序貌似演示100~00秒循环倒计时,可将j=100改成 j=99 。
回复

使用道具 举报

地板
ID:235055 发表于 2020-10-29 08:57 | 只看该作者
采用了定时器0查询溢出方式,定时器的初始值FC18,也就是定时(0xFFFF-0xFC18))*1us=1000us也就是1ms,计数变量i等于1000次后,累积时间达到1000*1ms=1s,那么秒计数j就减一,做倒计时,实现99-00秒倒计时
回复

使用道具 举报

5#
ID:278840 发表于 2020-10-29 10:17 | 只看该作者
mb是数组,时间是通过中断得出来的,中断1000次,1ms一次,1k就是1s
回复

使用道具 举报

6#
ID:836100 发表于 2020-10-29 11:05 | 只看该作者
mb[2]是一个有两个元素的一维数组,分别表示时钟的个位和十位。99是由上面的字码里的数字组成的。直接显示的
回复

使用道具 举报

7#
ID:451718 发表于 2020-10-29 12:41 | 只看该作者
典型定时器的应用问题。
查询方式的定时器应用,通过判断TF0是否溢出,来对全局变量 i 累加。从程序上来猜测,你这个定时器应该是1ms的定时(不给MCU运行频率,没有注释,这里只能是猜了)。当累积到1000时,也就是近似1秒钟的时间(至于为什么是近似,等你弄清楚定时器中断方式,就明白了),这时对全局变量 j 累减。
TF0这个寄存器的变化,是芯片内部自己执行的,因为程序已经执行了Timer0Init()。定时器就已经开始自动运行了。
回复

使用道具 举报

8#
ID:836153 发表于 2020-10-29 12:50 来自手机 | 只看该作者
99是时钟的各位和十位,换算成16进制直接在数码管上显示的
回复

使用道具 举报

9#
ID:835382 发表于 2020-10-29 19:09 | 只看该作者
感谢大佬们的解答
回复

使用道具 举报

10#
ID:835382 发表于 2020-10-29 19:11 | 只看该作者
man1234567 发表于 2020-10-29 08:00
这个程序貌似演示100~00秒循环倒计时,可将j=100改成 j=99 。

我也是这么想的   但是烧录到单片机上是从99开始
回复

使用道具 举报

11#
ID:675145 发表于 2020-10-30 16:26 | 只看该作者
mb就是数组,mb[0],mb[1]分别存放十位和个位,j==100定义的时候就初始化了
回复

使用道具 举报

12#
ID:834551 发表于 2020-12-22 08:22 | 只看该作者
也可以用LED来显示
回复

使用道具 举报

13#
ID:834551 发表于 2020-12-22 08:28 | 只看该作者
实现99秒累加,个位十位分别累加
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表