简易秒表计时器设计

一、设计要求
(1)利用单片机定时器,每1s使秒表显示加1计时,最长计时时间为59分59秒,用4位数码管实现分、秒显示,分与秒之间采用小数点分隔。
(2)按键功能:当第1次按一下计时功能键,秒表开始计时并显示;第2次按一下计时功能键,停止计时;第3次按一下计时功能键,秒表清0,再按一次,重复开始计时过程。

二、硬件电路

简易秒表计时器设计_第1张图片

三、C51源程序

#include

#define uchar unsigned char
#define uint unsigned int

uchar code SegCode[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 
                      0x07, 0x7F, 0x6F};          //共阴极段码 0~9, 高电平点亮
uchar code BitCode[]={0x01, 0x02, 0x04, 0x08};   //位码; P1口1有效

uchar DispBuf[4];                    //显示缓冲区
uchar Minute, Second, Counter;
uchar Key_count;
sbit Key = P3^7;
/***********
void Delay(uint t)        //定义延时函数
     {
     while(--t);
     }
************/
void DelayMs(uint n)     //延时函数
  {
    uchar j;
    while (n--)
    {
        for (j = 0; j < 125; j++);   
    }
  }

void Disp_Buf()                     //计数值送显示缓冲区
{
    DispBuf[3] = Minute / 10;     //分十位
    DispBuf[2] = Minute % 10;    //分个位
    DispBuf[1] = Second / 10;   //秒十位
    DispBuf[0] = Second % 10;   //秒个位
}

void Display()
{
  uchar i;
  Disp_Buf();
  for(i = 0; i < 4; i++)
  {
    P2=0x0;
        if(i == 2)
        P2 = SegCode[DispBuf[i]] | 0x80; //点亮第 3 位数码管 dp
    else
        P2 = SegCode[DispBuf[i]];
    P1 = BitCode[i];
    DelayMs(5);
  }
}
void main(void)
{
    TMOD = 0x01; //T0 设置为定时方式 1
    ET0 = 1;     //允许 T0 中断
    EA = 1;
      P3=0xff;
      Minute=29;Second=55;Counter=0;
    while (1)
    {
        if (Key==0) //当按键按下时
        {
            //Delay(1000);
                      DelayMs(10);
                      Key_count++;
            switch (Key_count)
            {
                case 1:            //第 1 次按键, 启动秒表计时 //定时 50 ms
                    TH0 = 0x3C;    //fosc=12MHZ,定时50ms溢出
                    TL0 = 0xB0;
                    TR0 = 1;
                    break;
                case 2:            //第 2 次按键, 停止计时
                    TR0 = 0;
                    break;
                case 3:           //第 3 次按键, 秒表清 0
                    Key_count = 0;
                    Minute = 0;
                    Second = 0;
                    break;
             }
            while (Key==0);
         }
         Display();
     }
  }

void T0_Isr(void) interrupt 1
{
    TH0 = 0x3C;
    TL0 = 0xB0;
    Counter++;
    if (Counter == 20)
    {
        Counter = 0;
        Second++;
        if (Second == 60)
        {
            Second = 0;
            Minute++;
            if (Minute == 60) Minute = 0;
        }
    }
}
            
        
四、仿真截图

第1次按下计时功能键K1,秒表开始计时并显示。

简易秒表计时器设计_第2张图片

你可能感兴趣的:(c语言,单片机)