找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机秒表程序到了指定时间不会停下来

查看数: 2775 | 评论数: 4 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-6-11 21:01

正文摘要:

程序下载单片机上运行0~99.99s计时时,单片机在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此类推; 而在运60s倒计时功能时,到了00.00后不停止计时,qian位显示的字符为没有在段码数组中定义的字符, ...

回复

ID:778766 发表于 2020-6-14 10:34
wulin 发表于 2020-6-12 13:56
qian++;没有限制最大9。千位数大于9显示乱码。给你换一个思路写这个程序,你试试。

一位共阴极数码管显示0~9秒,9秒后自动回零;3个按钮开关控制,一个开关控制计时开始,一个开关控制暂停,一个开关控制回零
ID:213173 发表于 2020-6-12 13:56
qian++;没有限制最大9。千位数大于9显示乱码。给你换一个思路写这个程序,你试试。 无标题.jpg

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. //sbit P20=P2^0;          //四位数码管位选
  4. //sbit P21=P2^1;
  5. //sbit P22=P2^2;
  6. //sbit P23=P2^3;

  7. sbit s1=P2^4;           //开始/暂停
  8. sbit s2=P2^5;           //模式/复位
  9. //sbit s3=P2^6;                //记录
  10. //sbit s4=P2^7;                //读取
  11. sbit BUZZER=P3^6;        //蜂鸣器

  12. unsigned char code led[]={//共阳数码管段码"0~f-."
  13.                 0xc0,0xf9,0xa4,0xb0,
  14.                 0x99,0x92,0x82,0xf8,
  15.                 0x80,0x90,0x88,0x83,
  16.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  17. unsigned char shu[4];
  18. unsigned char sec=0;
  19. char num=0;
  20. bit flag=0;
  21. bit pause=0;

  22. void T0_init()        //定时器T0初始化              
  23. {
  24.         TMOD=0x21;
  25.         TH0=0xDC;       //10ms定时  
  26.         TL0=0x00;
  27.         TH1=0x38;       //200us定时 用于无源蜂鸣器驱动
  28.         TL1=0x38;
  29.         EA=1;
  30.         ET0=1;
  31.         ET1=1;
  32.         TR0=1;
  33. }

  34. void keyscan()                                        //按键扫描程序
  35. {
  36.         static bit sign=0;        //按键自锁标志
  37.         static unsigned char count=0;                //消抖计数变量                       
  38.         if(!s1||!s2)                                        //检测按键如果为0
  39.         {
  40.                 if(++count>=10 && sign==0)
  41.                 {                       
  42.                         sign=1;                        //按键自锁标志置1
  43.                         if(!s1) //开始/暂停
  44.                         {
  45.                                 if(pause==0&&flag==0)
  46.                                 {
  47.                                         if(num==99 && sec==99)
  48.                                         {
  49.                                                 sec=0;
  50.                                                 num=0;
  51.                                         }
  52.                                 }
  53.                                 if(pause==0&&flag==1)
  54.                                 {
  55.                                         if(num==0 && sec==0)
  56.                                         {
  57.                                                 sec=59;
  58.                                                 num=100;
  59.                                         }
  60.                                 }
  61.                                 pause=~pause;
  62.                         }
  63.                         if(!s2)//模式/复位键   99s正计时/60s倒计时
  64.                         {
  65.                                 pause=0;
  66.                                 flag=~flag;
  67.                                 if(flag)
  68.                                 {
  69.                                         sec=60;
  70.                                         num=00;
  71.                                 }
  72.                                 else
  73.                                 {
  74.                                         sec=0;
  75.                                         num= 0;
  76.                                 }
  77.                         }
  78.                         TR1=1;//开蜂鸣器
  79.                 }
  80.         }
  81.         else                                                        //按键抬起
  82.         {
  83.                 sign=0;                                //按键自锁标志清0
  84.                 count=0;                                        //消抖计数清0
  85.         }
  86. }

  87. void display( )
  88. {
  89.         static unsigned char i=0;
  90.         shu[0]=led[sec/10];
  91.         shu[1]=led[sec%10];
  92.         shu[2]=led[num/10%10];
  93.         shu[3]=led[num%10];
  94.         P0 =0xff;
  95.         P2&=0xf0;
  96.         if(i==1) P0=shu[i]&0x7f;//加小数点
  97.         else P0=shu[i];
  98.         P2|=(0x01<<i);
  99.         i++;
  100.         i%=4;
  101. }

  102. void main()
  103. {         
  104.         T0_init();
  105.         while(1)
  106.         {         
  107.                 keyscan();
  108.                 display();               
  109.         }
  110. }

  111. void T0int() interrupt 1 //定时器T0中断 方式1        
  112. {
  113.         TH0=0xDC;
  114.         TL0=0x00;
  115.         if(pause)
  116.         {
  117.                 if(!flag)//正计数99.99s
  118.                 {
  119.                         num++;
  120.                         if(num==99 && sec==99)
  121.                         {
  122.                                 pause=0;
  123.                                 TR1=1;
  124.                         }
  125.                         if(num>99)
  126.                         {
  127.                                 num=0;
  128.                                 sec++;
  129.                         }
  130.                 }
  131.                 else        //倒计时60.00s
  132.                 {
  133.                         num--;
  134.                         if(num==0&&sec==0)
  135.                         {
  136.                                 pause=0;
  137.                                 TR1=1;
  138.                         }
  139.                         if(num<0)
  140.                         {
  141.                                 num=99;
  142.                                 sec--;
  143.                         }
  144.                 }
  145.         }
  146. }

  147. void T1int() interrupt 3
  148. {
  149.         static unsigned int count=0;
  150.         BUZZER=~BUZZER;
  151.         count++;
  152.         if(count>=250)
  153.         {
  154.                 count=0;
  155.                 BUZZER=1;
  156.                 TR1=0;
  157.         }
  158. }
复制代码




ID:332444 发表于 2020-6-12 08:24
三极管用法若得祸
ID:436885 发表于 2020-6-12 01:22
第一显示刷新频率要改一下,第二 状态寄存超字节范围,

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

Powered by 单片机教程网

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