采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数)

采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数),第1张

硬件电路 有2位数码管可以显示秒表的时间 0~10秒

有3个按键 K1为开始计时 K2为停止计时 K3为清零

软件设计:

K1按下则启动定时器定时 每到1秒 显示器缓冲单元内容加1

K2按下则停止定时器定时

K3按下则将显示器缓冲单元内容清零。

型号不同,可能略有不同,但大同小异。

以下是科沃德电子定时器的 *** 作说明:

一、调整当前时间

使用定时器时,须先将定时器的显示时间调整到当前时间。

1、按住“时钟”键的同时,分别按“星期” 、“小时” 、“分钟” 键,调整到当前的时间。(每按一次增加一小时,长按可快速调整。)

2、按“时钟”键3秒后,当前时间增加1小时,同时液晶屏显示“夏令时”字样,进入夏令时功能,再按“时钟”键3秒,取消夏令时功能,时间自动减少1小时。

二、设置程序

1、按“设定”键,即可进入定时模式设置,屏幕上显示“1开” 。

2、按“小时” 、“分钟”和“星期” ,即第一组定时开始工作的时间,其中,按“星期”键,可选择不同星期组合模式。可根据需求,定时器只在设定的星期数中工作。

3、再按“设定”键,屏幕上显示“1关” ,即第一组定时关闭时间,时间设置参考“1开”设置方法。以此类推,最多可设置20组开与关。

4、设置完成后按“时钟”键返回当前时间。

注:

(1) 如果每天不需要设定20组,而其他组已经设定,必须按“清除”键,将多余各组的时间程序清除。

电子计时器这样调成倒计时:

倒计时功能

在时间显示的时候(也就是屏幕上面没有字符在闪烁的情况下) 按一下←按键 进入倒计时设置功能

然后通过设置按键和← →按键来设置倒计时的时 分 秒, 设置好后 按一下倒计时按键开始启动倒计时。

我已经完成了,下面是电路图和实际效果,你也试试,程序已经调试完成了!!!是使用秒表程序改编完成的,喜欢的话,点一个赞吧!希望能帮到你!!!

#include "reg52h" //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f};//显示0~F的值

u8 ssec=100,sec=60,min=04;

u8 DisplayData[8];

sbit beep=P1^5;

unsigned long counter=0;

unsigned int c=0;

sbit p15=P1^5;

bit p;

/

函 数 名         : delay

函数功能    : 延时函数,i=1时,大约延时10us

/

void delay(u16 i)

{

while(i--);

}

/

函 数 名         : Timer0Init

函数功能    : 定时器0初始化

输    入         : 无

输    出         : 无

/

void Timer0Init()

{

TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0=0Xd8; //给定时器赋初值,定时10ms

TL0=0Xf0;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器 -->启动定时器中断!

ET1=1;

TR1=1;

TH1=(65536-250)/256;  //FC

TL1=(65536-250)%256;

}

/

函 数 名         : DigDisplay

函数功能    : 数码管动态扫描函数,循环扫描8个数码管显示

/

void DigDisplay()

{

u8 i;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

P0=DisplayData[i];//发送段码

delay(100); //间隔一段时间扫描

P0=0x00;//消隐-->撤销选中;

}

}

void datapros()

{

DisplayData[0]=smgduan[ssec%10];

DisplayData[1]=smgduan[ssec/10];

DisplayData[2]=0x40;

DisplayData[3]=smgduan[sec%10];

DisplayData[4]=smgduan[sec/10];

DisplayData[5]=0x40;

DisplayData[6]=smgduan[min%10];

DisplayData[7]=smgduan[min/10];

}

/

函 数 名       : main

函数功能 : 主函数

输    入       : 无

输    出    : 无

/

void main()

{

Timer0Init();  //定时器0初始化

while(1)

{

datapros();

DigDisplay();

}

}

/

函 数 名         : void Timer0() interrupt 1

函数功能    : 定时器0中断函数

输    入         : 无

输    出         : 无

/

void Timer0() interrupt 1

{

TH0=0Xd8; //给定时器赋初值,定时10ms

TL0=0Xf0;

ssec--;

if(ssec==00)  //1s

{

ssec=100;

sec--;

if(sec==00)

{

sec=60;

min--;

if(min==-1)

{

P1=1;

ssec=0;sec=0;min=0;

TR0=0;

}

}

}

}

void Timer1() interrupt 3

{

TH1=(65536-250)/256;  //FC

TL1=(65536-250)%256;

if(p!=1) p15=~p15;

if(p==1) p15=0;

c++;

if(c==250)

{

//c=0;

p=~p;

}

if(c>=250&&1695);

if(c==1696) c=0;

}

实验电子秒表使用方法如下

使用时,用拇指指关节或用食指第二指关节扣住按键,并将秒表靠住自己的胸部,不在任何的摆臂动作中完成按键。

按表时不要用力过猛,以防损坏机件;回表后,如秒针不指零,应记下其数值(零点读数),试验后从测量值中将其减去(注意符号);按键时尽量用正确的角度和适合的力量,不要按在按钮的边缘或斜角度按,避免卡住或损坏按钮。

计时开启后不要将秒表挂在脖子上或放在口袋内跑动,防止跑的过程中秒表按键与身体相撞,造成意外的停止或开启。

扩展资料

秒表主要有机械和电子两大类,电子表又可分为三按键和四按键两大类。绝大部分体育教师使用的多是电子秒表,机械秒表在很多地方已经成为历史。电子秒表是一种较先进的电子计时器,国产的电子秒一般都是利用石英振荡器的振荡频率作为时间基准,采用6位液晶数字显示时间,具有显示直观、读取方便、功能多等优点。

保持电池的定期更换,一般在显示变暗时即可更换,不要等电子秒表的电池耗尽再更换。电子秒表平时放置的环境要干燥、安全,做到防潮、防震、防腐蚀、防火等工作。避免在电子秒表上放置物品。没有把握的情况下,不要随意打开私自进行维修,应送专业人士进行维修。

我有一个大问题。我不知道如何用按钮停止计时器并用另一个按钮重新启动计时器。

这是我到目前为止的代码:

此代码是启动计时器的按钮的中断处理程序。我认为通过启用定时器是可能的,到目前为止它是有效的。

void EXTI0_1_IRQHandler(void)

{

if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1) / Check line 1 has triggered the IT /

{

EXTI->PR = EXTI_PR_PR1; / Clear the pending bit /

NVIC_EnableIRQ(TIM7_IRQn);

}

}

此代码是停止计时器的按钮的中断处理程序。这段代码不起作用,计时器一直亮着。

void EXTI4_15_IRQHandler(void)

{

if ((EXTI->PR & EXTI_PR_PR4) == EXTI_PR_PR4) / Check line 1 has triggered the IT /

{

EXTI->PR = EXTI_PR_PR4; / Clear the pending bit /

NVIC_DisableIRQ(TIM7_IRQn);

}

}

有没有人有一些提示或知道它必须是怎样的?

最佳答案

我认为“NVIC_DisableIRQ(TIM7_IRQn);”只需禁用计时器的中断但不停止计时器。

您可能需要:“TIM_Cmd(TIM7, DISABLE);”而不是“NVIC_DisableIRQ(TIM7_IRQn);”

以上就是关于采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数)全部的内容,包括:采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数)、科沃德电子定时器怎么设定有知道的回复,谢谢了、电子计时器怎么调成倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10055484.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存