zoukankan      html  css  js  c++  java
  • 单片机秒表计时器

         用51单片机的定时器0的方式1计时,结果用4位数码管显示,分别为秒十位,秒个位,毫秒百位,毫秒十位。所以总共最大计时为1分钟,精确到了0.01s。同时,加上3个独立按键,分别控制秒表的清零,暂停和开始功能。

       按照模块化的思想,首先先把要用的函数和预定义写到一个头文件中,要用到的预定义和全局变量如下:

    #include <reg52.h>
    #define uchar   unsigned char
    
    sbit Clear=P3^7;   //按键实现清零
    sbit Stop=P3^6;    //按键实现暂停
    sbit ReStart=P3^5;  //按键实现开始
    sbit dula=P2^6;     //段选线接P2^6口
    sbit wela=P2^7;     //位选线接P2^7口
    
    //table数组中存储数码管显示0~F对应的编码
    uchar code   table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};
    
    //计时时间,计时中断发生一次,则加1,最大为5999
    int time;

    接下来是将要用到的函数声明:

    //用于动态扫描数码管的时间较短的延时函数
    void ShortDelay();    
    
    //用于键盘消抖的时间较长的延时函数
    void LongDelay();
    
    //初始化
    void Inital();
    
    //在数码管显示秒十位,秒个位,微秒百位,微秒十位
    //用拼音表示很不好,将就着看吧
    void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei);
    
    //清零函数,按下清零键的时候调用
    void Clc();
    
    //暂停函数,按下暂停键时候调用
    void StopTimer();
    
    //开始或重新开始函数,按下开始键时候调用
    void ReStartTimer();
    
    //键盘扫描函数,是否有键被按下,并且执行相应操作
    void KeyScan();


     

    接下来是主函数:

    void main()
    {
      uchar shimiao,gemiao,baiwei,shiwei;
      Inital();   //初始化
      while(1)
      {
        if(time==6000)    //到了秒表最大值,自动归零
        {
          time=0;
        }
        
        //分解出要显示的各个数位
        shimiao=time/1000;
        gemiao=time%1000/100;
        baiwei=time%100/10;
        shiwei=time%10;
        
        //显示
        Display(shimiao,gemiao,baiwei,shiwei);
        ShortDelay();
        //键盘扫描,有键按下执行相应操作
        KeyScan();
      }
    }


    下面的工作就是要写相应的处理函数了:

    首先是两个延时函数:

    void ShortDelay()
    {
      uchar a=100;
      while(a--);
    }
    
    void LongDelay()
    {
      int a=5000;
      while(a--);
    }


    初始化函数:

    void Inital()
    {
      dula=0;
      wela=0;
      time=0;
      EA=1;
      ET0=1;    //开定时器0中断
      TMOD=0x01;
      TH0=0xdc;
      TL0=0x01;   //装载初值,计时方式1  
      Clear=1;
      Stop=1;
      ReStart=1;   //按键接口管脚输出高电平
    }


    在数码管上显示时间的函数:

    void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei)
    {
      //输出秒十位
      wela=1;
      P0=0xfb;
      wela=0;
      P0=0xff;
      dula=1;
      P0=table[shimiao];
      dula=0;
      ShortDelay();
      
      //输出秒个位
      wela=1;
      P0=0xf7;
      wela=0;
      P0=0xff;
      dula=1;
      P0=table[gemiao];
      dula=0;
      ShortDelay();
      
      wela=1;
      P0=0xef;
      wela=0;
      P0=0xff;
      dula=1;
      P0=table[baiwei];
      dula=0;
      ShortDelay();
      
      wela=1;
      P0=0xdf;
      wela=0;
      P0=0xff;
      dula=1;
      P0=table[shiwei];
      dula=0;
      ShortDelay();
      
    }


    键盘扫描函数:

    void KeyScan()
    {
       if(Clear==0)    
        {
          LongDelay();    //消抖
          if(Clear==0)    //确实是被按下
          {
            //Do somthing
            Clc();
          }
        }
        
        //Stop和ReStart检测方法相同
        if(Stop==0)     
        {
          LongDelay();
          if(Stop==0)
          {
            //Do somthing
            StopTimer();
          }
        }
        if(ReStart==0)
        {
          LongDelay();
          if(ReStart==0)
          {
            //Do somthing
            ReStartTimer();
          }
        }
    }


    最后是3个按键按下后的处理函数:

    void Clc()
    {
      TR0=0;   //计时暂时停止
      time=0;   //时间归零
      Display(0,0,0,0);   //显示0000
      ShortDelay();    
    }
    
    void StopTimer()
    {
      //计时暂时停止,仅此而已
      TR0=0;    
    }
    
    void ReStartTimer()
    {
      //计时重新开始,仅此而已
      TR0=1;
    }
    


    至此,编译链接后生成的.HEX文件就能下载到51单片机里了。

  • 相关阅读:
    基础练习 龟兔赛跑预测
    SQL查询
    通讯录管理系统
    信号分解
    开源框架 openFrameworks
    开博了
    AES加密原理和AOE工程实践
    一文读懂AOE到底是什么!
    AoE 搭档 TensorFlow Lite ,让终端侧 AI 开发变得更加简单。
    AOE工程实践-银行卡OCR里的图像处理
  • 原文地址:https://www.cnblogs.com/xmfbit/p/3872204.html
Copyright © 2011-2022 走看看