篮球赛计时计分器
基于单片机的篮球计时计分器设计设计

基于单片机的篮球计时计分器设计设计篮球计时计分器是一种用于篮球比赛计时和计分的设备。
基于单片机的篮球计时计分器设计可以实现自动计时、计分、显示比分等功能,使得篮球比赛更加准确和便捷。
本文将介绍基于单片机的篮球计时计分器的设计和实现。
设计思路:基于单片机的篮球计时计分器主要由显示模块、计时模块、计分模块、控制模块等组成。
其中,显示模块用于实时显示比赛时间和比分情况;计时模块用于计时并显示剩余时间;计分模块用于记录比赛双方的得分情况;控制模块用于整合各个模块的功能和控制比赛的进行。
首先,我们需要选择一款适合的单片机来实现篮球计时计分器。
一般情况下,AT89S52是比较常用的单片机,它具有较强的计算和控制能力,可以满足篮球计时计分器的需求。
接下来,我们需要确定显示模块的类型。
一种常见的显示模块是七段数码管,用于显示比赛时间和比分情况。
七段数码管可以通过单片机的IO口进行控制,显示时间和比分的变化。
计时模块可以通过在单片机中设置定时器来实现。
定时器可以定期产生一个中断信号,通过处理中断信号来实现计时功能。
可以设置定时器的初值和中断次数来实现精确的计时。
计分模块可以通过增加加减分按钮和设置相关的IO口来实现。
当按下加分按钮时,计分模块将调用相应的函数来增加得分;当按下减分按钮时,计分模块将调用相应的函数来减少得分。
计分模块还可以实现显示当前比分的功能。
控制模块是整个篮球计时计分器的核心模块。
通过对各个模块的控制和操作,实现比赛的正常进行。
控制模块还可以增加暂停和继续比赛的功能,通过设置相应的标志位来实现。
接下来,我们需要根据设计思路进行硬件电路的连接和单片机程序的编写。
硬件电路的连接包括七段数码管的连接、计时器连接、按钮连接等。
单片机程序的编写需要包括显示模块的控制程序、计时模块的中断处理程序、计分模块的加减分函数等。
最后,我们需要进行测试和优化。
测试可以通过模拟篮球比赛的环境,模拟时间和比分的变化,检查计时计分器的功能是否正常。
plc控制的篮球比赛计时计分器毕业设计

PLC控制的篮球比赛计时计分器毕业设计1. 介绍作为一种常见的体育比赛计时计分设备,篮球比赛计时计分器在提高比赛效率、记录比赛成绩、保障比赛公正方面发挥着重要作用。
本篇文章将围绕PLC控制的篮球比赛计时计分器毕业设计展开深入探讨,旨在从设计原理、实现方法、技术难点等方面全面解读该毕业设计的价值和意义。
2. 设计原理PLC(Programmable Logic Controller,可编程逻辑控制器)作为一种工业自动化控制系统,其具有可编程、灵活性强、可靠性高等特点,是控制篮球比赛计时计分器的理想选择。
设计中,借助PLC的输入/输出模块,可实现对比赛时间和比分的准确控制,提高计分器的稳定性和精准度。
3. 实现方法在PLC控制的篮球比赛计时计分器毕业设计中,需要考虑到计时和计分的同步性、实时性以及人性化的操作界面。
通过设计合理的程序逻辑,结合触摸屏等先进的人机界面技术,可以实现对比赛进程的全面监控和控制,确保比赛计时计分过程的准确无误。
4. 技术难点在该毕业设计中,存在着一些技术难点需要克服。
如何实现计时和计分的精准同步、如何应对突发情况下的异常处理、如何确保设备在长时间运行中的稳定性等。
这些都需要设计者具备扎实的PLC编程和控制技术,深入理解篮球比赛规则和实际比赛场景,以及对计时计分器硬件电路和结构设计的全面考量。
5. 总结回顾通过对PLC控制的篮球比赛计时计分器毕业设计的探讨,我们可以看到,其设计不仅仅是对技术的考验,更是对设计者对篮球比赛规则的理解和对工程实践能力的挑战。
设计者需要综合考虑技术、实用性和可靠性,为比赛的公正进行提供有力保障。
6. 个人观点对于这样的毕业设计,我认为设计者需要有扎实的技术功底,同时要善于思考和总结,关注实际应用中的细节和问题。
只有站在使用者的角度,深入了解比赛需求,才能设计出符合实际情况的篮球比赛计时计分器。
我对这样的毕业设计充满期待,并期待看到更多的优秀作品问世。
篮球比赛计时计分器

