找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机秒表停止功能不能使用是那一段程序错了吗?

[复制链接]
跳转到指定楼层
楼主
ID:827883 发表于 2020-11-9 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************/
/*项目名称:数字式秒表的设计程序*/
/*设计者:*/
/*设计日期:2020年11月8日*/
/*设计功能说明:系统默认提示符为“p.”;
实现功能:按下S2键启动秒表;按下S3键暂停秒表;按下S4键秒表继续工作;按下S5键秒表清零,按下S6键停止秒表。
/*****************************/
/* crystal=12Mhz */
/* P2口位控口,P0口段控口 */
#include<reg51.h>                                                                                                                                            
#include"math.h"
#define uchar unsigned char
#define uint unsigned int  
unsigned char code duanma[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF}; //共阴数码管
uchar wk[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};         
uchar dm1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
uchar dm2[1]={0xbf}; /*显示横线*/
sbit P1_0=P1^0;          /*开始*/
sbit P1_1=P1^1;          /*暂停*/
sbit P1_2=P1^2;          /*继续*/
sbit P1_3=P1^4;          /*清零*/        
sbit P1_4=P1^3;          /*停止*/
uchar i,j,k,l,n,m,o,p;


/*延时函数*/
void ys()                           
{  
IE=0X00;
TMOD=0X01;
TH0=(65536-1000)/256;                     
TL0=(65536-1000)%256;
TR0=1;
do{}while(!TF0);
TF0=0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; }



/*  清零操作函数  */        

void q0()                                 

{  k=0;  n=0;  m=0; l=0;  o=0;  p=0;  }

/*  显示程序函数  */

void display()                                       
{ j=0;
P2=wk[j];  P0=dm1[m];   ys();  j++;
P2=wk[j];  P0=dm1[n];   ys();  j++;
P2=wk[j];  P0=dm2[0];   ys();  j++;
P2=wk[j];  P0=dm1[k];   ys();  j++;
P2=wk[j];  P0=dm1[l];   ys();  j++;
P2=wk[j];  P0=dm2[0];   ys();  j++;
P2=wk[j];  P0=dm1[o];   ys();  j++;
P2=wk[j];  P0=dm1[p];   ys();  j++;
}

/*主函数*/

void main()

{

   for(;;)                                                      
{ if(P1_0==0)                                /*  是否开始工作  */
  {   for(p=0;p<6;p++)                    /* 判断延时10min是否达到  */        
   {
      for(o=0;o<10;o++)                            /* 判断主延时1min是否达到  */        
    {
       for(l=0;l<6;l++)                         /* 判断延时10s是否达到  */        
     {                                                            
         for(k=0;k<10;k++)                        /* 判断延时1s是否达到  */        
      {
          for(n=0;n<10;n++)                           /* 判断延时100ms是否达到  */        


         {  if(P1_3==0)  {  break;  }    /*  停止功能是否执行  */                 
              else
           {
              for(m=0;m<10;m++)               /* 判断延时10ms是否达到  */        
             {
                 if(P1_1==0)                   /*  暂停功能是否执行  */               
               {
                   while(P1_2==1)                /*  连续功能是否执行  */               
                 {   
                   if(P1_4==0) {  q0();  }         /*  清零功能是否执行  */               

                   else  {   display( );          } /*  暂停时显示  */        

                   }
                 }        
                     else  
                                 {    display();   }                   /*  正常工作时显示  */        
               }
              }
             }
            }                           
          }
        }        
      }  
    }                                                                  
   else
{  P2=0XF7;P0=0X0C;  }                 /*  系统提示符"P."  */        
}
  }

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

使用道具 举报

沙发
ID:88256 发表于 2020-11-9 23:38 | 只看该作者
sbit P1_3=P1^4;          /*清零*/        
sbit P1_4=P1^3;          /*停止*/

