单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 169|回复: 6
收起左侧

单片机秒表程序,怎么在不改动的情况下加个按键控制秒表的暂停和计时?

[复制链接]
luoyua 发表于 2019-1-11 21:38 | 显示全部楼层 |阅读模式
这是个秒表   怎么在不改动的情况下加个按键控制秒表的暂停和计时?

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define ab P0
  4. uchar int_time;
  5. uchar a,b;
  6. sbit LSA = P2^2;
  7. sbit LSB = P2^3;
  8. sbit LSC = P2^4;
  9. unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x79,0x71};
  10. uchar displaydata[8];
  11. void digdisplay();

  12. void clock(a,b)
  13. {
  14.         displaydata[0] = table[b/10];
  15.         displaydata[1] = table[b%10];
  16.         displaydata[2] = 0x40;
  17.         displaydata[3] = table[a/10];
  18.         displaydata[4] = table[a%10];
  19.         digdisplay();
  20. }
  21. /***********************************
  22. *   Ö÷oˉêy  
  23. ***********************************/
  24. void main()
  25. {
  26.         TMOD = 0X01;
  27.         TH0 = (65536-46083)/256;
  28.         TL0 = (65536-46083)/256;
  29.         EA = 1;
  30.         ET0 = 1;
  31.         TR0 = 1;
  32.         int_time = 0;
  33.         a =0;b = 0;
  34.         while(1)
  35.         {
  36.                    clock(a,b);                        
  37.         }
  38. }

  39. void digdisplay()
  40. {
  41.         uchar i,j;
  42.         for(i=0;i<5;i++)
  43.         {
  44.                 switch(i)
  45.                 {
  46.                         case 0:
  47.                         LSA = 0;LSB = 0;LSC = 0;break;
  48.                         case 1:
  49.                         LSA = 1;LSB = 0;LSC = 0;break;
  50.                         case 2:
  51.                         LSA = 0;LSB = 1;LSC = 0;break;
  52.                         case 3:
  53.                         LSA = 1;LSB = 1;LSC = 0;break;
  54.                         case 4:
  55.                         LSA = 0;LSB = 0;LSC = 1;break;
  56.                 }
  57.                 ab = displaydata[i];
  58.     j = 50;
  59.                 while(j--);
  60.                 ab = 0x00;
  61.         }
  62. }


  63. void TO_time() interrupt 1
  64. {
  65.         TH0 = (65536-50000)/256;
  66.         TL0 = (65536-50000)%256;
  67.         int_time++;
  68.         if(int_time == 2)
  69.         {
  70.                 int_time = 0;
  71.                 a++;
  72. }
  73. if(a == 10)
  74. {
  75.         b++;
  76.         a=0;
  77. }
  78. if(b == 60)
  79. {
  80.         b = 0;
  81. }                                          
  82. }
复制代码


回复

使用道具 举报

时光盗初心 发表于 2019-1-12 02:34 | 显示全部楼层
可以考虑掉电模式
回复

使用道具 举报

wulin 发表于 2019-1-12 10:55 | 显示全部楼层
不改动怎么加按键功能?给你改成单键60分钟百分秒表。1ms数码管动态显示。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ab P0
//uchar int_time;
uchar b,c;
uint a;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit key1 = P3^0;

unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x79,0x71};
uchar displaydata[8];
bit d;
void digdisplay();
void keyscan();
       
void clock(a,b)
{
        displaydata[0] = table[c/10];
        displaydata[1] = table[c%10];
        displaydata[3] = table[b/10];
        displaydata[4] = table[b%10];
        displaydata[6] = table[a/100%10];
        displaydata[7] = table[a/10%10];

}
/***********************************
*   ?÷oˉêy  
***********************************/
void main()
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x66;                //设置定时初值1ms
        TH0 = 0xFC;                //设置定时初值
        EA = 1;
        ET0 = 1;
        TR0 = 1;
   displaydata[2] = 0x40;
   displaydata[5] = 0x40;
        a =0;b = 0;
        while(1)
        {
                keyscan();
                clock(a,b);                        
        }
}

