篮球赛电子记分牌设计
- 格式:docx
- 大小:19.71 KB
- 文档页数:13
数字电子技术课程设计篮球比赛数字记分牌院系:机电工程专业:电子信息工程年级(班级):2013级(2)班姓名:叶庆缘学号: 20134082035指导教师:陈丽华完成日期: 2015 年 3 月 21日成绩:目录1 引言 (1)2 设计原理与方案 (1)2.1 设计任务与要求 (1)2.2 设计方案 (1)3 电路设计与调试 (2)3.1 模块设计 (2)3.1.1 计数\编码电路 (2)3.1.2 译码显示电路 (2)3.1.3 开关控制输入电路 (2)3.2 单元电路的设计 (3)3.2.1 计数\编码电路的设计 (3)3.2.2 译码\驱动\显示电路设计 (4)3.2.3 信号输入控制电路设计 (6)4 结论 (6)5 设计心得体会 (6)参考文献 (7)附录A 整体电路图 (8)附录B 元件清单 (9)附录C 实物图 (10)篮球比赛数字记分牌1 引言电子课程设计是电子技术学习中非常重要的一个环节,是将理论知识和实践能力相统一的一个环节,是真正锻炼学生能力的一个环节。
在许多领域中计时器均得到普遍应用,诸如在体育比赛,定时报警器、游戏中的倒时器,交通信号灯、红绿灯、行人灯、交通纤毫控制机、还可以用来做为各种药丸,药片,胶囊在指定时间提醒用药等等,由此可见计时器在现代社会是何其重要的。
而对于体育的兴趣我就选择了篮球记分牌这个题目,所以有这样一个机会的我真的很兴奋同时我也有机会提升自己在数字电路中理论的能力.2 设计原理与方案2.1 设计任务与要求2.1.1设计篮球比赛数字计分牌,以达到以下要求:1.分别记录两队得分情况;2.进球得分加2分,罚球进球得分加1分;3.纠正错判得分减2分或1分;4.分别用三个数码管显示器记录两队的得分情况。
2.2 设计方案1、篮球比赛数字计分牌要求能分别记录两队的得分的情况,可清零重新开始比赛,所以设置一开关用来复位。
2、计分牌由百、十、个位组成,用LED数码管(共阴)显示,配用相应译码器CD4511。
篮球记分牌1、项目名称:单片机篮球记分牌2、项目要求:实现为比赛的两个队计分,计时,中场暂停时蜂鸣器报警功能。
其中,加分可以实现每次加一分,两分和三分。
每个队加分时都有相应的指示灯点亮。
3、设计内容本设计是基于AT89C51单片机的篮球计时计分器,利用7段共阴LED作为显示器件。
在此设计中共接入了1个四位一体7段共阴LED显示器,1个四位一体7段共阴LED显示器,一个用来记录赛程时间,每次计时时间设置为2分钟。
另外一个数码管用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。
赛程计时采用正计时方式,比赛开始时启动计时,直至计时到到2分钟为止。
其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了四个按键,用于加一分,加两分,加三分和切换甲乙两队的加分等功能。
采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。
本篮球计时计分器主要包括单片机控制系统、计时显示模块、计分显示模块、定时报警,按键控制键盘模块。
通过这几个模块的协调工作就可以完成相应的计时计分控制和显示功能。
这四个模块的相互连接如下图(图1)所示:4、芯片简介:AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
长沙学院课程设计说明书题目篮球比赛电子记分牌设计一、课题名称 (2)二、............................................. 设计容 2三、设计思路 (2)1、整体设计思路: (2)2、整体设计流程: (2)四、设计说明 (2)1、设计程序 (3)2、引脚分配设置: (9)3、功能描述 (10)五、设计心得 (10)六、参考文献 (11)一、课题名称篮球比赛电子记分牌设计二、设计容设计一个篮球比赛记分牌,使用4位数码管显示倒计时的分钟、秒钟值;2位数码管显示A方得分;2位数码管显示B方得分;使用LED灯作为上、下半场的标志;单次加分值包括1分、2分和3分;半场时间到输出3秒的声光提示;可进行比赛暂停、比赛加时等操作;终场时间到输出 5 秒的声光提示。
三、设计思路1、整体设计思路:根据设计容,可将设计将分为五个模块来设计:分频计数模块、时间模块、加分模块、动态扫描显示模块、LED灯模块。
2、整体设计流程:(1)、分频计数模块:通过分频模块,将试验箱自带的50MHZ勺频率分频得到1MZ 以及1HZ的频率(2)、时间模块:将计时器的分钟、秒钟,通过借位的方式设计成40分钟的倒计时时钟(3)、加分模块:通过拨盘开关的选择,输入 A B队的比赛得分(4)、动态扫面显示模块:通过1MHZ的频率,将时间以及A、B队的比赛得分同时扫描显示在数码管上(5)、LED灯模块:对上下场的显示,以及比赛结束的灯亮延长显示四、设计说明led_h_e nd:out std_logic;半场结束延时亮灯输出led_f_e nd:out std_logic);全场结束延时亮灯输出1、设计程序 library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_ un sig ned.all; use ieee.std_logic_arith.all; en tity baseketball is port(clk:in std_logic; dui jia fen xin hao start,addtime,add1_A,add2_A,add3_A,add1_B,add2_B,add3_B: in std 」o gic;--A\B 比赛开始,A.B 队加分信号 stop:i n std_logic; 比赛暂停 led7s_selout:out std_logic_vector(7 dow nto 0);- 数码管位选 led7s:out std_logic_vector(6 dow nto 0); --7 上半场亮灯显示 段数码显示管 led_up:out std_logic;led_dow n:out std_logic;下半场亮灯显示 end; architecture one of baseketball is con sta nt time_m :in teger:=9; 时间分位初始化con sta nt time_s :in teger:=59; 时间秒位初始化 signal time_m0:integer range 0 to 9;- 分位时间围signal time_s0:integer range 0 to 59;-- 秒位时间围 sig nal cout_A,cout_B:i nteger range 0 to 99;-- sig nal clk0_1,clk0_1M:std 」ogic; --1HZ\1MHZ 比分计数围 信号sig nal q0_1:i nteger range 0 to 24999999; --1HZ 分频计数围 sig nal q0_1M:i nteger range 0 to 25; --1MHZ 分频计数围sig nal half_e nd,full_e nd,add_e nd:std_logic;-- 上下半场结束信号 signal r,a,b,c,d,e,f,g,h:integer range 0 to 9;-- 扫描显示加载信号 sig nal q1:i nteger range 0 to 7; 动态扫描显示信号围sig nal q_3:i nteger range 0 to 3; --s 半场比赛结束延时提示 sig nal q_5:i nteger range 0 to 5; 全场比赛结束延时提示 sig nal q_t_m:i nteger range 0 to 1;- 秒借位sig nal q_t_s:i nteger range 0 to 1;- 分借位 begin process(clk) -- 1MHZ 频率beginif clk'eve nt and clk='1' the nif qO_1M=25 thenq0_1M<=0;clk0_1M<=not clk0_1M;else qO_1M<=qO_1M+1;end if;end if;end process;process(clk) -- 1HZ 频率beginif clk'eve nt and clk='1' the nif q0_仁24999999 thenq0_1<=0;clk0_1<=not clk0_1;elseq0_1<=q0_1+1;end if;end if;end process;process(clk0_1,clk)-- 时间模块beginif clk0_1'eve nt and clk0_1='1' the nif start='1' the nif half_e nd='O' and full_e nd='O' thentime_s0<=time_s;led_up<='1';if time_m0=0 and time_s0=0 the ntime_m0<=time_m; led_up<='0';half_e nd<='1';elsif time_s0=0 thenq_t_m<=1; time_mO<=time_mO-q_t_m;elseq_t_s<=1;time_sO<=time_sO-q_t_s;end if;end if;if half_e nd='1' and full_e nd='O' thentime_s0<=time_s;led_dow n<='1';if time_m0=0 and time_s0=0 the ntime_m0<=time_m;led_dow n<='0';full_e nd<='1';elsif time_s0=0 the nq_t_m<=1;time_m0<=time_m0-q_t_m; elseq_t_s<=1; time_s0<=time_s0-q_t_s;end if;end if;end if;if addtime='1' and full_e nd='1' the n--比赛计时if add_e nd='O' the ntime_s0<=time_s;if time_m0=0 and time_s0=0 the ntime_m0<=time_m;add_e nd<='1';elsif time_s0=0 the nq_t_m<=1;time_m0<=time_m0-q_t_m; elseq_t_s<=1; time_s0<=time_s0-q_t_s;end if;end if;end if;if stop='1' the nhalf_e nd<='0';full_e nd<='0';add_e nd<='0:end if;end if;end process;process(add1_A,add2_A,add3_A) --A begin if add1_A='1' the ncout_A<=cout_A+1;end if;if add2_A='1' the ncout_A<=cout_A+2;end if;if add3_A='1' the ncout_A<=cout_A+3;end if;if stop='1' the ncout_A <=0;end if;end process;process(add1_B,add2_B,add3_B) --B begin if add1_B='1' thencout_B<=cout_B+1;end if;if add2_B='1' the ncout_B<=cout_B+2;end if;if add3_B='1' the ncout_B<=cout_B+3;end if;if stop='1' the n对加分模块对加分模块cout_B <=0;end if;end process;process(clkO_1M,q1)beginif clkO_1M'eve nt and clk0_1M='1' the nif q1=7 the nq1<=0;else q1<=q1+1;end if;end if;end process;process(q1,a,b,c,d,e,f,g,h)-- 动态扫描显示模块begina<=time_m0/10;b<=time_mO rem 10;c<=time_s0/10;d<=time_s0 rem 10;e<=cout_A/10;f<=cout_A rem 10;g<=cout_B/10;h<=cout_B rem 10;case q1 iswhen 0 => Ied7s_selout<="00000001"; r<=a;when 1 => Ied7s_selout<="00000010"; r<=b;when 2 => Ied7s_selout<="00000100"; r<=c;when 3 => Ied7s_selout<="00001000"; r<=d;when 4 => Ied7s_selout<="00010000"; r<=e;when 5 => Ied7s_selout<="00100000"; r<=f;when 6 => Ied7s_selout<="01000000"; r<=g;when 7 => Ied7s_selout<="10000000"; r<=h;whe n others => n ull;end case;end process;process(r)begincase r iswhen 0=>led7s<="1000000"; whe n 1=>led7s<="1111001";when 2=>led7s<="0100100";when 3=>led7s<="0110000";when 4=>led7s<="0011001";when 5=>led7s<="0010010";when 6=>led7s<="0000010";when 7=>led7s<="1111000";when 8=>led7s<="0000000";when 9=>led7s<="0010000";when others => n ull;end case;end process;process(clk0_1,half_e nd,full_e nd)-- 上下半场灯亮延时提示beginif clk0_1'eve nt and clk0_1='1' the nif half_e nd='1' thenif q_3=3 thenled_h_e nd<='0';else q_3<=q_3+1;led_h_e nd<='1';end if;end if;if full_e nd='1' the nif q_5=5 the nled_f_e nd<='0';else q_5<=q_5+1;led_f_e nd<='1';end if;end if;if stop='1' the nq_3<=0;q_5<=0;end if;end if;end process;en d;2、引脚分配设置:3加载程序至试验箱,打开拨盘开关1比赛开始,LED灯1灭,进行上半场比赛,8个数码显示管依次显示09590000,比赛时间一共10分钟,前四位为时间显示每一秒减计数一次;第五位和第六位为A对比赛分值,当拨动拨盘开关3、4、5时,数码管相应显示加1分、2分、3分;第七位和第八位为B对比赛分值,当拨动拨盘开关6、7、8时,数码管相应显示加1分、2分、3分;打开把盘开关2,比赛暂停,恢复以后比赛继续进行。
广东石油化工学院课程设计说明书课程名称:数字电子技术课程设计题目:篮球比赛电子记分牌学生姓名:专业:班级:学号:指导教师:日期:年月日篮球比赛电子记分牌一、设计任务与要求设计一个符合篮球比赛规则的记分系统。
(1)有得1分、2分和3分的情况,电路要具有加、减分及显示的功能。
(2)有倒计时时钟显示,在“暂停时间到”和“比赛时间到”时,发出声光提示。
(3)有比赛规则规定的其他计时、记分要求。
二、方案设计与论证整个电路分为倒计时,记分牌,持球与暂停秒牌,加时与中场休息。
倒计时部分:总比赛时间为40分钟,分4个小节,每节10分钟,需要用到4个十进制计时器;记分牌可以根据情况分别加1分2分3分,所以需要3个脉冲分路,同时添加一个减法器,以解决误判情况;设置一个时间暂停,暂停灯会亮,在比赛进行时,设置一个持球时间倒计时,持球结束可以重置为零,若持球时间到,要有灯提示电路框图为三、单元电路设计与参数计算74LS192输入输出清零置数加计数减计数数据QA QB QC QDCLR LOAD‵UP DOWN A B C D1 ×××××××0 0 0 00 0 ××d0 d1 d2 d3 d0 d1 d2 d30 1 ↑ 1 ××××递增计数0 1 1 ↑××××递减计数0 1 ↑ 1 ××××保持74LS160CLK CLR‵LOAD‵ENP ENT 工作状态×0 ×××置零↑ 1 0 ××预置数× 1 1 0 1 保持× 1 1 ×0 保持(但C=0)↑ 1 1 1 1 计数1.倒计时电路图如下如图所示,元件U1,U2,U3,U4是4个74LS192,而U5-U8是七段字符显示器。
湖南工程学院课程设计课程名称专业设计课题名称篮球比赛电子记分牌设计专业电子科学与技术班级1102 班学号************姓名指导教师李延平2014 年 5 月15 日湖南工程学院课程设计任务书课程名称专业设计课题篮球比赛电子记分牌设计专业班级电子科学与技术1102班学生姓名学号11指导老师李延平审批任务书下达日期2014 年 5 月 5 日任务完成日期2014 年5 月16 日目录一系统总体方案设计 (1)1 总体设计思路 (1)2 总体设计框图 (2)二软件仿真设计 (3)2.1 主程序设计 (3)2.1.1 设计思路 (3)2.1.2 流程图 (4)2.1.3 仿真总图 (5)2.2 键盘输入模块设计 (6)2.2.1 设计思路 (6)2.2.2 流程图 (7)2.2.3 仿真电路 (8)2.3 数码管显示模块设计 (8)2.3.1 设计思路 (8)2.3.2 流程图 (10)2.3.3 仿真电路 (10)三系统调试 (11)四总结与心得体会 (18)五参考文献 (19)六附录(源程序) (20)一系统总体方案设计1 总体设计思路本设计以STC89C52RC单片机为核心设计的篮球比赛电子记分牌。
本设计采用定时器T0中断计时,定时器T1中断分时显示比赛比分与比赛时间,并由6位八段共阴数码管显示(比赛时间显示只用四位)。
控制模块由4*4矩阵键盘输入控制,具有:开始暂停功能,对比赛分数加1、加2、加3、减1,中场切换显示比赛得分功能;对时间(加时赛)加1、减1功能。
提示模块由8个LED灯和蜂鸣器完成。
L0~L3亮表示上半场,L4~L7亮表示下半场,L0、L1、L6、L7亮表示加时赛,全亮表示半场(上半场、下半场或加时赛)结束;上半场时间到8个LED灯全亮3秒,蜂鸣器蜂鸣3秒;终场时间到8个LED灯全亮5秒,蜂鸣器蜂鸣5秒。
二软件仿真设计在本设计中,系统的软件设计采用了模块化的设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。
数字逻辑电路课程设计报告院(部):信息工程学院专业:通信工程班级:通信二班*名:***学号:***********成绩:指导老师:***开课时间:2016-2017 学年 2 学期课程设计任务书一、设计题目篮球记分牌二、主要内容1、分析设计题目的具体要求2、完成课题所要求的各个子功能的实现3、用multisim软件完成题目的整体设计三、要求完成的主要功能1、自选器件,要求甲乙双方各显示为三位数(可显示至百位)2、分别用三个按钮,给记分牌加减1、2、3分。
3、用一个开关实现加减控制4、每次篮球比赛计分后用一个开关给系统清零,使系统复位,准备下一次比赛实验。
四、进度安排第一天:介绍所用仿真软件;布置任务,明确课程设计的完整功能和要求。
第二天:消化课题,掌握设计要求,明确设计系统的全部功能,图书馆查阅资料。
第三天:确定总体设计方案,画出系统的原理框图。
第四天:绘制单元电路并对单元电路进行仿真。
第五天:分析电路,对原设计电路不断修改,获得最佳设计方案。
第六天:完成整体设计并仿真验证。
第七天:对课程设计进行现场运行检查并提问,给出实践操作成绩。
第八天:完成实践报告的撰写五、成绩评定课程设计成绩按优、良、中、及格、不及格评定,最终考核成绩由四部分组成:1、理论设计方案,演示所设计成果,总成绩20%;2、设计报告,占总成绩30%;3、回答教师所提出的问题,占总成绩30%;4、考勤情况,占总成绩20%;无故旷课一次,平时成绩减半;无故旷课两次平时成绩为0分,无故旷课三次总成绩为0分。
迟到20分钟按旷课处理。
篮球记分牌的设计专业班级:通信二班:学生姓名:陈俊达摘要:篮球比赛是根据参赛队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统。
篮球比赛的计时计分系统由计时器、计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,完善的篮球比赛计时计分系统设备应能够与现场成绩处理、现场大屏幕、电视转播车等多种设备相连,以便实现高比赛现场感、表演娱乐观众等功能目标。
数字逻辑课程设计(学年设计、学年论文)任务书数字电路设计说明书学院名称:班级名称:学生姓名:学号:题目:篮球比赛记分牌电路设计指导教师姓名:起止日期:2014.12.15--2015.1.10第一部分:正文部分一、选题背景电子课程设计是电子技术学习中非常重要的一个环节,是将理论知识和实践能力相统一的一个环节,是真正锻炼学生能力的一个环节。
在许多领域中计时器均得到普遍应用,诸如在体育比赛,定时报警器、游戏中的倒时器,交通信号灯、红绿灯、行人灯、交通纤毫控制机、还可以用来做为各种药丸,药片,胶囊在指定时间提醒用药等等,由此可见计时器在现代社会是何其重要的。
而对于体育的兴趣我就选择了篮球记分牌这个题目,所以有这样一个机会的我真的很兴奋同时我也有机会提升自己在数字电路中理论的能力.篮球比赛是根据参赛队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统。
篮球比赛的计时计分系统由计时器、计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,完善的篮球比赛计时计分系统设备应能够与现场成绩处理、现场大屏幕、电视转播车等多种设备相连,以便实现高比赛现场感、表演娱乐观众等功能目标。
随着科技的发展和人们生活水平的逐渐提高,各种有利于生活的电子产品开始逐步进入人们的生活。
数字记分牌的出现则代替了记分员人工翻动记分牌累计积分的繁琐劳动,使各种比赛进入了更智能、更高效、更精准的人机互动时代,在各种比赛中具有重要意义。
本次试验所设计的电路具有计分、减分及显示的功能。
当球队比赛得分时,用加法计分器通过控制分路加相应的分数。
如果裁判误判了,可用减法计数器减掉误判的分数。
设计要求记分部分包括加减两部分,故考虑双时钟输入的十进制计数器74LS192D。
74LS192D是同步十进制可逆计数器,为双时钟输入,具有同步清零和同步置数等功能。
用三片计数器和三个半导体数码LED进行对分数的统计和显示。
//文件名:My_func.h#ifndef MY_FUNC_H //防止重复定义#define MY_FUNC_H/*---------------头文件-----------------*/#include <reg52.h>#include <intrins.h>/*---------------宏定义-----------------*/#define PLAY_TIME 1#define ON 0#define OFF 1#define _MINUTE 1#define _SECOND 2#define _GRADE_A 3#define _GRADE_B 4#define LED_INIT() {LED_run = 1; LED_pause = 1; LED_end = 0;LED_shoot = 1;LED_exchg = 1; LED_error=1;}#define LED_RUN() {LED_run = 0; LED_pause = 1; LED_end = 1;}#define LED_PAUSE() {LED_run = 1; LED_pause = 0; LED_end = 1;}#define LED_END() {LED_run = 1; LED_pause = 1; LED_end = 0;}#define LED_EXCHG() {LED_exchg = !LED_exchg;}#define LED_SHOOT() {LED_shoot = 0; delay_ms(500); LED_shoot = 1;}#define LED_ERROR() {LED_error = 0; delay_ms(500); LED_error = 1;}#define TIMER_START() {TR0 = 1;} //启动T0#define TIMER_PAUSE() {TR0 = 0;} //暂停T0#define TIMER_LOAD() {TH0 = (65536-50000)/256; TL0 = (65536-50000)%256;}#define TIMER_INIT() {TMOD = 0x01; TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; EA = 1; ET0 = 1;}/*------------数据类型定义--------------*/typedef unsigned char uchar;typedef unsigned int uint;/*----------------位定义----------------*/sbit LED_run = P1^0;sbit LED_pause = P1^1;sbit LED_end = P1^2;sbit LED_shoot = P1^3;sbit LED_exchg = P1^4;sbit LED_error = P1^5;sbit SOUNDER = P1^6;sbit LE_duan = P2^0;sbit LE_wei = P2^1;/*----------------函数声明--------------*/extern void init (void);extern void delay_ms (uint xms);extern void sounder(void);extern uchar key_scan (void);extern void key_respond (void);extern void game_start(void);extern void game_pause (void);extern void game_clear (void);extern void display (void);extern uchar time_grade_increase(uchar item,char inc_num); extern void time_grade_set(uchar item,uchar num);/*--------------------------------------*/#endif/*======================================*//*======================================*///文件名:main.c#include <reg52.h>#include "my_func.h"uchar intr_num = 0;/*----------------主程序---------------*/void main(){init(); //初始化while (1){key_respond();display();}}/*------------计时器T0溢出中断服务程序------------*/void Timer() interrupt 1 //T0中断{TIMER_LOAD(); //T0装初值intr_num++;if (intr_num == 20){intr_num = 0;time_grade_increase(_SECOND,-1);}}/*-----------------------------------------------*//*===============================================*///文件名:key_scan.c#include <reg52.h>#include "my_func.h"/*-------------------按键检测程序----------------*///返回键码(没有键按下时返回0)uchar key_scan(){uchar temp,key=0;P3 = 0xfe; //检测第1列temp = P3; //读取P3口状态(将P3状态赋给temp,然后操作temp,是为了不对P3口产生影响!)temp = temp&0xf8; //temp低3位(对应P3_0、P3_1、P3-2)清零,只检测高5位(其实是P3_3、P3_4、P3-5这三根列线)的状态。
(0xf8是temp低3位清零后,没有按键按下的状态)if (temp!=0xf8) //第一次检测到按键按下(P3_3、P3_4、P3-5这三根列线中出现了0){delay_ms(10); //延时消抖temp=P3; //重新读取P3口状态temp = temp&0xf8;if (temp!=0xf8) //确定按键按下{temp=P3; //再次读取P3口状态switch (temp){case 0xf6 : //START/PAUSE键按下key = 11; //第1行第1列break;case 0xee :key = 12;break;case 0xde :key = 13;break;default:break;}while (temp!=0xf8) {temp=P3; temp=temp&0xf8;} //等待按键释放}}P3 = 0xfd; //检测第2列temp = P3;temp = temp&0xf8;if (temp!=0xf8){delay_ms(10);temp=P3;temp = temp&0xf8;if (temp!=0xf8){temp=P3;switch (temp){case 0xf5 :key = 21;break;case 0xed :key = 22;break;case 0xdd :key = 23;break;default:break;}while (temp!=0xf8) {temp=P3; temp=temp&0xf8;} }}P3 = 0xfb; //检测第3列temp = P3;temp = temp&0xf8;if (temp!=0xf8){delay_ms(10);temp=P3;temp = temp&0xf8;if (temp!=0xf8){temp=P3;switch (temp){case 0xf3 :key = 31;break;case 0xeb :key = 32;break;case 0xdb :key = 33;break;default:break;}while (temp!=0xf8) {temp=P3; temp=temp&0xf8;}}}return key;}/*-----------------------------------------------*//*===============================================*///文件名:key_respond.c#include <reg52.h>#include "my_func.h"/*--------------------按键响应------------------*/void key_respond(){uchar key = key_scan(); //获取键码if (key!=0) //有键按下{if (LED_run==ON) //游戏进行中,响应除了EXCHANGE和CLEAR之外的按键{if (key == 11) game_pause();else if (key == 21) {time_grade_increase(_GRADE_A,1); LED_SHOOT();}else if (key == 22) {time_grade_increase(_GRADE_A,2); LED_SHOOT();}else if (key == 23) {time_grade_increase(_GRADE_A,3); LED_SHOOT();}else if (key == 31) {time_grade_increase(_GRADE_B,1); LED_SHOOT();}else if (key == 32) {time_grade_increase(_GRADE_B,2); LED_SHOOT();}else if (key == 33) {time_grade_increase(_GRADE_B,3); LED_SHOOT();}else LED_ERROR();}else if (LED_pause==ON) //游戏暂停,只响应START/PAUSE键(半场结束才响应EXCHANGE键){if (key == 11) game_start();else LED_ERROR();}else if (LED_end==ON) //游戏结束,只响应START/PAUSE和CLEAR键{if (key == 11) game_start();else if (key == 13) game_clear();else LED_ERROR();}}}/*------------------------------------------------*/void game_start(){if ((time_grade_increase(_MINUTE,0)==0)&&(time_grade_increase(_SECOND,0)==0)) //半场结束{if (LED_end == ON) init(); //如果是下半场结束,重新开始else if (LED_end == OFF) //如果是上半场结束{time_grade_set(_MINUTE,PLAY_TIME);time_grade_set(_SECOND,0);TIMER_LOAD();}}TIMER_START();LED_RUN();}/*------------------------------------------------*/void game_pause(){TIMER_PAUSE();LED_PAUSE();}/*------------------------------------------------*/void game_clear() //(比赛结束)比分清零{init();}/*------------------------------------------------*//*================================================*///文件名:display.c#include <reg52.h>#include <intrins.h>#include "my_func.h"char minute,second,grade_A,grade_B;uchar code num_table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极数码管显示0~9的字型码/*-----------------8只数码管显示数字---------------------*/void display(){uchar display_table[8] = {0}; //display_table[8]存放8只数码管将要显示的字型码uchar i,display_3_num,display_4_num,temp_wei;if (second<0) {second = 59; minute--;} //秒进位到分钟if (minute==-1) //半场结束{TIMER_PAUSE(); //暂停计时if (LED_exchg == OFF) //如果是上半场{LED_PAUSE();sounder(); //蜂鸣器提示while (key_scan()!=12){LED_EXCHG(); //灯闪烁delay_ms(500);} //响应EXCHANGE键LED_exchg = ON;}else if (LED_exchg == ON) //如果是下半场{LED_END();sounder(); //蜂鸣器提示}time_grade_set(_MINUTE,0); //计时清零time_grade_set(_SECOND,0);}if (grade_A>99) {grade_A = 99; LED_ERROR();} //比分超出显示范围if (grade_B>99) {grade_B = 99; LED_ERROR();}if (LED_exchg==ON) {display_3_num = grade_B; display_4_num = grade_A;} //下半场,比分交换else if (LED_exchg==OFF) {display_3_num = grade_A; display_4_num = grade_B;} //上半场,比分不交换display_table[0] = num_table[(uchar)(minute/10)]; //第1只数码管display_table[1] = num_table[(uchar)(minute%10)]; //第2只数码管display_table[2] = num_table[(uchar)(second/10)];display_table[3] = num_table[(uchar)(second%10)];display_table[4] = num_table[(uchar)(display_3_num/10)];display_table[5] = num_table[(uchar)(display_3_num%10)];display_table[6] = num_table[(uchar)(display_4_num/10)];display_table[7] = num_table[(uchar)(display_4_num%10)];//第8只数码管temp_wei=0xfe; //位选初值1111,1110for (i=0;i<8;i++){P0 = 0x00; //消影!LE_duan = 1; //打开段选锁存端_nop_();P0 = display_table[i]; //段选信号_nop_();LE_duan = 0; //关闭段选锁存端P0 = 0xFF; //消影!LE_wei = 1; //打开位选锁存端P0 = temp_wei; //位选信号LE_wei = 0; //关闭位选锁存端temp_wei = temp_wei<<1|temp_wei>>7; //位选信号循环左移delay_ms(1);}LE_wei = 1;P0 = 0xFF;LE_wei = 0;}/*-----------------增大指定显示项的数字-----------------*///显示项可以是_MINUTE、_SECOND、_GRADE_A、_GRADE_B。