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单片机里了。

  • 相关阅读:
    编译原理基础知识---文法和语言(一)
    编译原理简单知识总结(一)---编译程序和解释程序
    python网络编程
    博客声明
    v4l2编程
    Linux中的虚拟文件系统
    linux 内核文件中Makefile、kconfig、.config的关系(SDK结构)
    shell编程---find命令
    springcloud、springboot 版本号解析
    List<Map<String, Object>> 与 json 互转
  • 原文地址:https://www.cnblogs.com/xmfbit/p/3872204.html
Copyright © 2011-2022 走看看