void digdisplay()
{
        static uchar i=0;
        ab = 0x00;
        switch(i)
        {
           case 0:
           LSA = 0;LSB = 0;LSC = 0;ab = displaydata[i];i++;break;
           case 1:
           LSA = 1;LSB = 0;LSC = 0;ab = displaydata[i];i++;break;
           case 2:
           LSA = 0;LSB = 1;LSC = 0;ab = displaydata[i];i++;break;
           case 3:
           LSA = 1;LSB = 1;LSC = 0;ab = displaydata[i];i++;break;
           case 4:
           LSA = 0;LSB = 0;LSC = 1;ab = displaydata[i];i++;break;
           case 5:
           LSA = 1;LSB = 0;LSC = 1;ab = displaydata[i];i++;break;
           case 6:
           LSA = 0;LSB = 1;LSC = 1;ab = displaydata[i];i++;break;
           case 7:
           LSA = 1;LSB = 1;LSC = 1;ab = displaydata[i];i=0;break;
        }
}
void keyscan()       
{
        static uchar count1=0,count2=0;        //计数变量                       
        static bit key_sign=0;                                        //按键状态标志
        if(key1==0)                                //检测输入如果为0
        {
                if((++count1>=100)&&(key_sign==0))
                {                       
                        key_sign=1;                //按键自锁标志置1,防止重复响应
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        a=0;
                                                        b=0;
                                                        c=0;        break;//清0
                                case 1:        d=1;  break;//计时
                                case 2:        d=0;        break;//暂停
                        }               
                }
        }
        else
        {
                count1=0;                                //计数变量清0
                key_sign=0;                                //按键状态标志清0
        }
}

void TO_time() interrupt 1
{
        TL0 = 0x66;                //设置定时初值1ms
        TH0 = 0xFC;                //设置定时初值
        if(d)
        {
                a++;
                if(a == 1000)
                {
                        b++;
                        a=0;
                }
                if(b == 60)
                {
                        b = 0;
                        c++;
                }                                          
                if(c == 60)
                        c = 0;
        }
   digdisplay();
}
回复

使用道具 举报

ssz666 发表于 2019-1-12 11:52 | 显示全部楼层
//秒表
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char DisplayData[4];
unsigned char MMMM=0,MM=0,TTTT=0,TT=0,i=0;
bit A=0;//bit只有0和1两种值

sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit LSD=P1^3;

u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void waibuzhongduan()
{
        EA=1;
        EX0=1;        
        IT0=1;
        EX1=1;        
        IT1=1;
}

void dingshiqizhongduan()
{
        TMOD=0X01;
        TH0=0xD8;
        TL0=0xF0;
        EA=1;
        TR0=0;
        ET0=1;
        PT0=1;//为1时,定时器0中断为高级优先级,为0时,为低级优先级。

}

void delay10ms(unsigned int c)
{
        unsigned char a,b;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
void Display()
{
        unsigned char i,j;
        for(i=0;i<4;i++)
        {
                switch(i)
                {
                        case (0):LSA=0;LSB=1;LSC=1;LSD=1;break;
                        case (1):LSA=1;LSB=0;LSC=1;LSD=1;break;
                        case (2):LSA=1;LSB=1;LSC=0;LSD=1;break;
                        case (3):LSA=1;LSB=1;LSC=1;LSD=0;break;
                }
                P2=DisplayData[i];
        j=10;
        while(j--);
        P2=0XFF;        
        }
}
void XS()
{
        if(A==0)
        {
                DisplayData[0]=smgduan[TT/10];
                DisplayData[1]=smgduan[TT%10]+0x80;
                DisplayData[2]=smgduan[MM/10];
                DisplayData[3]=smgduan[MM%10];
        }
        else
        {
                DisplayData[0]=smgduan[TTTT/10];
                DisplayData[1]=smgduan[TTTT%10]+0x80;
                DisplayData[2]=smgduan[MMMM/10];
                DisplayData[3]=smgduan[MMMM%10];        
        }
}

void main()
{
        waibuzhongduan();
        dingshiqizhongduan();
        while(1)
        {
                XS();
                Display();
        }
}
void Int0() interrupt 0
{
        
                delay10ms(100);
                A=0;
                switch(i)
                {
                        case 0:TR0=1;break;
                        case 1:TR0=0;break;
                        case 2:TT=0,MM=0;break;
                }
                i++;
                if(i>2)
                {
                        i=0;
                }
                delay10ms(10);
                IE0=0;//外部发生中断时其值为1               
}

void Time0() interrupt 1
{

        TH0=0xD8;
        TL0=0xF0;
        MM++;
        if(MM==100)
        {                                 
                MM=0;
                TT++;
                                if (TT==100)
                                {
                                        TT=0;
                                }
        }
        TF0=0;//为1时表示定时器T0计数溢出
}
void Int1() interrupt 2
{

                delay10ms(100);
                TTTT=TT;
                MMMM=MM;
                A=~A;
                delay10ms(10);
                TF1=0;//外部发生中断时其值为1
}
   
回复

使用道具 举报

ssz666 发表于 2019-1-12 11:53 | 显示全部楼层
你可以参考下我这个,我的就是按键控制启动和暂停以及清零,你可以稍微改一改
回复

使用道具 举报

 楼主| luoyua 发表于 2019-1-12 11:58 | 显示全部楼层

不可以实现呀!!!用了掉电模式   5秒就断电       就只能重新开始了
回复

使用道具 举报

yzwzfyz 发表于 2019-1-12 14:35 | 显示全部楼层
楼主构思奇妙。
方法很简单,读通现有的程序。就知道如果加了。
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机. 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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