设计任务:1、显示内容,队名用英文名,3个大写字母20分队名1-A:队名2-B =xxx:xxx第x节剩余时间:XX分XX秒2、串口控制20分A+1% A队加1分,%为结束符A+2% A队加2分,%为结束符A+3% A队加3分,%为结束符B+1% B队加1分,%为结束符以此类推3、串口控制交换场地5分A-B% AB队交换4、20 分PAUSE% 计时暂停按键1-定义为PAUSE按键用ZLG7290RESTART%重新计时按键2-定义为RESTARTRESET%重新比赛按键3-定义为RESET5、存储近5场的成绩到AT24C02 格式:1-队名1队名2=90:100类推20分RECALL1% 提取存储的第1场成绩,在数码管上显示,只显示比分,串口传回队名+比分&整场结束,提示是否保存成绩,按键4-存储键按键5-放弃键15分源代码:接线说明:PSB-VCC RS-P1.0 RW-P1.1 P1.3-E INT-P3.2 TXD-P3.1 RXD-P3.0 SDA-P1.6 SCL-P1.7 I2C 总线的ABC》别接键盘的ABCD以程序为准凭记忆写出来的)主程序#include<reg51.h>#include<intrins.h>#include<string.h>#include<I2C.h>#include <ZLG7290.h>#define unchar unsigned char #define unit unsigned int #define Lcd_Bus P0#define unchar unsigned char unsigned char KeyValue,FlagINT; int ney;// 纪录第及场比赛sbit RS=P1A0;//LCD 显示屏sbit RW=P1A1;sbit E=P1A3;unchar code lcddata[]={"0123456789:"};unchar code duiming[]={'1','H','O','U',':','2','C','H','I','='};unchar bifen[7];unchar fen1;unchar fen2;unchar jie;unchar min;unchar sec;unchar control;unchar table[10];************** 延时函数***********************void delay(unsigned int t) { unsigned int i,j;for(i=0;i<t;i++) for(j=0;j<10;j++)/* ------------ 写命令到LCD ---------------------- */void write_com(unsigned char cmdcode) {//chk_busy();RS = 0; // 置零RW = 0;E = 1;Lcd_Bus = cmdcode;delay(10); // 在数据写入的时候加入适当的延时 E = 0;}/* ------------ 写数据到LCD ---------------------- */void write_data(unsigned char Dispdata){//chk_busy();RS = 1; // 写数据RW = 0;E = 1;Lcd_Bus = Dispdata;delay(10); // 在数据写入的时候加入适当的延时 E = 0;/******* 函数名称:Write_Char* 功能描述:写字符******/ void write_char(unsigned int num){// chk_busy();RS = 1;RW = 0;E = 1;Lcd_Bus = lcddata[num];E = 0;}/* ------------ 显示字符串----------------- */void hzkdis(unsigned char code *s){ while(*s>0){ write_data(*s);// 选择基本指令集 (30H )// 点设定,游标右移// 开显示控制 (无游标、不反白 )// 清除显示,并且设定地址指针为 00H //unchar duiming[]= "1-HOU:2-CHI";// 队名数组//unchar bifen[7];// 比分数组unchar k;// 记录第几场比赛void timer0init(void) {TMOD=0X21;TH0=0X31;TL0=0XB0;ET0=1;EA=1;TR0=1;//IT0=1;// EX0=1;}/***** 用作串口通信 ****/ void timer1init(void){TH1=0xf3;TL1=0XF3;SCON=0X50;EA=1;ES=1;TR1=1;}/**** 保存成绩 */void save(int ney){ s++;/* ------------ 初始化 LCD 屏 ----------------- */ /*** 用作计时***/void lcdreset() { write_com(0x30);delay(16); write_com(0x04);delay(16);write_com(0x0f); delay(16);write_com(0x01);delay(16);}(同时地址归为 )int i;unchar buff[7];// ney++;ZLG7290_Download(i,0,0,0X0A); bifen[2]=fen2/100;bifen[1]=(fen2%100-fen2%10)/10;bifen[0]=fen2%10;bifen[3]=0X1F;bifen[6]=fen1/100;bifen[5]=(fen1%100-fen1%10)/10;bifen[4]=fen1%10;for(i=0;i<7;i++){x24c02_write(i+7*ney,bifen[i]);}for(i=0;i<7;i++){buff[i]=x24c02_read(i+7*ney); delay(12);}for(i=0;i<7;i++){ZLG7290_Download(i,0,0,buff[i]);}/********** 将存储在at24c02 的数据通过串口通信发还给电脑**/ void fahuan(unsigned char k){unchar buff[7],i;for(i=0;i<10;i++){SBUF=duiming[i];while(!TI){;}TI=0;}for(i=0;i<7;i++){buff[i]=x24c02_read(i+7*k);delay(12);}for(i=0;i<7;i++){ZLG7290_Download(i,0,0,buff[i]);}for(i=6;i>3;i--){SBUF=buff[i]+48;while(!TI){;}TI=0;}SBUF=':';while(!TI){;}TI=0;SBUF=buff[2]+48;while(!TI){;}TI=0;SBUF=buff[1]+48; while(!TI){;} TI=0;SBUF=buff[0]+48; while(!TI){;} TI=0;P2=0xf0;}/**** 定时器中断用作计时**/ void timer0(void) interrupt 1 using 1 {static unchar count=0; unchar i;TH0=0X3C;TL0=0XB0; count++;if(count==20){count=0;sec--;if(sec==-1){sec=59; min--; if(min==-1) {if(jie<=3) {write_com(0x01); jie++;min=1; } else { // TR0=0;control=0; //save();}}}}/**** 主要用作显示比分**/void show_fen1(void){ write_com(0x80); hzkdis("2-CHI:1-HOU=");write_com(0x90); delay(16);write_char(fen2/ 100); delay(16);write_char((fen2%100-fen2% 10)/10); delay(16);write_char(fen2% 10); delay(16);write_char( 10 ); delay(16) ;write_char(fen1/ 100); delay(16);write_char((fen1%100-fen1% 10)/10); delay(16);write_char(fen1% 10); delay(16);}/**** 显示比分队名顺序相反**/void show_fen0(void){write_com(0x80);hzkdis("1-HOU:2-CHI=");write_com(0x90); delay(16);write_char(fen1/ 100); delay(16);write_char((fen1%100-fen1% 10)/10); delay(16);write_char(fen1% 10);write_char( 10 ); delay(16) ;write_char(fen2/ 100); delay(16); write_char((fen2%100-fen2%10)/10); delay(16);write_char(fen2% 10); delay(16);}/*** 显示时间**/void show_time(void){write_com(0x88);if(jie%10==1)hzkdis("第 1 节”);if(jie%10==2)hzkdis("第 2 节");if(jie%10==3)hzkdis("第 3 节");if(jie%10==4)hzkdis("第 4 节");write_com(0x8c);hzkdis("剩余时间");write_com(0x9a);delay(16);write_char( min / 10 );delay(16);write_char( min % 10 );delay(16);write_char( 10 );delay(16);write_char( sec / 10 );delay(16);write_char( sec % 10 );}void show(){write_com(0x80);hzkdis("是否保存成绩?”);write_com(0x90);hzkdis("y press butter 4"); write_com(0x88);hzkdis("n press butter 5 "); write_com(0x98);hzkdis(" ");}/***** 串口中断处理来自串口助手的命令*/ void chuanko() interrupt 4 {unchar i=0;unchar buff[]="wrong";while(1){ while(!RI);RI=0; if(SBUF=='%') break; table[i]=SBUF;i++;} if(table[0]=='A'&&table[1]=='+'&&table[2]=='1') fen1++;else if(table[0]=='A'&&table[1]=='+'&&table[2]=='2') {fen1++;fen1++;}else if(table[0]=='A'&&table[1]=='+'&&table[2]=='3') {fen1++;fen1++;fen1++;}else if(table[0]=='B'&&table[1]=='+'&&table[2]=='1')fen2++;else if(table[0]=='B'&&table[1]=='+'&&table[2]=='2'){fen2++;fen2++;}else if(table[0]=='B'&&table[1]=='+'&&table[2]=='3'){fen2++;fen2++;fen2++;}else if(table[0]=='A'&&table[1]=='-'&&table[2]=='B'){control=2;// 交换场地}elseif(table[0]=='P'&&table[1]=='A'&&table[2]=='U'&&table[3]=='S'&&table[4]=='E'){TRO=(~TRO);〃暂停}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='S'&&table[3]=='T'&&table[4]=='A'&&table[5]==' R'& &table[6]=='T'){TR0=0;min=11;sec=59;TR0=1;〃重新计时}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='S'&&table[3]=='E'&&table[4]=='T'){ timer0init();// TR0=0;min=11;sec=59;jie=1;fen1=0;fen2=0;TR0=1;〃重新开始write_com(0x01);control=1;}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='1'){ ZLG7290_Download(i,0,0,0X0E);fahuan(0);//shuma(1);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]=='L'& &table[6]=='2'){ fahuan(1);//shuma(2);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='3'){ fahuan(2);//shuma(3);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='4'){ fahuan(3);//shuma(4);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='5'){ fahuan(4);//shuma(5);}else{ for(i=0;i<6;i++) {SBUF=buff[i]; while(!TI); TI=0;/**** 外部中断初始化响应按键中断**/void SystemInit(){I2C_Init();EA = 0;IT0 = 1; // 负边沿触发中断EX0 = 1; // 允许外部中断EA = 1; // 等待ZLG7290 复位完毕}/***** 外部中断函数响应各个按键**/void INT0_SVC() interrupt 0 {unchar i; ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);// 显示键值DispValue(0,KeyValue); if(KeyValue==0x09) {TRO=(~TRO);//暂停} if(KeyValue==0x0a){TR0=0;min=11;sec=59;TR0=1;//重新计时} if(KeyValue==0x0b)timer0init(); write_com(0x01);TR0=0;min=11;sec=59;jie=1;fen1=0;fen2=0;control=1;TR0=1;〃重新开始} if(KeyValue==0x0c) { save(ney);ney++;timer0init();// 响应完中断记得重新初始化不然可能会出错timer1init();SystemInit();}main(){min=11;sec=59;fen1=0;fen2=0;jie=1;control=1;ney=0;timer0init();timer1init();lcdreset();SystemInit();//系统初始化while(1){if(control==1){show_fen0(); show_time();}if(control==0){show();// 比赛结束提示}if(control==2){show_fen1();// 交换场地show_time();}I2C.C标准80C51单片机模拟I2C总线的主机程序Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved.本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#i nclude "I2C.h"//定义延时变量,用于宏l2C_Delay()un sig ned char data I2C_Delay_t;/*宏定义:I2C_Delay()功能:延时,模拟I2C总线专用*/#defi ne I2C_Delay()\{\I2C_Delay_t = (I2C_DELAY_VALUE);\ while ( --I2C_Delay_t != 0 );\/*函数:I2C_I nit()功能:I2C总线初始化,使总线处于空闲状态说明:在main()函数的开始处,通常应当要执行一次本函数*/void I2C_I nit(){I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();/*函数:I2C_Start()功能:产生I2C 总线的起始状态说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态本函数也可以用来产生重复起始状态本函数执行后,I2C总线处于忙状态*/void I2C_Start(){I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SDA = 0;I2C_Delay();I2C_SCL = 0;I2C_Delay();} /* 函数:I2C_Write()功能:向I2C总线写1个字节的数据参数:dat:要写到总线上的数据*/ void I2C_Write(char dat){unsigned char t = 8;do{I2C_SDA = (bit)(dat & 0x80);dat <<= 1;I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I2C_Delay();} while ( --t != 0 );/*函数:I2C_Read() 功能:从从机读取 1 个字节的数据返回:读取的一个字节数据*/char I2C_Read(){char dat;unsigned char t = 8;I2C_SDA = 1; //在读取数据之前,要把SDA拉高do {I2C_SCL = 1;I2C_Delay();dat <<= 1;if ( I2C_SDA ) dat |= 0x01;I2C_SCL = 0;I2C_Delay();} while ( --t != 0 ); return dat;}/*函数:I2C_GetAck() 功能:读取从机应答位返回:0:从机应答1 :从机非应答说明:从机在收到每个字节的数据后,要产生应答位从机在收到最后 1 个字节的数据后,一般要产生非应答位*/bit I2C_GetAck(){bit ack;I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();ack = I2C_SDA; I2C_SCL = 0;I2C_Delay();return ack;/*函数:I2C_PutAck() 功能:主机产生应答位或非应答位参数:ack=O:主机产生应答位ack=1 :主机产生非应答位说明:主机在接收完每一个字节的数据后,都应当产生应答位主机在接收完最后一个字节的数据后,应当产生非应答位*/void I2C_PutAck(bit ack){I2C_SDA = ack;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I2C_Delay();}/*函数:I2C_Stop()功能:产生I2C 总线的停止状态说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态本函数执行后,I2C总线处于空闲状态*/void I2C_Stop(){unsigned int t = I2C_STOP_WAIT_VALUE;I2C_SDA = 0;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();while ( --t != 0 ); // 在下一次产生Start 之前,要加一定的延时} /*函数:I2C_Puts()功能:I2C总线综合发送函数,向从机发送多个字节的数据参数:SlaveAddr:从机地址(7位纯地址,不含读写位)SubAddr:从机的子地址SubMod:子地址模式,0—无子地址,1 —单字节子地址,2—双字节子地址*dat :要发送的数据Size:数据的字节数返回:0:发送成功1 :在发送过程中出现异常说明:本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0*/bit I2C_Puts(unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size){// 定义临时变量unsigned char i;char a[3];// 检查长度if ( Size == 0 ) return 0;// 准备从机地址a[0] = (SlaveAddr << 1);// 检查子地址模式if ( SubMod > 2 ) SubMod = 2;// 确定子地址switch ( SubMod ){case 0: break;case 1:a[1] = (char)(SubAddr);break;case 2:a[1] = (char)(SubAddr >> 8);a[2] = (char)(SubAddr);break;default: break;}// 发送从机地址,接着发送子地址(如果有子地址的话) SubMod++;I2C_Start();for ( i=0; i<SubMod; i++ ){I2C_Write(a[i]);if ( I2C_GetAck() ){I2C_Stop(); return 1;}}// 发送数据do{I2C_Write(*dat++);if ( I2C_GetAck() ) break;} while ( --Size != 0 );//发送完毕,停止I2C总线,并返回结果I2C_Stop();if ( Size == 0 ){return 0;}else{return 1;}}/*函数:I2C_Gets()功能:I2C总线综合接收函数,从从机接收多个字节的数据参数:SlaveAddr:从机地址(7位纯地址,不含读写位)SubAddr:从机的子地址SubMod:子地址模式,0—无子地址,1 —单字节子地址, *dat :2—双字节子地址保存接收到的数据Size:数据的字节数返回:0:接收成功1 :在接收过程中出现异常说明:本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0 */bit I2C_Gets(unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size){// 定义临时变量unsigned char i; char a[3];// 检查长度if ( Size == 0 ) return 0;// 准备从机地址a[0] = (SlaveAddr << 1);// 检查子地址模式if ( SubMod > 2 ) SubMod = 2;// 如果是有子地址的从机,则要先发送从机地址和子地址if ( SubMod != 0 ){//确定子地址if ( SubMod == 1 ){a[1] = (char)(SubAddr);}else{a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr);} //发送从机地址,接着发送子地址SubMod++;I2C_Start();for ( i=0; i<SubMod; i++ ){ I2C_Write(a[i]); if ( I2C_GetAck() ) {I2C_Stop();return 1;}}//这里的l2C_Start()对于有子地址的从机是重复起始状态//对于无子地址的从机则是正常的起始状态l2C_Start();// 发送从机地址l2C_Write(a[0]+1);if ( l2C_GetAck() ){l2C_Stop();return 1;}//接收数据for (;;){*dat++ = l2C_Read();if ( --Size == 0 ){ l2C_PutAck(1); break;} l2C_PutAck(0);}//接收完毕,停止I2C总线,并返回结果l2C_Stop();return 0;}/*ZLG7290.c数码管显示与键盘管理芯片ZLG7290的标准80C51驱动程序C文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved.本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/ #include "I2C.h"#include "ZLG7290.h" /*函数:ZLG7290_WriteReg()功能:向ZLG7290的某个内部寄存器写入数据参数:RegAddr:ZLG7290的内部寄存器地址dat :要写入的数据返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_WriteReg(unsigned char RegAddr, char dat){bit b;b = I2C_Puts(ZLG7290_I2C_ADDR,RegAddr,1,&dat,1); return b;}/*函数:ZLG7290_ReadReg()功能:从ZLG7290的某个内部寄存器读出数据参数:RegAddr:ZLG7290的内部寄存器地址*dat :保存读出的数据返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_ReadReg(unsigned char RegAddr, char *dat){bit b;b = I2C_Gets(ZLG7290_I2C_ADDR,RegAddr,1,dat,1); return b;}/*函数:ZLG7290_cmd()功能:向ZLG7290发送控制命令参数:cmdO :写入CmdBufO寄存器的命令字(第1字节) cmdl :写入CmdBufl寄存器的命令字(第2字节) 返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_cmd(char cmd0, char cmd1){bit b;char buf[2];buf[0] = cmd0;buf[1] = cmd1;b = I2C_Puts(ZLG7290_I2C_ADDR,ZLG7290_CmdBuf,1,buf,2); return b; }/* 函数:ZLG7290_SegOnOff()功能:段寻址,单独点亮或熄灭数码管(或LED)中的某一段参数:seg:取值0〜63,表示数码管(或LED)的段号b:0 表示熄灭, 1 表示点亮返回:0:正常1:访问ZLG7290时出现异常说明:在每一位数码管中,段号顺序按照“ a,b,c,d,e,f,g,dp ”进行*/bit ZLG7290_SegOnOff(char seg, bit b){char cmd;cmd = seg & 0x3F;if ( b ) cmd |= 0x80;return ZLG7290_cmd(0x01,cmd);}/*函数:ZLG7290_Download() 功能:下载数据并译码参数:addr :取值0〜7,显示缓存DpRamO〜DpRam7的编号dp:是否点亮该位的小数点,0 —熄灭,1—点亮flash:控制该位是否闪烁,0—不闪烁,1—闪烁dat :取值0〜31,表示要显示的数据返回:0:正常1:访问ZLG7290时出现异常说明:显示数据具体的译码方式请参见ZLG7290的数据手册*/bit ZLG7290_Download(char addr, bit dp, bit flash, char dat){char cmd0;char cmd1;cmd0 = addr & 0x0F;cmd0 |= 0x60;cmd1 = dat & 0x1F;if ( dp ) cmd1 |= 0x80;if ( flash ) cmd1 |= 0x40;return ZLG7290_cmd(cmd0,cmd1);} /*I2C.h标准80C51单片机模拟I2C总线的主机程序头文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#ifndef _I2C_H_ #define _I2C_H_#include <reg51.h>//模拟I2C总线的引脚定义sbit I2C_SCL = P1A6;sbit I2C_SDA = P"7;//定义I2C总线时钟的延时值,要根据实际情况修改,取值1〜255//SCL信号周期约为(I2C_DELAY_VALUE*4+15个机器周期#define I2C_DELAY_VALUE 12//定义I2C总线停止后在下一次开始之前的等待时间,取值1〜65535〃等待时间约为(I2C_STOP_WAIT_VALUE*8个机器周期//对于多数器件取值为 1 即可;但对于某些器件来说,较长的延时是必须的#defineI2C_STOP_WAIT_VALUE 120//I2C 总线初始化,使总线处于空闲状态void I2C_Init();void x24c02_write(unsigned char address,unsigned char info); unsigned charx24c02_read(unsigned char address); //unsigned char x24c02_read(unsigned char address);//I2C 总线综合发送函数,向从机发送多个字节的数据bit I2C_Puts(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod, char *dat, unsigned int Size);//I2C 总线综合接收函数,从从机接收多个字节的数据bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod, char *dat, unsigned int Size);#endif //_I2C_H_/*ZLG7290.h数码管显示与键盘管理芯片ZLG7290的标准80C51驱动程序头文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#ifndef _ZLG7290_H_#define _ZLG7290_H_#include <reg51.h> //ZLG7290 中断请求信号的引脚定义sbit ZLG7290_pi nINT = P3A2;II定义ZLG7290在I2C总线协议中的从机地址// 这是7 位纯地址,不含读写位#define ZLG7290_I2C_ADDR 0x38II定义ZLG7290内部寄存器地址(子地址)#define ZLG7290_SystemReg 0x00 II系统寄存器#define ZLG7290_Key 0x01 II 键值寄存器II#define ZLG7290_RepeatCnt 0x02 II 连击次数寄存器II#define ZLG7290_FunctionKey 0x03 II 功能键寄存器#define ZLG7290_CmdBuf 0x07 II 命令缓冲区起始地址#define ZLG7290_CmdBuf0 0x07 II 命令缓冲区0#define ZLG7290_CmdBuf1 0x08 //命令缓冲区 1//#define ZLG7290_FlashOnOff 0x0C //闪烁控制寄存器#define ZLG7290_ScanNum 0x0D //扫描位数寄存器#define ZLG7290_DpRam 0x10 // 显示缓存起始地址#define ZLG7290_DpRam0 0x10 //显示缓存0/#define ZLG7290_DpRam10x11 //显示缓存 1#define ZLG7290_DpRam2 0x12 //显示缓存 2#define ZLG7290_DpRam3 0x13 //显示缓存 3#define ZLG7290_DpRam5 0x15 //显示缓存 5#define ZLG7290_DpRam6 0x16 //显示缓存 6#define ZLG7290_DpRam7 0x17 //显示缓存7//向ZLG7290的某个内部寄存器写入数据bit ZLG7290_WriteReg(unsigned char RegAddr, char dat);//从ZLG7290的某个内部寄存器读出数据bit ZLG7290_ReadReg(unsigned char RegAddr, char *dat);//向ZLG7290发送控制命令bit ZLG7290_cmd(char cmd0, char cmd1);//段寻址,单独点亮或熄灭数码管(或LED)中的某一段bit ZLG7290_SegOnOff(char seg, bit b);//下载数据并译码bit ZLG7290_Download(char addr, bit dp, bit flash, char dat);〃闪烁控制指令(Fn应当是字节型)//Fn 的8 个位分别控制数码管的8 个位是否闪烁,0-不闪烁,1-闪烁#define ZLG7290_Flash(Fn) ZLG7290_cmd(0x70,(Fn))#endif //_ZLG7290_H_#include <reg51.h>#include <intrins.h>#include <I2C.h>//sbit dula=P2A6;//sbit wela=P2A7; unsigned char j,c;void de(unsigned char i) // 延时程序{for(j=i;j>0;j--)for(c=125;c>0;c--);}/*24C02 读写驱动程序*/void flash()// 短时间的延时,几微秒左右{ ; ;}void init() //24c02 初始化子程序{I2C_SCL=1;flash();I2C_SDA=1;flash();}void start() // 启动I2C 总线{I2C_SDA=1;flash();I2C_SCL=1;flash();I2C_SDA=0;flash();// scl=0;// flash();}void stop() // 停止I2C 总线{I2C_SDA=0;flash();I2C_SCL=1;flash();I2C_SDA=1;flash();}void writex(unsigned char j) // 写一个字节{ unsigned char i,temp;temp=j;for (i=0;i<8;i++){ temp=temp<<1; I2C_SCL=0; flash(); I2C_SDA=CY; flash(); I2C_SCL=1; flash();}I2C_SCL=0;flash();I2C_SDA=1;flash();} unsigned char readx() // 读一个字节{unsigned char i,z;I2C_SCL=0;flash();I2C_SDA=1;for (i=0;i<8;i++){ flash(); I2C_SCL=1; flash();if (I2C_SDA==1) j=1; else j=0;z=(z<<1)|j;// 先左移,然后在最低位读入值I2C_SCL=0;}flash();return(z);}void clock() //I2C 总线时钟响应{unsigned char i=0;I2C_SCL=1;flash();while ((I2C_SDA==1)&&(i<255))i++;I2C_SCL=0;flash();//////// 从24c02 的地址address 中读取一个字节数据///// unsigned charx24c02_read(unsigned char address) {unsigned char i; start();writex(0xa8);//A1 A2 A3 全部低电平// clock();writex(address);clock();start(); writex(0xa9);clock(); i=readx();stop(); de(10);return(i); }////// 向24c02 的address 地址中写入一字节数据info///// void x24c02_write(unsigned char address,unsigned char info) {EA=0;start(); writex(0xa8);clock(); writex(address);clock(); writex(info);clock();stop();de(50);。
毕业设计:篮球赛计时计分器设计

