您的位置 首页 系统

根据51单片机的计时器规划

基于51单片机的计时器设计-用51单片机的定时器0的方式1计时,结果用4位数码管显示,分别为秒十位,秒个位,毫秒百位,毫秒十位。所以总共最大计时为1分钟,精确到了0.01s。

用51单片机定时器0的办法1计时,成果用4位数码管显现,别离为秒十位,秒个位,毫秒百位,毫秒十位。所以一共最大计时为1分钟,准确到了0.01s。一起,加上3个独立按键,别离操控秒表的清零,暂停和开端功用。

依照模块化的思维,首要先把要用的函数和预界说写到一个头文件中,要用到的预界说和全局变量如下:

根据51单片机的计时器规划

#include

#defineucharunsignedchar

sbitClear=P3^7;//按键完成清零

sbitStop=P3^6;//按键完成暂停

sbitReStart=P3^5;//按键完成开端

sbitdula=P2^6;//段选线接P2^6口

sbitwela=P2^7;//位选线接P2^7口

//table数组中存储数码管显现0~F对应的编码

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

//计时时刻,计时中止产生一次,则加1,最大为5999

intTIme;

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

//用于动态扫描数码管的时刻较短的延时函数

voidShortDelay();

//用于键盘消抖的时刻较长的延时函数

voidLongDelay();

//初始化

voidInital();

//在数码管显现秒十位,秒个位,微秒百位,微秒十位

//用拼音表明很欠好,将就着看吧

voidDisplay(ucharshimiao,uchargemiao,ucharbaiwei,ucharshiwei);

//清零函数,按下清零键的时分调用

voidClc();

//暂停函数,按下暂停键时分调用

voidStopTImer();

//开端或重新开端函数,按下开端键时分调用

voidReStartTImer();

//键盘扫描函数,是否有键被按下,而且履行相应操作

voidKeyScan();

接下来是主函数:

voidmain()

{

ucharshimiao,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();

}

}


下面的作业便是要写相应的处理函数了:

首要是两个延时函数:

voidShortDelay()

{

uchara=100;

while(a–);

}

voidLongDelay()

{

inta=5000;

while(a–);

}


初始化函数:

voidInital()

{

dula=0;

wela=0;

time=0;

EA=1;

ET0=1;//开定时器0中止

TMOD=0x01;

TH0=0xdc;

TL0=0x01;//装载初值,计时办法1

Clear=1;

Stop=1;

ReStart=1;//按键接口管脚输出高电平

}


在数码管上显现时刻的函数:

voidDisplay(ucharshimiao,uchargemiao,ucharbaiwei,ucharshiwei)

{

//输出秒十位

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();

}


键盘扫描函数:

voidKeyScan()

{

if(Clear==0)

{

LongDelay();//消抖

if(Clear==0)//确实是被按下

{

//Dosomthing

Clc();

}

}

//Stop和ReStart检测办法相同

if(Stop==0)

{

LongDelay();

if(Stop==0)

{

//Dosomthing

StopTimer();

}

}

if(ReStart==0)

{

LongDelay();

if(ReStart==0)

{

//Dosomthing

ReStartTimer();

}

}

}


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

voidClc()

{

TR0=0;//计时暂时中止

time=0;//时刻归零

Display(0,0,0,0);//显现0000

ShortDelay();

}

voidStopTimer()

{

//计时暂时中止,仅此而已

TR0=0;

}

voidReStartTimer()

{

//计时重新开端,仅此而已

TR0=1;

}
来历;21ic

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/343869.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部