{  if(P1_3==0)  {  break;  }    /*  停止功能是否执行  */   

你这是什么意思?
回复

使用道具 举报

板凳
ID:827883 发表于 2020-11-10 00:20 | 只看该作者
hhdsdy 发表于 2020-11-9 23:38
sbit P1_3=P1^4;          /*清零*/        
sbit P1_4=P1^3;          /*停止*/

改了之后还是不能用
回复

使用道具 举报

地板
ID:213173 发表于 2020-11-10 07:40 | 只看该作者
楼主主函数结构错误,给你改用定时器中断计时,你试试。
  1. //999.9秒表
  2. #include<reg51.h>                                                                                                                                            
  3. //#include"math.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int  
  6. sbit S1=P1^0;          /*开始/停止/清零*/
  7. sbit S2=P1^1;          /*暂停/继续*/
  8. uchar code duanma[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF}; //共阴数码管
  9. uchar code wk[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};         
  10. uchar Cnt100ms=0,Cnt1s=0;
  11. uint  Cnt250us=0;
  12. bit   make=0;//使能

  13. /*  延时函数  */
  14. void delay(uint x)
  15. {
  16.         uint i,j;
  17.         for(i=x;i>0;i--)
  18.                 for(j=120;j>0;j--);
  19. }

  20. /*  初始化定时器函数  */
  21. void Timer0Init()        //250微秒@12.000MHz
  22. {
  23.         TMOD= 0x02;                //设置定时器模式
  24.         TL0 = 0x06;                //设置定时初值
  25.         TH0 = 0x06;                //设置定时重载值
  26.         TR0 = 1;                //定时器0开始计时
  27.         EA  = 1;
  28.         ET0 = 1;
  29. }
  30. /*  按键扫描函数  */
  31. void key_scan()                               
  32. {
  33.         static uchar count=0,num=0; //计数变量
  34.         static bit key_sign=0;                //按键状态标志
  35.         if(!S1||!S2)
  36.         {
  37.                 if(++count>=10 && key_sign==0)//消抖
  38.                 {       
  39.                         key_sign=1;
  40.                         if(!S1)
  41.                         {
  42.                                 num++;
  43.                                 num%=3;
  44.                                 switch(num)/*开始/停止/清零*/
  45.                                 {
  46.                                         case 0: make=0;Cnt250us=0;Cnt100ms=0;Cnt1s=0;break;//清零
  47.                                         case 1: make=1;break;//开始
  48.                                         case 2: make=0;break;//停止
  49.                                 }
  50.                         }
  51.                         if(!S2)        make=~make;
  52.                 }
  53.         }
  54.         else
  55.         {
  56.                 count=0;                                //计数变量清0
  57.                 key_sign=0;                        //按键状态标志清0
  58.         }

  59. }
  60. /*  数码管显示函数  */
  61. void display()                                       
  62. {
  63.         static i=0;
  64.         P0=0xff;
  65.         P2=wk[i];
  66.         switch(i)
  67.         {
  68.                 case 0: P0=duanma[Cnt1s/100%10];break;
  69.                 case 1: P0=duanma[Cnt1s/10%10];break;
  70.                 case 2: P0=duanma[Cnt1s%10]&0x7f;break;
  71.                 case 3: P0=duanma[Cnt100ms%10];break;
  72.         }
  73.         i++;
  74.         i%=4;
  75. }

  76. /*主函数*/

  77. void main()
  78. {
  79.         Timer0Init();
  80.         while(1)
  81.         {
  82.                 key_scan();       
  83.                 display();
  84.                 delay(1);
  85.         }
  86. }
  87. /**************中断服务程序*****************/
  88. void timer0() interrupt        1//250微秒@12MHz
  89. {
  90.         if(make==1)                        //暂停/启动
  91.         {
  92.                 Cnt250us++;                                        //中断变量Cnt250us自+1
  93.                 if(Cnt250us>=400)                                //100ms
  94.                 {
  95.                         Cnt250us=0;                                //清0
  96.                         Cnt100ms++;                        //100毫秒计数
  97.                         if(Cnt100ms>=10)
  98.                         {
  99.                                 Cnt100ms=0;
  100.                                 Cnt1s++;                                //秒计数
  101.                                 if(Cnt1s>999)
  102.                                         Cnt1s=0;
  103.                         }
  104.                 }
  105.         }
  106. }
复制代码

回复

使用道具 举报

5#
ID:414556 发表于 2020-11-10 09:31 | 只看该作者
while(P1_2==1)  
在功能里面设条件就会不能实现功能
回复

使用道具 举报

6#
ID:158375 发表于 2020-11-10 10:27 | 只看该作者
按键检查无消抖处理,建议改程序结构。
回复

使用道具 举报

7#
ID:827883 发表于 2020-11-10 12:29 | 只看该作者
wulin 发表于 2020-11-10 07:40
楼主主函数结构错误,给你改用定时器中断计时,你试试。

要改成5个按键,还要显示p。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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