篮球赛计时计分器摘要单片机自20世纪70年代问世以来,以极为高的性价比受到人们的重视和关注,因此应用很广,进展专门快。
由于单片机的集成度高,功能强,通用性好,专门是它具有体积小、重量轻、能耗低、价钱廉价、靠得住性高、抗干扰能力强和利用方便等独特的优势,使单片机迅速取得了推行应用。
目前已经成为测量操纵应用系统中的优选机种和新电子产品的关键部位,许多用单片机做操纵的球赛计时计分系统也应运而生,如:用单片机操纵液晶显示(LCD)计时计分器,用单片机操纵LED七段显示器计时计分器等。
篮球计时计分器以单片机为核心,由计时器、计分器、综合操纵器等组成。
系统采纳模块化设计,主体分为计时显示模块、计分显示模块、按时报警、按键操纵键盘模块。
每一个模块的程序结构简单、任务明确,易于编写、调试和修改。
程序可读性好,对程序的修改可局部进行,其他部份可维持不变。
编程后利用Keil C51软件来进行编译,再将生成的HEX文件装入芯片中,采纳Proteus软件仿真,查验功能是不是能够正常实现,随后可用Protel99画出硬件电路图。
本设计中系统硬件电路要紧由以下几个部份组成:单片机AT89C51、计时电路、计分电路、报警电路和按键开关。
本次设计用由AT89C51编程操纵LED七段数码管作显示的球赛计时计分系统。
该系统具有赛程按时设置、赛程时刻暂停、及时刷新甲乙两边的成绩和赛后成绩暂存等功能。
它具有价钱低廉、性能稳固、操作方便而且易于携带等特点,普遍适合各类学校或小型集体作为赛程计时计分。
关键词:单片机,计时,计分,显示器,接口TIME BASKETBALL SCORING DEVICEABSTRACTSince the inception the 20th century 70 years, single-chip microcomputer (SCM) causes people’s attention and concern because of extremely cost-effective, so its application is very broad and rapid developing. SCM has many advantages, such as small size, light weight, anti-interference ability, less demanding on the environment, low cost, high reliability, good flexibility, developing more easily and so on. Now, it has become the preferred model in measurement control system and a key component of new electronic products. Many time scoring matches using SCM has also come into being, such as the timer with liquid crystal display (LCD), the timer with LED seven-segment display ,etc. Time basketball scoring device as the core of SCM includes the timer, scoring devices, integrated controller and other components.This system is used of the modular design, in which the main display module is divided into time display module, scoring display module, timing alarm module, and key control keyboard module. Program structure of each module is simple and clear. So it is easy to write, debug and modify. Because the program is readable, part of program can be modified and other parts may remain unchanged. After programming, firstly we can use Keil C51 software to compile and then generate the HEX file into the chip. Secondly we use the Proteus software simulation to test whether the normal function to achieve. Finally we draw the hardware circuit diagram with Protel99. The design of hardware circuit mainly consists of the five components, including AT89C51, timing circuit, scoring circuit, alarm circuit and key switch circuit.The design uses AT89C51 to program and to control LED digital tube for seven-segment display of match time scoring. The system has many features, such as setting the schedule time, scheduling time to pause, refreshing result ofboth parties timely, storing temporarily results after the match and so on. Because this system has low price, stable performance, and easy to operate and carry, it is widely suitable for all types of schools and small groups as the calendar time points.KEY WORDS:Microcontroller, Timing, Scoring, Display, Interface前言 (1)第1章系统方案说明 (1)方案选择 (2)篮球赛计时计分器设计的现状 (2)系统整体设计方案 (2)系统大体功能介绍 (3)第2章系统硬件电路设计 (6)篮球赛计时计分电路原理图 (6)篮球赛计时计分器电路工作进程 (6)系统硬件电路组成 (6)计时电路 (6)计分电路 (13)器件选择及介绍 (17)§2.4.1 AT89C51 (18)§2.4.2 CD4511芯片介绍 (21)§2.4.3 CD4094芯片的介绍 (22)§2.4.4 74LS21芯片介绍 (23)第3章软件编程及调试 (24)整体程序设计 (24)初始化程序设计 (25)计时系统程序设计 (26)计分系统程序设计 (27)系统调试 (28)软件调试 (28)仿真调试 (29)结论 (29)参考文献 (31)致谢 (32)附录 (33)随着单片机在各个领域的普遍应用,许多用单片机做操纵的球赛计时计分系统也应运而生,如用单片机操纵LCD液晶显示器[1]计时计分器,用单片机操纵LED七段显示器计时计分器等。
篮球比赛计分器的设计原理

