找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
程序下载单片机上运行0~99.99s计时时,单片机在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此类推;
而在运60s倒计时功能时,到了00.00后不停止计时,qian位显示的字符为没有在段码数组中定义的字符,请问怎么解决,仿真图和实物显示一样




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

sbit s1=P2^4;           //开始  
sbit s2=P2^5;         //复位
sbit s3=P2^6;                //记录
sbit s4=P2^7;                //读取

sbit feng=P3^6;        //控制蜂鸣器响不响   

unsigned char ge=0,shi=0,bai=0,qian=0,dao=0;      
unsigned char code led[ ]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共阳极段码   
unsigned char code led1[ ]={0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒计时ge、shi、bai位段码  
unsigned char code led2[ ]={0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒计时qian位段码   
void display();
void delay_ms(unsigned int ms)  // 延迟
{
   unsigned char a;
   while(ms--)
      for(a=125;a>0;a--);
}

void T0_init( )        //定时器T0初始化              
{
   TMOD=0x01;
           TH0=0xDC;       //10ms定时  
   TL0=0x00;
   EA=1;
   ET0=1;

}

void main()
{  

        feng=0;           
   T0_init( );

   while(1){         
      display( );
                 

      while(!s1)//0~99.99s计时
      {   

      feng=~feng;
                        ge=0,shi=0,bai=0,qian=0;
         display( );                                               
         if(s1)
                        {                dao=0;
                                 feng=~feng;
                 TR0=1;
                        }
      }
                while(!s2)                //        暂停
                {
                                feng=~feng;
                                TR0=0;
                }
                while(!s3)                        //60s倒计时       
                {       
                        feng=~feng;
                        ge=0,shi=0,bai=0,qian=0;
                         display( );
                        if(s3)
                        {
                        dao=1;
                        TR0=1;
                       

                }}

      while(!s4)         //清零键               
      {
                        feng=~feng;
         display( );
         if(s4)
                       
         TR0=0;
                        dao=0;
         qian=0;
         bai=0;
         shi=0;
         ge=0;
      }
if((dao==0&&qian==9&&bai==9&&ge==9&&shi==9)||(dao==1&&qian==5&&bai==9&&ge==9&&shi==9))                //计时结束后归零
{
                        feng=~feng;
                        dao=0;
         TR0=0;
         qian=0;
         bai=0;
         shi=0;
         ge=0;

}

      }
}


void display( )
{
        if(dao==0)                        //        0~99.99s计时
        {
   P23=0;        //位选
   P0=led[ge];        //
   delay_ms(5); //消隐

   P23=1;        //位选
   P22=0;
   P0=led[shi];
   delay_ms(5); //消隐

   P22=1;        //位选
   P21=0;
   P0=led[bai]&0x7f;//   与操作,使数码管最高位置一,点亮dp位        
   delay_ms(5); //消隐

   P21=1;        //位选
   P20=0;
   P0=led[qian];
   delay_ms(5); //消隐
   P20=1;}
        if(dao==1)                                                                        //60s倒计时
        {
        P23=0;        //位选
   P0=led1[ge];        //
   delay_ms(5); //消隐

   P23=1;        //位选
   P22=0;
   P0=led1[shi];
   delay_ms(5); //消隐

   P22=1;        //位选
   P21=0;
   P0=led1[bai]&0x7f;//   与操作,使数码管最高位置一,点亮dp位        
   delay_ms(5); //消隐

   P21=1;        //位选
   P20=0;
   P0=led2[qian];
   delay_ms(5); //消隐
   P20=1;
       
        }

       
}


void T0int( ) interrupt 1 //定时器T0中断 方式1        
{
   TH0=0xDC;       //重新给a,10ms定时  65536-55536(a)  
   TL0=0x00;
   ge++;
   if(ge==10){
      ge=0;
      shi++;
      }
   if(shi==10){
      shi=0;
      bai++;
      }
    if(bai==10){        //满十进位   
         bai=0;
         qian++;
         }
}

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

使用道具 举报

沙发
ID:436885 发表于 2020-6-12 01:22 | 只看该作者
第一显示刷新频率要改一下,第二 状态寄存超字节范围,
回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-12 08:24 | 只看该作者
三极管用法若得祸
回复

使用道具 举报

地板
ID:213173 发表于 2020-6-12 13:56 | 只看该作者
qian++;没有限制最大9。千位数大于9显示乱码。给你换一个思路写这个程序,你试试。

  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. }
复制代码




回复

使用道具 举报

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

一位共阴极数码管显示0~9秒,9秒后自动回零;3个按钮开关控制,一个开关控制计时开始,一个开关控制暂停,一个开关控制回零
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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