单片机秒表计时器

您所在的位置:网站首页 单片机ABCD用代码怎么表示 单片机秒表计时器

单片机秒表计时器

2024-07-08 09:20| 来源: 网络整理| 查看: 265

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

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

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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3