篮球比赛计分器的设计原理
篮球比赛计分器的设计原理是基于计分规则和比赛规则来实现的。
设计原理如下:
1. 确定比赛规则:首先需要明确比赛规则,包括比赛时间、进球得分规则、罚球规则、犯规规则等。
2. 确定计分方式:根据比赛规则确定计分方式,通常包括两支队伍的得分和罚球数。
计分器需要能够根据比赛情况及时更新并显示得分。
3. 实时更新得分:根据比赛过程中的得分情况,计分器需要能够实时更新双方队伍的得分。
通常,计分器会设置按钮或触摸屏来记录各种得分情况,包括投篮得分、罚球得分以及技术犯规等。
4. 管控比赛时间:篮球比赛有固定的时间限制,计分器需要能够计时并显示比赛的进行时间。
同时,计分器也需要提供暂停和继续功能,以便于比赛管理。
5. 显示比赛结果:当比赛结束时,计分器需要能够显示比赛的最终得分和胜负结果。
部分计分器还会提供比赛统计数据,如得分最高球员、篮板球数量等。
综上所述,篮球比赛计分器的设计原理是基于比赛规则和计分方式来实时更新并显示比赛的得分情况,同时还需要提供计时、暂停和继续功能等。
篮球计时计分器

3.12 篮球计时计分器设计(8学时)一、设计原理该篮球计时计分器,由九个功能模块组成: 时钟产生模块、按键输入模块、系统的计时模块、24秒计时模块、数码管输出模块、led输出模块、计分模块、lcd输出模块、比分交换模块实现的主要功能:S1、S2分别用于两队比分的减1,S3、S4分别用于两队比分的加1,S5用于控制比赛的开始和暂停,S6用于24秒的重新置位,和进入下一节的显示切换,S7用于系统的复位,S8用于对比赛总时间减一分(调试时用,实际中不需要这个按键)。
液晶屏显示比分,数码管显示一节时间和24秒倒计时;当按下S7时,系统复位,液晶屏显示000:000 1st,数码管显示12 00 24;当按下S5时系统开始计时,若再按下S5则处于暂停状态;当24秒倒计时剩余时间小于一秒时,则显示为秒表计时方式;当24秒时间到了,则8个led灯全亮,比赛暂停,此时先按下S5再按S6则重新从24秒开始倒计时;当一节比赛结束时,8个led灯全亮,比赛暂停,此时先按下S5再按S6则进入下一节;当比赛进行到第三节时,则比分交换显示。
二、设计1、顶层图:2、各子模块及对应程序:(1)数码管输出模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity shumaguan isport( clk : in std_logic;ledag : out std_logic_vector(7 downto 0);del : out std_logic_vector(2 downto 0);m10 : in std_logic_vector(3 downto 0);m : in std_logic_vector(3 downto 0);s10 : in std_logic_vector(3 downto 0);s : in std_logic_vector(3 downto 0);s24_10 : in std_logic_vector(3 downto 0);s24 : in std_logic_vector(3 downto 0)); end shumaguan;architecture rtl of shumaguan issignal cq: std_logic_vector(3 downto 0);signal dount : std_logic_vector(2 downto 0);beginprocess(clk) --数码管动态扫描beginif(clk'event and clk='1' )thendount<=dount+1;end if;del<=dount;end process;process(dount,s24,s24_10,s,s10,m,m10)beginif(dount=0)thencq<=m10;elsif(dount=1)thencq<=m;elsif(dount=2)thencq<=s10;elsif(dount=3)thencq<=s;elsif(dount=4)thencq<="1111";elsif(dount=5)thencq<="1111";elsif(dount=6)thencq<=s24_10;elsif(dount=7)thencq<=s24;end if;end process;process(cq)--数码管显示begincase cq iswhen "0000" => ledag <="11000000";when "0001" => ledag <="11111001";when "0010" => ledag <="10100100";when "0011" => ledag <="10110000";when "0100" => ledag <="10011001";when "0101" => ledag <="10010010";when "0110" => ledag <="10000010";when "0111" => ledag <="11111000";when "1000" => ledag <="10000000";when "1001" => ledag <="10010000";when "1010" => ledag <="11111111";when "1011" => ledag <="11111111";when "1100" => ledag <="11111111";when "1101" => ledag <="11111111";when "1110" => ledag <="11111111";when "1111" => ledag <="11111111";when others => null;end case;end process;end rtl;(2)时钟产生模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity shizhong isport(clk:in std_logic;beep:out bit;clk_25hz,clk_100hz,clk_1khz:out std_logic); end shizhong;architecture rtl of shizhong issignal clk_100hz_s:std_logic;beginprocess(clk_100hz_s)variable q2:integer range 0 to 9;beginif(clk_100hz_s='1'and clk_100hz_s'event)then if(q2=3)thenclk_25hz<='1';q2:=q2+1;elsif(q2=4)thenclk_25hz<='0';q2:=0;else clk_25hz<='0';q2:=q2+1;end if;end if;end process;process(clk)variable q3:integer range 0 to 499999; beginif(clk='1'and clk'event)thenif(q3=499999)thenq3:=0;elseif(q3<250000)thenclk_100hz<='0';clk_100hz_s<='0';else clk_100hz<='1';clk_100hz_s<='1';end if;q3:=q3+1;end if;end if;end process;process(clk)variable q4:integer range 0 to 49999;beginif(clk='1'and clk'event)thenif(q4=49999)thenq4:=0;elseif(q4<25000)thenclk_1khz<='0';else clk_1khz<='1';end if;q4:=q4+1;end if;end if;end process;beep<='1';end rtl;(3)led输出模块library ieee;use ieee.std_logic_1164.all;entity led isport(ledin:in std_logic;ledout:out std_logic_vector(7 downto 0));end led;architecture rtl of led isbeginprocess(ledin)beginif(ledin='0')thenledout<="00000000";else ledout<="11111111";end if;end process;end rtl;(4)lcd输出模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity lcd isPort ( Clk : in std_logic; --状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间Aout_100,Aout_10,Aout,Bout_100,Bout_10,Bout: in std_logic_vector(3 downto 0);period:in std_logic_vector(2 downto 0);LCD_RS : out std_logic; --寄存器选择信号LCD_RW : out std_logic; --液晶读写信号LCD_EN : out std_logic; --液晶时钟信号LCD_Data : out std_logic_vector(7 downto 0)); --液晶数据信号end lcd;architecture Behav of lcd istype STATE_TYPE is (START,write_C,write_D,WRITE_BYTE_C,WRITE_BYTE_D,wait_3m1,wait_3m2,wa it_5m1,wait_5m2,wait_100m); --12个状态,START:初始化各信号量,write_C(write_D):判断初始化指令(显示数据)是否输出完毕,WRITE_BYTE_C (WRITE_BYTE_D):输出一个指令(数据),wait_3m1,wait_3m2,wait_5m1,wait_5m2,wait_100m:延时type MY_ARRAY_C is array(0 to 4) of std_logic_vector(7 downto 0); --初始化的数据(控制指令)type MY_ARRAY_D is array(0 to 11) of std_logic_vector(7 downto 0);constant c_d: MY_ARRAY_C:=(x"38",x"0c",x"06",x"01",x"C3");signal d_d: MY_ARRAY_D;signal STATE: STATE_TYPE:=START;signal w_c_flag : integer range 0 to 2:=0; --写指令时用到的标志 signal w_d_flag : integer range 0 to 2:=0; --写数据时用到的标志signal write_c_cnt : integer range 0 to 5:=0; --指令的指针signal write_d_cnt : integer range 0 to 12:=0; --数据的指针signal cnt : integer range 0 to 100:=0; --延时用到的计数器beginLCD_RW <= '0' ; --写数据d_d(0)<="0000"&Aout_100+x"30";d_d(1)<="0000"&Aout_10+x"30";d_d(2)<="0000"&Aout+x"30";d_d(3)<="00111010";d_d(4)<="0000"&Bout_100+x"30";d_d(5)<="0000"&Bout_10+x"30";d_d(6)<="0000"&Bout+x"30";d_d(7)<="00100000";d_d(8)<="00100000";d_d(9)<="00000"&period+x"31";d_d(10)<="01110011";d_d(11)<="01110100";process(Clk,STATE) --液晶驱动控制器beginif rising_edge(Clk) thencase STATE iswhen START=>LCD_EN<='0';w_c_flag<=0;w_d_flag<=0;write_c_cnt<=0;write_d_cnt<=0;STATE<=WRITE_C; --下一个状态(即要执行的)是WRITE_C(相当于跳转)when WRITE_C=>case write_c_cnt iswhen 0 to 4=> --小于5,五个初始化指令未输出完,则要输出STATE<=WRITE_BYTE_C;when 5=>write_c_cnt<=0; --等于5,五个初始化指令已输出完,转入数据输出STATE<=WRITE_D; --转入数据输出end case;when WRITE_BYTE_C=>if(w_c_flag=0) then --w_c_flag=0,通道选择,数据输出LCD_RS<='0';LCD_Data<=c_d(write_c_cnt);w_c_flag<=1;STATE<=wait_3m1; --延时elsif(w_c_flag=1) then --w_c_flag=1,使能en='1' LCD_EN<='1';w_c_flag<=2;STATE<=wait_5m1; --延时elsif(w_c_flag=2) then --w_c_flag=2,使能en='0' LCD_EN<='0';w_c_flag<=0;write_c_cnt<=write_c_cnt+1; --当前数据已输出完,write_c_cnt加一指向下一个数据,并转入下一个数据输出WRITE_CSTATE<=WRITE_C;end if;when WRITE_D=>case write_d_cnt iswhen 0 to 11=>STATE<=WRITE_BYTE_D;when 12=>write_d_cnt<=0;STATE<=wait_100m; --所有数据输出完毕 end case;when WRITE_BYTE_D=>if(w_d_flag=0) thenLCD_RS<='1';LCD_Data<=d_d(write_d_cnt);w_d_flag<=1;STATE<=wait_3m2;elsif(w_d_flag=1) thenLCD_EN<='1';w_d_flag<=2;STATE<=wait_5m2;elsif(w_d_flag=2) thenLCD_EN<='0';w_d_flag<=0;write_d_cnt<=write_d_cnt+1;STATE<=WRITE_D;end if;when wait_3m1=>if (cnt>=3) thenSTATE<=WRITE_BYTE_C;cnt<=0;elsecnt<=cnt+1;STATE<=wait_3m1;end if;when wait_5m1=>if (cnt>=5) thenSTATE<=WRITE_BYTE_C;cnt<=0;elsecnt<=cnt+1;STATE<=wait_5m1;end if;when wait_3m2=>if (cnt>=3) thenSTATE<=WRITE_BYTE_D;cnt<=0;elsecnt<=cnt+1;STATE<=wait_3m2;end if;when wait_5m2=>if (cnt>=5) thenSTATE<=WRITE_BYTE_D;cnt<=0;elsecnt<=cnt+1;STATE<=wait_5m2;end if;when wait_100m=>if (cnt>=100) thenSTATE<=START; --该轮次的所有数据(指令,显示)都已输出,回到START,开始新一轮的输出cnt<=0;elsecnt<=cnt+1;STATE<=wait_100m;end if;end case;end if;end process;end Behav;(5)24秒计时模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY jishi24_cnt10 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END jishi24_cnt10;ARCHITECTURE rtl OF jishi24_cnt10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt1_10 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt1_10;ARCHITECTURE rtl OF cnt1_10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=4;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=4;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt_2 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt_2;ARCHITECTURE rtl OF cnt_2 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 2;BEGINIF(res='1')THENq:=2;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=2;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=2;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mux1 isport(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec:in std_logic_vector(3 downto 0);s10_out:out std_logic_vector(3 downto 0);s_out:out std_logic_vector(3 downto 0);ctrl_1,ctrl_2:in std_logic;pause:out std_logic;res:in std_logic);end mux1;architecture rtl of mux1 isbeginprocess(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec,ctrl_1,ctrl_2)beginif(ctrl_1='1')thenif((s1_10<s10)or(s1_10=s10 and s1<=s))thens10_out<=s1_10;s_out<=s1;elses10_out<=s10;s_out<=s;end if;elsif(ctrl_2='1') thens10_out<=sec10;s_out<=sec;elseif(s1_10=0 and s1=0)thens10_out<=sec1_10;s_out<=sec1;elses10_out<=s1_10;s_out<=s1;end if;end if;end process;process(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec,ctrl_1,ctrl_2)beginif(res='1')thenpause<='1';elsif((s1_10=0 and s1=0 and sec1_10=0 and sec1=0)or((ctrl_1='1'orctrl_2='1')and s10=0 and s=0 and sec10=0 and sec=0))then pause<='0';else pause<='1';end if;end process;end rtl;(6)计分模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jifen_cnt10 isport(res,decA,decB,incA,incB:in std_logic;Aout,Bout:buffer std_logic_vector(3 downto 0);b_decA,b_incA,b_incB,b_decB:out std_logic);end jifen_cnt10;architecture rtl of jifen_cnt10 issignal alter_A,alter_B:std_logic;beginalter_A<=decA or incA;alter_B<=decB or incB;process(res,decA,incA)beginif(res='1')thenAout<="0000";b_decA<='0';elsif(alter_A='1'and alter_A'event)thenif(decA='1')thenif(Aout="0000")thenAout<="1001";b_decA<='1';elseAout<=Aout-1;b_decA<='0';end if;elsif(incA='1')thenif(Aout="1001")thenAout<="0000";b_incA<='1';elseAout<=Aout+1;b_incA<='0';end if;end if;end if;end process;process(res,decB,incB)beginif(res='1')thenBout<="0000";b_decB<='0';elsif(alter_B='1'and alter_B'event)thenif(decB='1')thenif(Bout="0000")thenBout<="1001";b_decB<='1';elseBout<=Bout-1;b_decB<='0';end if;elsif(incB='1')thenif(Bout="1001")thenBout<="0000";b_incB<='1';elseBout<=Bout+1;b_incB<='0';end if;end if;end if;end process;end rtl;(7)系统计时模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dectect isport(datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0); datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_sec10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_sec:IN STD_LOGIC_VECTOR(3 DOWNTO 0);discon:out std_logic;resetin:in std_logic;res:in std_logic;resetout:out std_logic;extra:out std_logic);end dectect;architecture rtl of dectect isbeginprocess(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thenresetout<='0';elsif(datain_m10="0000" and datain_m="0000" and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")then resetout<=resetin;else resetout<='0';end if;end process;process(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thenextra<='0';elsif(datain_m10="0000" and datain_m="0000" and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")then if(resetin='1'and resetin'event)thenextra<='1';end if;end if;end process;process(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thendiscon<='0';elsif(((datain_m10="0010" ANDdatain_m="0100")or(datain_m10="0011" AND datain_m="0110")or(datain_m10="0001" AND datain_m="0010")) and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")thenif(resetin='1' and resetin'event)thendiscon<='1';end if;elsif(((datain_m10="0010" AND datain_m="0011")or(datain_m10="0011" AND datain_m="0101")or(datain_m10="0001" AND datain_m="0001")) and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")thendiscon<='0';end if;end process;end rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt4 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END cnt4;ARCHITECTURE rtl OF cnt4 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 4;BEGINIF(res='1')THENq:=4;borrow<='0';ELSIF(reset='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=4;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt6 ISPORT(res,en,clk: IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt6;ARCHITECTURE rtl OF cnt6 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 5;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=5;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt10 ISPORT(res,en,clk: IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt10;ARCHITECTURE rtl OF cnt10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY conv ISPORT( discon:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);dataout_m10:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);dataout_m:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);extra:IN STD_LOGIC);END conv;ARCHITECTURE rtl OF conv ISBEGINPROCESS(datain_m10,datain_m)BEGINIF(extra='1')THENdataout_m10<=datain_m10;dataout_m<=datain_m;ELSIF((datain_m10="0001" AND datain_m<2)OR(datain_m10="0000")OR(datain_m10="0001" AND datain_m=2 AND discon='1'))THENdataout_m10<=datain_m10;dataout_m<=datain_m;ELSIF((datain_m10="0010" AND datain_m<4 AND datain_m>=2)OR(datain_m10="0001" AND datain_m>=2)OR(datain_m10="0010" AND datain_m=4 AND discon='1'))THENdataout_m10<=datain_m10-1;dataout_m<=datain_m-2;ELSIF(datain_m10="0010" AND datain_m<2)THENdataout_m10<="0000";dataout_m<=10+datain_m-2;ELSIF((datain_m10="0011" AND datain_m<6 AND datain_m>=4)OR(datain_m10="0010" AND datain_m>=4)OR(datain_m10="0011" AND datain_m=6 AND discon='1'))THENdataout_m10<=datain_m10-2;dataout_m<=datain_m-4;ELSIF(datain_m10="0011" AND datain_m<4)THENdataout_m10<="0000";dataout_m<=10+datain_m-4;ELSIF((datain_m10="0100" AND datain_m<=8 AND datain_m>=6)OR(datain_m10="0011" AND datain_m>=6))THENdataout_m10<=datain_m10-3;dataout_m<=datain_m-6;ELSIF(datain_m10="0100" AND datain_m<6)THENdataout_m10<="0000";dataout_m<=10+datain_m-6;END IF;END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ctrl ISPORT(res:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ctrl_1:OUT STD_LOGIC;ctrl_2:OUT STD_LOGIC);END ctrl;ARCHITECTURE rtl OF ctrl ISBEGINPROCESS(res,datain_m10,datain_m,datain_s10,datain_s)BEGINIF(res='1')THENctrl_1<='0';ctrl_2<='0';ELSIF((datain_m10="0000" AND datain_m="0000" )AND ((datain_s10="0010" AND datain_s<=4)OR(datain_s10="0001")OR(datain_s10="0000" AND datain_s>=1)))THENctrl_1<='1';ctrl_2<='0';ELSIF((datain_m10="0000" AND datain_m="0000" )AND (datain_s10="0000" AND datain_s="0000"))THENctrl_1<='0';ctrl_2<='1';ELSEctrl_1<='0';ctrl_2<='0';END IF;END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY period ISPORT(res:IN STD_LOGIC;reset:IN STD_LOGIC;discon:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);period:out std_logic_vector(2 downto 0);extra:IN STD_LOGIC);END period;ARCHITECTURE rtl OF period ISSIGNAL period_s:STD_LOGIC_VECTOR(2 downto 0);BEGINPROCESS(res,datain_m10,datain_m,extra,discon,RESET)BEGINIF(res='1')THENperiod_s<="000";ELSIF(extra='0')THENIF((datain_m10=1 AND datain_m<2)OR(datain_m10=0)OR(datain_m10=1 AND datain_m=2 AND discon='1'))THENperiod_s<="011";ELSIF((datain_m10=2 AND datain_m<4)OR(datain_m10=1 AND datain_m>=2)OR(datain_m10=2 AND datain_m=4 AND discon='1'))THENperiod_s<="010";ELSIF((datain_m10=3 AND datain_m<6)OR(datain_m10=2 AND datain_m>=4)OR(datain_m10=3 AND datain_m=6 AND discon='1'))THENperiod_s<="001";ELSIF((datain_m10=4 AND datain_m<=8)OR(datain_m10=3 AND datain_m>=6))THENperiod_s<="000";END IF;ELSIF(reset='0'AND reset'EVENT)THENperiod_s<=period_s+1;END IF;period<=period_s;END PROCESS;END rtl;(8)交换模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jiaohuan isport(Ain_100:in std_logic_vector(3 downto 0); Ain_10:in std_logic_vector(3 downto 0);Ain:in std_logic_vector(3 downto 0);Bin_100:in std_logic_vector(3 downto 0); Bin_10:in std_logic_vector(3 downto 0);Bin:in std_logic_vector(3 downto 0);period:in std_logic_vector(2 downto 0);Aout_100:out std_logic_vector(3 downto 0); Aout_10:out std_logic_vector(3 downto 0); Aout:out std_logic_vector(3 downto 0);Bout_100:out std_logic_vector(3 downto 0); Bout_10:out std_logic_vector(3 downto 0); Bout:out std_logic_vector(3 downto 0));end jiaohuan;architecture behav of jiaohuan isbeginprocess(Ain_100,Ain_10,Ain,Bin_100,Bin_10,Bin,period)beginif(period<=1)thenAout_100<=Ain_100;Aout_10<=Ain_10;Aout<=Ain;Bout_100<=Bin_100;Bout_10<=Bin_10;Bout<=Bin;elseAout_100<=Bin_100;Aout_10<=Bin_10;Aout<=Bin;Bout_100<=Ain_100;Bout_10<=Ain_10;Bout<=Ain;end if;end process;end behav;(9)按键输入模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY anjian ISPORT(S1,S2,S3,S4,S5,S6,S7,S8,clk2: IN STD_LOGIC;dec,pause,res,reset,decA,decB,incA,incB: OUT STD_LOGIC); END anjian;ARCHITECTURE behav OF anjian ISSIGNALres2,res1,re,incA2,incA1,incB2,incB1,decA2,decA1,decB2,decB1,pause2,p ause1,pause_s,pause_s1,reset2,reset1,dec1,dec2:STD_LOGIC;BEGINPROCESS(S7,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENres2<=res1;res1<=S7;END IF;re<=res1 AND (NOT res2) AND clk2;END PROCESS;PROCESS(S1,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENincA2<=incA1;incA1<=S1;END IF;incA<=incA1 AND (NOT incA2) AND clk2; END PROCESS;PROCESS(S2,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENincB2<=incB1;incB1<=S2;END IF;incB<=incB1 AND (NOT incB2) AND clk2; END PROCESS;PROCESS(S3,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdecA2<=decA1;decA1<=S3;END IF;decA<=decA1 AND (NOT decA2) AND clk2; END PROCESS;PROCESS(S4,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdecB2<=decB1;decB1<=S4;END IF;decB<=decB1 AND (NOT decB2) AND clk2; END PROCESS;PROCESS(S5,clk2)BEGINIF(clk2='0' AND clk2'EVENT) THENpause2<=pause1;pause1<=S5;pause_s<=pause1 AND (NOT pause2) AND clk2; END PROCESS;PROCESS(pause_s)BEGINIF(re='1')THENpause_s1<='0';ELSIF(pause_s='1'AND pause_s'EVENT) THEN pause_s1<=NOT pause_s1;END IF;pause<=pause_s1;END PROCESS;PROCESS(S6,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENreset2<=reset1;reset1<=S6;END IF;reset<=reset1 AND (NOT reset2) AND clk2; END PROCESS;PROCESS(S8,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdec2<=dec1;dec1<=S8;END IF;dec<=dec1 AND (NOT dec2) AND clk2;END PROCESS;END behav;三、引脚分配表四、设计结果当按下S7时,系统复位,液晶屏显示000:000 1st,数码管显示12 00 24当24秒时间到了,则16个led灯全亮,比赛暂停:。
单片机课程设计—篮球计时计分器

单片机课程设计—篮球计时计分器篮球作为一项广受欢迎的运动,其比赛的公平性和准确性至关重要。
而在篮球比赛中,计时计分器是不可或缺的设备,它能够为比赛提供准确的时间和比分信息,保障比赛的顺利进行。
本次单片机课程设计的任务就是设计一款篮球计时计分器,通过运用单片机的知识和技能,实现篮球比赛计时和计分的功能。
一、设计要求1、能够实现比赛时间的计时功能,包括 24 秒进攻时间、每节 10分钟的比赛时间以及加时赛时间。
2、能够实时显示比分,包括主队和客队的得分。
3、具备暂停、复位等功能,以应对比赛中的各种情况。
4、能够通过按键进行操作,简单易用。
二、系统方案设计1、硬件设计单片机选型:选择一款性能稳定、资源丰富的单片机,如STC89C52 单片机。
显示模块:采用数码管显示时间和比分,数码管具有亮度高、显示清晰、成本低等优点。
按键模块:使用独立按键实现计时、计分、暂停、复位等操作。
时钟模块:采用外部时钟芯片,为系统提供准确的时钟信号。
2、软件设计编程语言:选择 C 语言进行编程,C 语言具有语法简洁、可移植性好等优点。
程序流程:主程序负责系统的初始化、按键扫描、时间和比分的更新以及显示。
中断服务程序负责处理时钟中断,实现计时功能。
三、硬件电路设计1、单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振电路为单片机提供时钟信号,复位电路用于系统的初始化。
2、显示电路采用共阳极数码管,通过三极管驱动数码管的段选和位选信号,实现时间和比分的显示。
3、按键电路独立按键分别连接到单片机的 I/O 口,通过检测按键的状态来执行相应的操作。
4、时钟电路采用 DS1302 时钟芯片,通过单片机的 I/O 口与时钟芯片进行通信,获取准确的时间信息。
四、软件程序设计1、主程序首先进行系统初始化,包括单片机端口设置、数码管显示初始化、时钟芯片初始化等。
然后进入主循环,不断扫描按键状态,根据按键执行相应的操作,同时更新时间和比分,并将其显示在数码管上。
篮球赛计时计分器

篮球赛计时计分器作者:董敏学校:西南交通大学峨眉校区一、立项依据(包括项目的意义、国内外研究现状分析等)(一)项目概要本设计主要是针对于学校、单位、社区篮球赛等小型比赛,在之前的小型比赛中,比赛的计时计分分别采用的是电子表和分数布。
这样既浪费了大量的人力资源,也是比赛的分数和时间不能完美的展示给观众和参赛队员,看起来十分不方便。
本设计实现了计时计分的统一,使人们能更清楚的了解比赛的进程和情况。
篮球赛计时计分器的核心技术:单片机与集成电路的结合,通过编程让它在数码管上显示出比赛时间和双方的比分。
由无线电发射模块和接收模块来调控比分时间的开始和暂停。
(二)项目的背景和意义篮球比赛计时计分器是为了解决篮球比赛时计分与计时准确方便,灵活适用的问题。
篮球比赛在中国越来越受到人们的关注,同时也被更多的青少年所喜爱。
本设计除了具有赛程时间计时、调整及暂停和比赛计分的功能,还具有24s倒计时的功能,遥控操作功能。
且造价低廉、操作方便且便于携带,适合于学校和小团体作为比赛赛程的计时计分工具。
从另一方面说,本设计方便了人们比赛时的计时计分工作,在某种程度上也促进了篮球赛的开展,既有利于发展篮球这项体育运动,又有利于增强人们的体质。
另外参与篮球运动的人多了,也利于篮球运动员的选拔,对我们国家的篮球事业也具有促进作用。
(三)国内外研究的现状分析近年来,电子技术在国内飞速发展,篮球比赛也渗入到社会各个阶层,因此方便低廉的电子篮球赛计时计分器的研究具有很大的现实意义,将会受到广大篮球爱好者和社会的欢迎。
二、设计任务和要求及涉及的模块任务:设计一个适用于多种规格比赛的篮球比赛计时计分器。
要求:1、能记录整个赛程的比赛时间倒计时,并能随时实现暂停和继续。
2、能随时刷新甲、乙两队在整个过程中的比分。
3、中场交换比赛场地时,能自动交换甲、乙两队比分的位置。
4、比赛中场和结束时,能发出报警。
5、能够实现24s进攻时间倒计时,24s结束发出报警。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
硬件部分 原理图
• 系统硬件电路的组成
– – – – – 单片机AT89C52 按键开关 LCD1602显示 报警电路 L2对时间进行设置,按K1是对分 钟的十位数进行加1,到10时自动清零,按下K2时对分钟的个 位数进行加1调整,到10时自动清零。设置完后,按下K3, 进行倒计时,比赛开始。
开始
定时器清零 两队分数清零 设置时间 是否启动 Y 开始倒计时 时间到? N Y 暂停? N N
软件流程图
N
蜂鸣器响10s,LED闪10次 交换?
是否分数调整? Y 两队分数对应加减
N
Y 两队分数对换 队伍号交换
篮球赛计时计分器
篮球赛计时计分器系统图
时间设置按键 分数调整按键
LCD1602显示
暂停启动 AT89C52 复位 晶振 蜂鸣器 LED
系统说明
本系统采用AT89C52作为本设计的核心元件,利用LCD1602 作为显示器元件,显示的你内容包过队伍好、时间倒计时、两队的分 数记录,期中时间设置最长为99分钟,为半场时间,基本已经满足蓝 球赛的时间要求。分数范围为0~999分,也满足计分的需求。 时间设计在开始前设置,设置完按启动键完成,并开始倒计 时,分数调整为4个按键,在比赛的任何时刻能对两队分数的加减。 时间倒计时完毕,系统通过扬声器发出报警,时间为十秒, 同时LED闪烁10次。半场结束后,再对时间进行设置,按下启动后, 连队分数对换,队伍号也进行对换,时间进行倒计时!