单片机秒表计时器

来源:互联网 发布:linux怎么防御勒索 编辑:程序博客网 时间:2024/05/18 03:18

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

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

#include <reg52.h>#define uchar   unsigned charsbit 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,最大为5999int 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单片机里了。

 

原创粉丝点击