篮球比赛30秒倒计时器的设计

上传人:M****1 文档编号:488078061 上传时间:2023-11-07 格式:DOCX 页数:7 大小:26.94KB
返回 下载 相关 举报
篮球比赛30秒倒计时器的设计_第1页
第1页 / 共7页
篮球比赛30秒倒计时器的设计_第2页
第2页 / 共7页
篮球比赛30秒倒计时器的设计_第3页
第3页 / 共7页
篮球比赛30秒倒计时器的设计_第4页
第4页 / 共7页
篮球比赛30秒倒计时器的设计_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《篮球比赛30秒倒计时器的设计》由会员分享,可在线阅读,更多相关《篮球比赛30秒倒计时器的设计(7页珍藏版)》请在金锄头文库上搜索。

1、篮球比赛30秒倒计时器的设计 【摘 要】篮球比赛30秒钟规则规定:进攻球 队在场上控球时必须在30秒钟内投篮出手(NBA比赛为24秒,全美大学体育联合 会比赛中为35秒,因此在比赛时裁判既要看比赛又要看秒表计时,而本文介绍的 30秒倒计时器可以解决此问题。【关键词】AT89C51单片机、30秒倒计时器、LED30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制 计时器的计时开始、复位和暂停。倒计时器初始状态显示“30:当裁判员按下计时键,30秒倒计时开始,当计时器时间减到 0时,计时器发出声光报警,提示裁判

2、 计时时间已到。、电路设计30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。图1 30秒倒计时器电路原理图1、按键输入“3眇倒计时器”采用了三个按键来完成计数器的启动计数、复位、暂停/继续计数等功能。(1) K1键:启动按钮(P3.2)。按下K1键,计数器倒计时开始,数码管显示数字从 30开始每秒递减计数, 当递减到到零时,报警电路发出声、光报警信号。当计数器处于暂停状态时按下 K1键将回到计时状态。(2) K2键:复位按钮(P3.3)。按下K2键,不管计数器工作于什么状态,计数器立即复位到预置值“30”在,报警状态时按

3、下K2键还可取消报警。(3) K3键:暂停/计时切换按钮(P3.4)。当计数器处于计时状态时按下该键计数器暂停计时,数码管显示数字保持不 变;当计数器处于暂停状态按下该键计数器将回到计时状态;初始状态时该键无 效。2、显示驱动电路“3眇倒计时器”用两个共阳数码管来显示时间,数码管显示方式为动态显 示。显示驱动电路中,数码管的段码引脚通过 470欧的电阻接到单片机的P1 口, 两个片选引脚各通过一个9012连接到正5V电源,由P3.0和P3.1控制。4、报警电路计时时间减到0,显示数码管显示“00时,发光二极管D1由P3.5控制发出光 报警,同时蜂鸣器由P3.7控制发出声报警。、软件编程思路1、

4、全局变量“3眇倒计时器”动作流程主要受三个全局变量控制。首先是 bit变量“act”当 “ac的”1时倒计时开始,为“0寸倒计时停止,“ac初值为“0;可以由按钮操作 将其置“1或清0;第二个全局变量是char变量“time,”存放倒计时的时间,当倒 计时时间为0时,发出声光报警。变量 “time的初值为30,定时中断服务程序在 “ac的1时,每1s对其进行减1操作,减到0时保持为0,按下 复位键”可将 “timeg位为30。第三个全局变量是int变量“t,”记录响应定时中断0的次数。根 据初始化定义,定时器0以方式1工作,每1ms发出一次中断请求。控制程序只 开放了定时器0中断,因此不会有比

5、定时器0中断更高级的中断被允许,所以每次 请求都会立刻被响应。响应后在中断服务程序中将全局变量“t加1记录响应中断次数,每响应1000次即为1秒钟。变量“t初值为0,在中断服务程序中加1,当 “小2000时由中断服务程序清00在按键驱动程序中,按下启动键、复位键、暂停/启动键时将“t满0,目的是从0ms开始计时。2、控制流程主程序主要用来检测全局变量 “time当“time为0时发出 声光报警。按键驱 动、显示驱动和“time作都在定时器0中断服务程序中进行。其控制流程如图 2 所示。图2控制流程图三、软件程序设计1、数码管驱动程序到计时器的两个数码管以动态显示的方式显示计时时间“time”(

6、全局变量),LED1显示“time的十位,LED2显示“time的个位。(1)定义段码数据口和片选信号根据实际电路,在C51中定义段码的数据口为P1,两个片选信号为P3.0和P3.1。定义如下:#define duan P1sbit wei1=P3A0;sbit wei2=P3A1;(2)定义字形码LED显示数字09以及全灭的字形码表格放在数组 zixing口中。字形码是固定的表格,定义时加上关键字“code蓑示该表格存放在程序存储器中。unsigned char code zixing=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xf

7、f ;(3)定义数码管LED1和LED2的显示变量为了增加驱动程序的可移植性,笔者为数码管LED1和LED2定义了显示变量。显示变量就是本驱动程序的对外接口,外部程序只要 改变显示变量的值就可改变数码管显示的数值。定义方式如下:unsigned char led_str2=10,10;led_str0直接对应数码管LED1, led_str1直接对应数码管LED2。本项目中由 专门的子程序将全局变量time计算拆分成led_str0和led_str1。void js(led_str1=time/10%10; led_str0=time%10; (4)数码管驱动程序 数码管驱动 程序“void

8、chushi(char在定时中断服务程序中 被调用执行。根据初始化程序的定 义,定时中断服务程序每1ms被执行一次。定时中断服务程序中运用全局变量“t记录进入该 服务程序的次数,”料涉2000由定时中断服务程序清零。数码管驱动程序的参数“char是用来确定当前点亮的是 LED1还是LED2 ,当参数为“0时 点亮LED1,参数为“1时点亮LED2。如果我们希望偶数次进入定时中断服务程 序时点亮LED1,奇数次进入定时中断服务程序时点亮LED2,我们可以 用程序调用语句“chushi(t%2 ”轻松实现。进入数码管驱动程序后首先调用子函数js(,计算当前的led_str0和led_str1。接下

9、来将两个数码管全部熄灭以防止余晖的出现 最后点亮需要点亮的数码管并送出字型码。驱动程 序代码如下:void chushi(cha门 js(; duan=0xff; wei1=i; wei2=!i; 计算显示变量/去余晖/确定片选/送字型码 duan=zixingled_stri; 2、按键驱动程序按键驱动程序分为按键识别和按键功能执行两部分。按键功能执行可在按键按下时或按键抬起后执行,文中将其设计在按键抬起后执行。(1)定义按键I/O地址根据实际电路,三个按键(启动键、复位键、暂停/启动键)分别接在P3 口的P3.2, P3.3和P3.4三个引脚上。为了取键值 方便还将P3 口定义为“ioke

10、y,”程 序中可作定义如下:#define iokey P3 sbit key1=P3A2; sbit key2=P3A3; sbitkey3=P3A4; (2)按键驱动流程 按键识别的通用流程为: 口写“1”判断有无键按 下一延I/O时去抖一确定键值一等待按键抬起一执行按键功能。按键驱动 程序中 定义了两个静态变量“ts和“kv;分别用来延时去抖和 存放键值。(3)延时去抖 静态变量“t邮来延时去抖。按键驱动程序在定时中断服务程序中每1ms被执行一遍,每检测到有键按下1,检测到无键按下“ts 0。按键连续按下20ms, 则连续20次执行按键驱动程序时都检测到有键按下,此时静态变量“tsi加到

11、20,可确认按键按下有效。为防止按键一直按着不放而使“t嚓加到溢出,确认有键按下后可使“ts的值保持为20,或大于20的某一个值如21。(4)取键值确认有键按下后即可通过读取按键的I/O 口状态来得到键 值。为读取P32 P3.3和P3.4弓I脚状态,屏蔽P3 口其他引脚 的影响,可将读取后的数值按位或上 11100011B (0xE3)再送给静态变量“kv:静态变量”kv存放按键的键值,无键 按下或按键抬起后kv的值为00按下启动键key1时kv=11111011B (0xFB),按 下 复位键key2时kv=11110111B (0xF7),按下暂停/启动键key3时 kv=1110111

12、1B (0xEF)。(5)执行按键功能 按键抬起后第一次执行按键驱动程序时,静态变量“kv任保持着按键按下时最后得到的键值,以该键值作为参数调 用按键执行程序“actkey(kv ”即可执行按键功能。调用后kv值立刻清0,确保按 一次键执行一次按键功能。驱动程序代码如下:void key( static unsigned charkv=0; static unsigned char ts=0; key1=1;key2=1;key3=1; if(!(key1&key2&key3 ts+; if(ts=20ts=20; /有键按下 if(ts=20 kv=iokey|0xe3; /取键值 else

13、 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取反。每按一个按钮都有将全局变量九满0的操作,目的是每当复位、或启动计时时,进入定时中断的次数都从0开始计算,否则会 出现第1秒计时不准确的现象。程序代码如下:void actkey(unsigned char k switch(k case0xfb:act=1;t=0;break; case 0xf7:time=30;t=0; break; case 0xef:act=act;t=0; break; 阮 键按下或按键已抬起四、结束语 本文在编程过程中以面向对象的编程思路封装了两个LED数码管和三个独立按键。当其驱动程序在定时中断服务程序中被调用,编程者只要操作其接口:数组led_str2和函数“actkey(unsigned char k无需直接对硬件进行 编程即可改变功能,增强了软件的通用性和可移植性。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号