① 30秒倒计时器课程设计
【摘 要】篮球比赛30秒钟规则规定:进攻球队在场上控球时必须在30秒钟内投篮出手(NBA比赛为24秒,全美大学体育联合会比赛中为35秒),因此在比赛时裁判既要看比赛又要看秒表计时,而本文介绍的30秒倒计时器可以解决此问题。
【关键词】AT89C51单片机、30秒倒计时器、LED
30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。
一、电路设计
30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。
图1 30秒倒计时器电路原理图
1、按键输入
“30秒倒计时器”采用了三个按键来完成计数器的启动计数、复位、暂停/继续计数等功能。
(1)K1键:启动按钮(P3.2)。
按下K1键,计数器倒计时开始,数码管显示数字从30开始每秒递减计数,当递减到到零时,报警电路发出声、光报警信号。当计数器处于暂停状态时按下K1键将回到计时状态。
(2)K2键:复位按钮(P3.3)。
按下K2键,不管计数器工作于什么状态,计数器立即复位到预置值 “30” ,在报警状态时按下K2键还可取消报警。
(3)K3键:暂停/计时切换按钮(P3.4)。
当计数器处于计时状态时按下该键计数器暂停计时,数码管显示数字保持不变;当计数器处于暂停状态按下该键计数器将回到计时状态;初始状态时该键无效。
2、显示驱动电路
“30秒倒计时器”用两个共阳数码管来显示时间,数码管显示方式为动态显示。显示驱动电路中,数码管的段码引脚通过470欧的电阻接到单片机的P1口,两个片选引脚各通过一个9012连接到正5V电源,由P3.0和P3.1控制。
4、报警电路
计时时间减到0,显示数码管显示“00”时,发光二极管D1由P3.5控制发出光报警,同时蜂鸣器由P3.7控制发出声报警。
二、软件编程思路
1、全局变量
“30秒倒计时器”动作流程主要受三个全局变量控制。首先是bit变量“act”,当“act”为“1”时倒计时开始,为“0”时倒计时停止,“act”初值为“0”,可以由按钮操作将其置“1”或清“0”。第二个全局变量是char变量“time”,存放倒计时的时间,当倒计时时间为0时,发出声光报警。变量“time”的初值为30,定时中断服务程序在“act”为1时,每1s对其进行减1操作,减到0时保持为0,按下“复位键”可将“time”复位为30。第三个全局变量是int变量“t”,记录响应定时中断0的次数。根据初始化定义,定时器0以方式1工作,每1ms发出一次中断请求。控制程序只开放了定时器0中断,因此不会有比定时器0中断更高级的中断被允许,所以每次请求都会立刻被响应。响应后在中断服务程序中将全局变量“t”加1记录响应中断次数,每响应1000次即为1秒钟。变量“t”初值为0,在中断服务程序中加1,当“t”为2000时由中断服务程序清0。在按键驱动程序中,按下启动键、复位键、暂停/启动键时将“t”清0,目的是从0ms开始计时。
2、控制流程
主程序主要用来检测全局变量“time”当“time”为0时发出“声光报警”。按键驱动、显示驱动和“time”操作都在定时器0中断服务程序中进行。其控制流程如图2所示。
图2 控制流程图
三、软件程序设计
1、数码管驱动程序
到计时器的两个数码管以动态显示的方式显示计时时间“time”(全局变量),LED1显示“time”的十位,LED2显示“time”的个位。
(1)定义段码数据口和片选信号
根据实际电路,在C51中定义段码的数据口为P1,两个片选信号为P3.0和P3.1。定义如下:
#define an P1
sbit wei1=P3^0;
sbit wei2=P3^1;
(2)定义字形码
LED显示数字0~9以及全灭的字形码表格放在数组zixing[]中。字形码是固定的表格,定义时加上关键字“code” 表示该表格存放在程序存储器中。
unsigned char code zixing[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
(3)定义数码管LED1和LED2的显示变量
为了增加驱动程序的可移植性,笔者为数码管LED1和LED2定义了显示变量。显示变量就是本驱动程序的对外接口,外部程序只要改变显示变量的值就可改变数码管显示的数值。定义方式如下:
unsigned char led_str[2]={10,10};
led_str[0]直接对应数码管LED1, led_str[1]直接对应数码管LED2。本项目中由专门的子程序将全局变量time计算拆分成led_str[0]和led_str[1]。
void js()
{
led_str[1]=time/10%10;
led_str[0]=time%10;
}
(4)数码管驱动程序
数码管驱动程序“void chushi(char i)”在定时中断服务程序中被调用执行。根据初始化程序的定义,定时中断服务程序每1ms被执行一次。定时中断服务程序中运用全局变量“t”记录进入该服务程序的次数,“t”计满2000由定时中断服务程序清零。
数码管驱动程序的参数“char i”是用来确定当前点亮的是LED1还是LED2,当参数为“0”时点亮LED1,参数为“1”时点亮LED2。如果我们希望偶数次进入定时中断服务程序时点亮LED1,奇数次进入定时中断服务程序时点亮LED2,我们可以用程序调用语句“chushi(t%2);”轻松实现。
进入数码管驱动程序后首先调用子函数js(),计算当前的led_str[0]和led_str[1]。接下来将两个数码管全部熄灭以防止余晖的出现。最后点亮需要点亮的数码管并送出字型码。驱动程序代码如下:
void chushi(char i)
{
js(); //计算显示变量
an=0xff; //去余晖
wei1=i; wei2=!i; //确定片选
an=zixing[led_str[i]]; //送字型码
}
2、按键驱动程序
按键驱动程序分为按键识别和按键功能执行两部分。按键功能执行可在按键按下时或按键抬起后执行,文中将其设计在按键抬起后执行。
(1)定义按键I/O地址
根据实际电路,三个按键(启动键、复位键、暂停/启动键)分别接在P3口的P3.2,P3.3和P3.4三个引脚上。为了取键值方便还将P3口定义为“iokey”,程序中可作定义如下:
#define iokey P3
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
(2)按键驱动流程
按键识别的通用流程为:I/O口写“1”→判断有无键按下→延时去抖→确定键值→等待按键抬起→执行按键功能。按键驱动程序中定义了两个静态变量“ts” 和“kv”,分别用来延时去抖和存放键值。
(3)延时去抖
静态变量“ts”用来延时去抖。按键驱动程序在定时中断服务程序中每1ms被执行一遍,每检测到有键按下“ts”加1,检测到无键按下“ts”清0。按键连续按下20ms,则连续20次执行按键驱动程序时都检测到有键按下,此时静态变量“ts”累加到20,可确认按键按下有效。
为防止按键一直按着不放而使“ts”累加到溢出,确认有键按下后可使“ts”的值保持为20,或大于20的某一个值如21。
(4)取键值
确认有键按下后即可通过读取按键的I/O口状态来得到键值。为读取P3.2、P3.3和P3.4引脚状态,屏蔽P3口其他引脚的影响,可将读取后的数值按位或上11100011B(0xE3)再送给静态变量“kv”。
静态变量“kv”存放按键的键值,无键按下或按键抬起后kv的值为0。按下启动键key1时kv=11111011B(0xFB),按下复位键key2时kv=11110111B(0xF7),按下暂停/启动键key3时kv=11101111B(0xEF)。
(5)执行按键功能
按键抬起后第一次执行按键驱动程序时,静态变量“kv”任保持着按键按下时最后得到的键值,以该键值作为参数调用按键执行程序“actkey(kv);”即可执行按键功能。调用后kv值立刻清0,确保按一次键执行一次按键功能。驱动程序代码如下:
void key()
{
static unsigned char kv=0;
static unsigned char ts=0;
key1=1;key2=1;key3=1;
if(!(key1&key2&key3))
{
ts++;
if(ts>=20)ts=20; //有键按下
if(ts==20)
kv=iokey|0xe3; //取键值
}
else
{ //无键按下或按键已抬起
actkey(kv);
ts=0;
kv=0;
}
}
函数actkey(kv)用来根据键值“kv”执行相应操作。当“kv”等于0xFB时代表启动键key1按下,函数actkey(kv)将全局变量act赋值为“1”。当“kv”等于0xF7时代表复位键key2按下,函数actkey(kv)将全局变量“time”复位为“30”。当“kv”等于0xEF时代表暂停/启动键按下,函数actkey(kv)将全局变量act取反。每按一个按钮都有将全局变量“t”清0的操作,目的是每当复位、或启动计时时,进入定时中断的次数都从0开始计算,否则会出现第1秒计时不准确的现象。程序代码如下:
void actkey(unsigned char k)
{
switch(k)
{
case 0xfb:act=1;t=0;break;
case 0xf7:time=30;t=0; break;
case 0xef:act=~act;t=0; break;
}
}
四、结束语
本文在编程过程中以面向对象的编程思路封装了两个LED数码管和三个独立按键。当其驱动程序在定时中断服务程序中被调用,编程者只要操作其接口:数组“led_str[2]”和函数“actkey(unsigned char k)”,无需直接对硬件进行编程即可改变功能,增强了软件的通用性和可移植性。
② 怎样设计计时器
visual basic 程序设计__使用计时器控件(1)
[email protected]
年级:高(二)
教学目标:
整体目标:
技能目标:掌握工具箱里的计时器控件的基本属性和事件,并会使用该控件编写简单的程序。
情感目标:激发学生学习VisualBasic程序设计的兴趣。
发展目标:培养独立思考、学习和创新精神,提高学生的信息素养。
层次目标:
基础簿弱学生的学习目标:
1.基本了解“计时器控件”的Enabled属性和Interval属性,会使用属性窗口进行相关设置,初步学会用代码设置Enabled属性。
2.了解“计时器控件”的Timer事件何时被触发,并会编写简单程序的相应代码。[本教案采用的程序是设计一个简单的“电子表”程序]
一般学生的学习目标:
1.熟练掌握“计时器控件”的Enabled属性和Interval属性,会使用属性窗口进行相关设置,并会使用代码设置这些属性。
2.了解“计时器控件”的Timer事件何时被触发,熟练编写简单程序的相应代码,并能根据帮助文件对“电子表”程序进行一定程度的扩充。[本教案采用的程序是设计一个简单的“电子表”程序]
优等学生的学习目标:
1.熟练掌握“计时器控件”的Enabled属性和Interval属性,会使用属性窗口进行相关设置,并会使用代码设置这些属性。
2.熟练掌握“计时器控件”的Timer事件何时被触发,熟练编写简单程序的相应代码,并能根据帮助文件完善“电子表”程序。[本教案采用的程序是设计一个简单的“电子表”程序]
教学重点:
1.了解如何在窗体上加入“计时器控件”即Timer控件,理解Timer控件的Enabled属性、Interval属性和Timer事件。
2.学习使用Timer控件来编写“电子表”程序的关键子程序即Timer事件。
3.培养学生良好的程序设计结构和习惯。
教学难点:让学生发现程序的不足之处,并给出相应的解决方案。
教学过程
课前准备:按照课程要求,准备好要演示的程序,以及相应的帮助文件。
一、 引入(1分钟)
1. 上课后,将准备好的“电子表”程序演示给学生们看,激发学生的兴趣。
2. 教师说话:如何来设计和实现一个简单的“电子表”程序呢,今天我们要来讲一个“计时器控件”,通过这个控件,我们就能设计和实现一个简单的“电子表”程序了 。
二、 讲解(15分钟)
1. 知识点介绍:
(1) 计时器控件像其它一般控件一样可在工具箱中找到。
(2) 计时器控件是一个不可见控件,也就是说在设计阶段,你能够看到它,但程序运行时它不会在见面上出现,是不可见的,因此它没有其他可见控件的VISIBLE属性和CAPTION属性。
(3) 但“计时器控件”有两个很重要的属性就是Interval属性和Enabled属性。
Enabled属性和其它控件的Enabled属性一样,表示该控件是是否响应用户所生成的事件,也就是说是否会去执行Timer事件里的代码。
Interval属性:是一段时间间隔,单位是毫秒,是两次调用Timer事件的时间间隔。
注意:在Enabled=True的情况下,Interval属性才起作用,每过Interval时间间隔就调用Timer事件。
当Enabled=False时,Interval属性无效,无任如何都不会调用Timer事件。
相当于Enabled是个启动计时器的一个开关,而Interval是计的时间间隔。Enabled=True,启动计时,当时间一到就去处理Timer事件,继续计时。当Enabled=False时,停止计时。
(4) 计时器控件的Enabled控件Interval属性和Enabled属性的设置。
方法一:设计阶段,在属性窗口中设置,如ENABLED=FALSE;
INTERVAL=1000(即一秒)
方法二:代码编写,如在窗体加载时写入:
Private Sub FrmMain_Load()
timer1.Enabled=false
timer1.Interval=1000
End Sub
(5) 计时器控件”还有一个最重要的事件Timer事件。
当timer1.Enabled=True时,每过timer1.Interval个时间段,就会去执行Timer事件。
比如说,你每过0.1秒就把某个件事情处理一下,那么你就可以把处理这件事情的代码写在一个Timer控件的Timer事件中。
最简单的如每过一秒我们就让某个数加一,那么这样经过处理后,就能模拟一个电子表了,今天就来学习如何做一个“电子表”。
Private Sub Timer1_Timer()
Rem 加入定时执行的代码段'
End Sub
2. 根据任务进行程序的分析
任务:编写模拟“电子表”的程序。
功能描述:(1)重置时间:就是把时间变为0
(2)开始计时:就是电子表开始工作计时
(3)暂停计时:就是电子表暂时停止计时,但下次计时的时候,要从先前停的时间继续计时。
程序分析:
主程序:
说明:等待时间到达,计时器控件自动完成。
重置时间:
将时间重新设置为0
开始计时:
计时器开始工作,即计时器的Eanbled属性为TRUE
暂停计时:
计时器暂停工作,即计时器的Eanbled属性为False
3. 简单界面的设置
三、 先让学生根据课堂要求,进行程序的分析和编写,教师指导(10分钟)
四、教师发下帮助文件继续练习,并说明这个帮助文件中的第一个程序的一些不完善的地方,希望学生思考后,给以解决。
五、 教师总结本堂课的重点知识。
这次课主要学习了计时器控件的两个基本属性ENABLED属性和INTERVAL属性以及TIMER事件。[对知识点进行重述]。我们可以利用该控件来实现其它控件很到作到的事情,如“电子表”等等,我们还可以利用该控件来做一些特殊的效果,如动画等。
六、 作业:(二选一)
1. 利用该控件做一个流动字幕的程序。
2. 继续完善“电子表”的功能。(功能提示:设置时间功能,秒表功能,显示日期功能,设置日期等,可以展开想象).
③ 如何制作秒表计时器,时间以秒为单位增加,并用数码管实时显示,计数器记到100时,计数停止。要求:有设计
你好,有两种方法:
1.纯硬件的数字电路:使用计数器来对1Hz的时钟脉冲进行计数,那么输出端也是1s增加1次,然后把输出端直接或间接的与数码管连接;还需注意数码管的接线方式是共阴还是共阳,计数器的位数也有要求限制。
2.软件加硬件:使用单片机编程,利用内部定时器功能,对一个变量进行一定时间增1的动作,然后当此变量等于一个与定时器定时时间相乘等于1s的值的时候,就对对秒变量加1,并编码后显示到数码管。
希望我的回答能帮助到你。
④ C#计时器,比如秒表怎么设计
先在窗口中加入一个计时器控件:(timer1)用于触发计时;一个Label控件:(bable1)用于显示时间;两个按钮:(btnStar)用于开始/停止计时,(btnClear)用于计时器清零。 声明一个整型变量:t,用于获取毫秒,然后在窗口代码中加入以下代码: private int t = 0; void MainFormLoad(object sender, System.EventArgs e) { this.timer1.Enabled = false; this.timer1.Interval = 1; }
//计时函数 public string GetAllTime(int time) { string hh, mm, ss, fff; int f = time%100; // 毫秒 int s = time/100; // 转化为秒 int m = s/60; // 分 int h = m/60; // 时 s = s%60; // 秒 //毫秒格式00 if。
⑤ vb计时器的设计
新建一个文本框,两个按钮,一个时间控件
然后打开代码框
把里面的代码全清空,再把下面的复制进去就可以了
Dim
a,
b,
c,
d
As
Integer
Private
Sub
Command1_Click()
If
Command1.Caption
=
"开始计时"
Then
Timer1.Enabled
=
True
Timer1.Interval
=
100
Command1.Caption
=
"停止计时"
Else
Timer1.Enabled
=
False
Timer1.Interval
=
0
Command1.Caption
=
"开始计时"
End
If
End
Sub
Private
Sub
Command2_Click()
a
=
0
b
=
0
c
=
0
d
=
0
Text1.Text
=
a
&
":"
&
b
&
":"
&
c
&
":"
&
d
Timer1.Enabled
=
False
Timer1.Interval
=
0
End
Sub
Private
Sub
Form_Load()
a
=
0
b
=
0
c
=
0
d
=
0
Text1.Text
=
a
&
":"
&
b
&
":"
&
c
&
":"
&
d
Command1.Caption
=
"开始计时"
Command2.Caption
=
"清零"
Timer1.Enabled
=
False
Timer1.Interval
=
0
End
Sub
Private
Sub
Timer1_Timer()
d
=
d
+
1
If
d
=
9
Then
c
=
c
+
1:
d
=
0
If
c
=
59
Then
c
=
0:
b
=
b
+
1
If
b
=
59
Then
b
=
0:
a
=
a
+
1
Text1.Text
=
a
&
":"
&
b
&
":"
&
c
&
":"
&
d
End
Sub
⑥ 自制计时器的设计原理
设定一段时间如5分钟,对滴水计时器的滴水数量进行计数为N.则滴水的时间间隔为5*60/N(秒).
⑦ 设计一个计时器
用一米长的细绳吊一个重的细球,摆角要求小于15度,即达到一周期一秒的最简计时器
⑧ 制作一个受水型计时器画图实验记录有设计课题设计人员需要的材料 设计方法步
摘要 工具材料:
⑨ 篮球比赛计时器的设计
NBA篮球24秒倒计时
本设计是以555构成震荡电路,由74LS192来充当计数器,构成NBA24秒倒计时电路。该电路简单,无需用到晶振,芯片都是市场上容易购得的。设计功能完善,能实现直接清零、启动和暂停/连续计时,还具有报警功能。
一、设计原理与电路
原理方框图图:
包括秒脉冲发生器、计数器、译码与显示电路、报警电路和控制电路(辅助时序控制电路)等五个部分组成。计时电路递减计时,每隔1秒钟,计时器减1其中计数器和控制电路是系统的主要部分。计数器完成24秒计时功能,而控制电路完成计数器的直接清零、启动计数器、暂停/连续计数、译码显示电路的显示与灭灯、定时时间到报警等功能。当计时器递减计时到零(即定时时间到)时,显示器上显示00,同时发出光电报警信号。
秒脉冲发生器产生的信号是电路的时钟脉冲和定时标准,但本设计对此信号要求并不是太高,电路采用555集成电路或由TTL与非门组成的多谐振荡器的构成。
译码显示电路用74LS48和共阴极七段LED显示器组成。报警电路在实验中可用发光二极管代替。
二、模块说明:
○18421BCD码递减计数器
计数器选用中规模继承74LS192进行设计较为简便,74LS192是十进制可编程同步加/减计数功能。下图是74LS192外引线排列图与功能表:
工作原理:当 =1,CR=0时,若时钟脉冲加入到 端,且 =1,则计数器在预置数的基础上完成加计数功能,当加计数到9时, 端发出进位下跳脉冲;若时钟脉冲加入到 端,且 =1,则计数器在预置数的基础上完成减计数功能,当减计数到0时, 端发出借位下跳变脉冲。由74LS192组成的二十四进制递减计数器如下图,其预置数为N=(0010 0100)8421BCD=(24)。它的计数原理是:只有当低位 1端发出借位脉冲时,高位计数器才作减计数。当高、低位计数器处于全零,且 =0时,置数端 2=0,计数器完成并行置数,在 端的输入时钟脉冲作用下,计数器再次进入下一循环减计数。
○2555振荡模块
如右图,由NE555构成的多谐振振荡器。接通电源后,电容C2被充电,Vc上升,当Vc上升到2/3Vcc时,触发器被复位,同时放电BJTT导通,此时V0为低电平,电容C通过R5和T放电,使Vc下降,当下降至1/3Vcc时,触发器又被置位,V0翻转为高电平。电容器C的放电时间为:
当C放电结束时,T截止,Vcc将通过R5和Rw、R4向电容器充电,Vc由1/3Vcc上升到2/3Vcc所需时间为:
当Vc上升到2/3Vcc时,触发器又发生翻转,如此周而复始,在输出端就得到一个周期性的方波,其频率为:
在这里我们选择R5=68K,C2=10uf,只要调节Rw 7K即可输出1HZ,达到要求。
○3辅助时序控制电路
操作“清零”开关时,计数器清零。闭合“启动”开关时,计数器完成置数,显示器显示24断开“启动”开关,计数器开始进行递计数。电路图中,当开关S1合上时, =0,74LS192进行置数;当S1断开时, =1,74LS192处于计数工作状态。开关S2是时钟脉冲信号CP的控制电路。当定时时间未到时,74LS192的借位输出信号 2=1,则CP信号受“暂停/连续”开关S2的控制,当S2处于“暂停”位置时,门G3输出为0,门G2关闭,封锁CP 信号,计数器暂停计数;当S2处于连续位置时,门G3输出1,门G2打开,放行CP信号,计数器在CP作用下,继续累计计数。当定时时间到时, 2=0,门G2关闭,封锁CP信号,计数器保持零状态不变。
三、调试
做完板后发现暂停有毛刺现象,故补充另一开关来控制暂停,效果好转。以下是其电路:
四、后语
不足:本电路设计简单,而且能很好地达到设计要求,但由于555产生的脉冲精确值比较低,这是本电路最大的不足。
改进方法:可以使用晶振,然后进行分频(如用4060)。