用8051单片机,1602LCD作为显示器的篮球记分牌
基于单片机的篮球计分器设计

• 125•在当今的体育赛事中,比赛的计分系统对观众和运动员尤为重要,观众可以根据比分的实时显示为自己支持的队伍呐喊助威,运动员更是要靠着计分器来把握比赛的节奏,包括攻防转换、替补换人以及赛间休息等等。
因此,为了让比赛进行得更加专业化和流畅化,我们有必要对比赛的计分系统进行改良。
篮球赛事的得分系统是一种记分类型的系统,是根据主客两队在规定时间内的积分比来决定输赢。
篮球比赛得分系统由记分器和计时钟等智能电子设备组成。
而且,根据目前篮球比赛的专业化和高水准,完备的智能设备体系要与现场实时录制、直播平台等连接,为观众打造全方位的视频带入感。
1 系统硬件设计1.1 系统整体设计本次计分系统的设计采用模块化结构,以单片机为核心来连接外围电路和PC 机,实现比赛计分器的功能。
1.2 单片机最小系统单片机最小系统,是指用最少的元器件组成功能齐全的工作系统的单片机。
51单片机的最小系统是由单片机、晶振和复位电路组成。
图1所示为一个51单片机的最小系统电路图。
第一部分:电源组40 脚接电源 5V (右上角),20 脚接电源负极(左下角),在单片机里面,负极也可以叫 GND 或者“地”,我们在单片机的应用中,习惯说负极为“地”,上面 GND 就是英文 ground 的缩写,翻译过来就是“地”的意思。
第二部分:晶振电路11.0592M 晶振 Y1 与单片机的 18,19 脚并联,因为这两只脚,就是晶振的工作引脚,22p 电容 C2 一端接 18 脚,一端接地,22p 电容 C3 一端接 19 脚,一端接地,两个电容,在 10~30P 中选择可行性较高,主要作用是滤掉晶振部分的高频信号,让晶振工作的稳定性更高。
第三部分:复位电路10u 电容 C1 正极接电源,负极接最小系统的复位脚,即第 9 脚。
1K 电阻R17一端接单片机的复位脚,一端接地。
就是通过这个 10u 和 1k ,就可以让单片机一开始供电时候,单片机自动复位,从零开始执行程序,这个就是复位的概念。
单片机课程设计篮球比赛计分牌的设计

尺寸:适合篮球比赛场地,易于安装和拆卸
显示:清晰可见,易于读取分数和计时信息
设计:简洁大方,易于操作
颜色:鲜艳醒目,易于识别
显示清晰:能够清晰地显示比赛分数、时间等信息
操作简便:操作简单,易于使用
稳定性高:能够长时间稳定运行,避免故障
易于维护:易于维护和维修,降低维护成本
单片机最小系统包括:单片机、电源、晶振、复位电路
晶振:为单片机提供稳定的时钟信号
复位电路:在系统启动时,将单片机复位到初始状态
电源:为单片机提供稳定的电源电压
单片机最小系统设计需要考虑的因素:稳定性、可靠性、成本、可扩展性等
显示模块类型:LCD或LED
显示内容:比分、时间、犯规次数等
接口设计:I2C、SPI或其他
显示模块控制:通过单片机控制显示内容
显示模块接口:与单片机连接
显示模块尺寸:根据实际需求选择
功能:接收用户输入,控制计分牌的显示
应用实例:篮球比赛计分牌、电子秤、遥控器等
设计要点:按键的布局、微控制器的选择、显示模块的接口
模块组成:按键、微控制器、显示模块
电源模块的作用:为计分牌提供稳定的电源
电源模块的组成:电源适配器、电源线、电源开关等
电源模块的选择:根据计分牌的功率需求选择合适的电源模块
电源模块的安装:按照说明书进行安装,确保电源模块与计分牌的连接正确、牢固
电源滤波:使用电源滤波器,减少电源噪声干扰
屏蔽设计:使用金属外壳,屏蔽电磁干扰
接地设计:良好的接地设计,减少静电干扰
软件抗干扰:使用软件滤波算法,减少信号噪声干扰
C语言:广泛应用,易于理解和学习
功能测试:测试计分牌的各项功能,如计分、计时等
单片机篮球记分牌

注:实际产品需要增加时钟、复位电路。
#include "reg51.h" //51头文件#define KEY_IO P0 //键盘接口#define Lcd_Port P2 //定义数据端口sbit Lcd_RS = P3^5; //定义和LCD的连接端口,写数据指令端口sbit Lcd_RW = P3^6; //读写端口sbit Lcd_E = P3^7; //使能端口sbit Lcd_Busy = P2^7; //读忙端口char aa[10]={'0','1','2','3','4','5','6','7','8','9'};int score_a=0,score_b=0; //用于存储双方比分char dis_buff[4]={'0','0','0','0'}; //用于存放两队比分的十位、个位int temp,keytemp1,keytemp2; //临时变量//延时函数void delay(int t){int i,j; //延时变量for(i=0;i<t;i++) //t表示循环次数for(j=0;j<100;j++);}// 读忙信号判断void Read_Busy(void){int k=255;Lcd_Port=0xff;Lcd_RS = 0;Lcd_RW = 1;Lcd_E = 1;while((k--)&&(Lcd_Busy));Lcd_E = 0;}// 写指令函数void Write_Comm(int lcdcomm){Read_Busy( ); //先读忙Lcd_RS = 0; //端口定义为写指令Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口输入总使能Lcd_Port=lcdcomm; //数据端送指令Lcd_E = 0; //端口输入总禁止}//写数据函数void Write_Chr(int lcddata){Read_Busy( ); //先读忙Lcd_RS = 1; //端口写数据使能Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口总输入使能Lcd_Port = lcddata; //数据端口送数据Lcd_E = 0; //端口总输入禁止}//初始化LCDvoid Init_LCD(void){delay(2); //稍微延时,等待LCD进入工作状态 Write_Comm(0x38); //8位2行5*8Write_Comm(0x0c); //显示开/关,光标开闪烁开Write_Comm(0x01); //清显示Write_Comm(0x06); //文字不动,光标右移Write_Comm(0x02); //光标归位}//LED显示动态扫描函数void display(){dis_buff[0]=score_a/10; //送score_a的十位到显示数组里面dis_buff[1]=score_a%10; //送score_a的个位到显示数组里面dis_buff[2]=score_b/10; //送score_b的十位到显示数组里面dis_buff[3]=score_b%10; //送score_b的个位到显示数组里面Write_Comm(0x83); //确定显示位置,第1行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('A');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[0]]); //送显A队比分十位Write_Chr(aa[dis_buff[1]]); //送显A队比分个位Write_Comm(0xC3); //确定显示位置,第2行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('B');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[2]]); //送显B队比分十位Write_Chr(aa[dis_buff[3]]); //送显B队比分个位}//外部中断0中断服务子函数void ext0(void) interrupt 0 using 0 //通过与门触发中断来扫描按键{EX0=0; //关闭外部中断KEY_IO=0x03; //反转法第一步,置键盘接口0000 0011 keytemp1=(~KEY_IO)&0x03; //临时存储按键行状态到keytemp1低4位 delay(1);KEY_IO=0xF0; //反转法第二步,置键盘接口1111 0000 keytemp2=(~KEY_IO)&0xF0; //临时存储按键列状态到keytemp2高4位 temp= keytemp1|keytemp2; //将按键行列号存入tempswitch(temp) //根据按键行列号判断{case 0x11: //按键在第1行第1列score_a++; //A队比分加1if(score_a==100)score_a=99;break;case 0x21: //按键在第1行第2列score_a+=2; //A队比分加2if(score_a>=100)score_a=99;break;case 0x41: //按键在第1行第3列score_a+=3; //A队比分加3if(score_a>=100)score_a=99;break;case 0x81: //按键在第1行第4列if(score_a!=0)score_a--; //A队比分减1break;case 0x12: //按键在第2行第1列score_b++; //B队比分加1if(score_b==100)score_b=99;break;case 0x22: //按键在第2行第2列score_b+=2; //B队比分加2if(score_b>=100)score_b=99;break;case 0x42: //按键在第2行第3列score_b+=3; //B队比分加3if(score_b>=100)score_b=99;break;case 0x82: //按键在第2行第4列if(score_b!=0)score_b--; //B队比分减1break;}do //等待按键释放,防止按键抖动{KEY_IO=0x03;temp=(~KEY_IO)&0x03;}while(temp!=0);}//主函数void main(){Init_LCD( );EA=1; //开全局中断EX0=1; //开外部中断0IT0=0; //外部中断0低电平触发while(1){KEY_IO=0x03; //赋初值0000 0011display(); //送显EX0=1; //开外部中断0,即可以按键扫描 }}。
单片机课程设计报告-篮球计时计分器

2010 ~ 2011 学年第 2 学期《单片机应用系统设计与制作》课程设计报告教学院(部)电气与电子信息工程学院教研室电气自动化指导教师课程设计时间 2011.5.30~2011.6.10 课程设计班级电气自动化技术2009(*)班学号 2009********姓名张 * *单片机应用系统设计与制作课程设计成绩评定表指导教师签字:2011 年 6 月20 日摘要篮球计时计分器以单片机为核心,由计时器、计分器、综合控制器等组成。
系统采用模块化设计,主体分为计时显示模块、计分显示模块、定时报警、按键控制键盘模块。
每个模块的程序结构简单、任务明确,易于编写、调试和修改。
编程后利用Keil软件来进行编译,再将生成的HEX文件装入芯片中,采用Proteus软件仿真,检验功能是否能够正常实现,本设计中系统硬件电路主要由以下几个部分组成:单片机AT89C52、计时电路、计分电路、报警电路和按键开关。
该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩以及赛后成绩暂存等功能。
关键词:单片机,计时,计分,显示器,接口ABSTRACTTime 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. After programming, firstly we can use Keil 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. The design of hardware circuit mainly consists of the five components, including AT89C52, timing circuit, scoring circuit, alarm circuit and key switch circuit.The system has many features,such as setting the schedule time, scheduling time to pause, refreshing result of both parties timely, storing temporarily results after the match and so on.KEY WORDS:Microcontroller, Timing, Scoring, Display, Interface目录一、设计目的及要求 (3)二、方案论证 (3)三、元件及其功能简介 (5)四、电路方案设计 (12)五、编程及仿真 (16)六、心得与总结 (20)附表一、程序清单 (21)参考文献 (34)课程设计报告一、设计目的及要求1、设计目的通过本次基于C51系列篮球计时计分器的设计,可以了解、熟悉有关单片机开发设计的过程,并加深对单片机的理解和应用以及掌握单片机与外围接口的一些方法和技巧,这主要表现在以下一些方面:(1) 篮球赛计时计分系统包含了8051系列单片机的最小应用系统的构成,同时在此基础上扩展了一些使用性强的外围接口。
基于单片机的篮球比赛电子记分牌-仿真图+完整程序

基于单片机的篮球比赛电子记分牌-仿真图+完整程序————————————————————————————————作者:————————————————————————————————日期:NEPU课程设计课程单片机课程设计题目基于单片机的篮球比赛电子记分牌院系电气信息工程学院测控系专业班级测控技术与仪器**-*班学生姓名 **** 学生学号 ************ 指导教师 **** ****201*年* 月*日NEPU课程设计任务书课程单片机课程设计题目基于单片机的篮球比赛电子记分牌专业测控技术与仪器姓名**** 学号************* 一、任务以AT89C51单片机为控制核心,遵循篮球比赛规则,设计一款具有记录比赛分数,比赛剩余时间等基本功能的电子记分牌。
二、设计要求[1] 要求能实时记录比赛的分数、剩余时间。
[2] 通过对AT89C51单片机的编程,实现比分和剩余时间的显示。
[3] 设计篮球24秒定时器、剩余5秒时发出提示音。
[4] 提交设计报告、电路图及程序源码。
三、参考资料[1] 张毅刚.单片机原理及应用[M].北京:高等教育出版社,2004.[2] 刘润华,刘立山.模拟电子技术[J].山东:石油大学出版社,2003.[3] 周润景,张丽娜等.PROTEUS入门教程[M].北京:机械工业出版社,2007.[4] 尹仕.电工电子制作基础[M].武汉:华中科技大学出版社,2008.[5] 彭介华.电子技术课程设计指导[J].北京:高等教育出版社,1997.完成期限指导教师专业负责人******201*年*月** 日目录第1章绪论 01.1 单片机在体育赛事计分的应用 01.2 本设计任务 0第2 章总体方案论证与设计 (1)2.1 显示模块 (1)2.2 按键控制模块 (1)2.3 报警模块 (1)2.4 总体硬件组成框图 (2)第3章系统硬件设计 (3)3.1 LCD1602显示模块的硬件设计 (3)3.2按键控制模块的硬件设计 (3)3.3 蜂鸣器报警模块的硬件设计 (4)3.4 单片机最小系统的硬件设计 (5)第4章系统的软件设计 (6)4.1 主程序设计 (6)4.2 按键控制程序设计 (7)4.3 蜂鸣器报警程序设计 (8)第5章系统调试与测试结果分析 (10)5.1 系统调试 (10)5.2 测试结果 (10)结论 (11)参考文献 (12)附录1 程序 (13)附录2 仿真效果图 (19)第1章绪论体育比赛计时计分系统是对体育比赛过程中所产生的时间、比分等数据进行快速采集记录,加工处理,传递数据的信息系统。
毕业论文-基于STC89C51单片机的篮球计时计分器的设计

基于STC89C51单片机的篮球计时计分器的设计摘要随着科技的日益发展进步,单片机技术已经被广泛应用在科研、工作等重要领域内,目前也已经普及到我们的日常生活中,扮演着十分重要的角色。
本次设计是基于单片机的篮球计分器,以基本篮球规则为依据,设计结构简单且方便操作,对篮球比赛实现实时控制。
此次设计的计分器总共包括四个模块,他们是24秒显示、计时器、记分器、计节器。
实现的功能是:24秒显示能按键控制24秒计时器,当控球时间超过24秒时,可发出报警信号。
计时器可按键调节,可以随时暂停计时,暂停比赛,在每节结束和全场结束时报警。
记分器记录两队的积累分数,可通过按键分别加1、2、3分。
设计分为硬件设计和软件设计。
硬件设计的主要包括的是:LED数码管显示、按键控制系统设计以及辅助功能的设计。
软件设计包括:功能选择、倒计时的实现。
本文主要介绍了用单片机设计实现篮球计分器的整个流程,采用C语言编写程序。
设计引用MAX7219专用LED驱动芯片,解决了多位LED数码管同时显示的问题。
其中时间显示和比分显示部分由两组共阴极LED数码管显示。
时间显示部分可以以分为单位进行计时调整。
比分显示部分可以实现在半场结束后手动换场,两个显示模块均采用动态扫描方式进行显示。
按键控制部分采用独立按键,共设八个按键,实现调整分数、调整时间、比赛的开始/暂停、复位键和交换场地键等功能。
报警部分由蜂鸣器加三级管驱动,实现了发出按键声音和结束报警的功能。
采用单片机控制使这个系统按键操作使用简单,安装方便。
解决了篮球比赛计数器的安装问题,节约了线材,适合在各种规模的体育场馆使用,完全可以代替传统的用钟表进行计时的方法,当然稍加改动也可以用于其他球类比赛,是体育器材向智能化发展的一个实例。
关键词:STC89C51单片机;温度控制;恒温箱;DS18B20AbstractWith the increasing development of advances in technology, chip technology has be en widely applied in the important areas of research, work, etc., now also has spread int o our daily lives, it has developed into a more mature technology, the design will focus on SCM medical incubator temperature control system to do in-depth research. Smart th ermostat not only have a number of functions, which are extremely versatile. It can not only make the upper limit for the precise control of temperature control, but when the te mperature is not set within the range of time, but also through the relay to drive the co rresponding load of work, and at the same time the buzzer and warning lights will issue a warning signal, a very intelligent.Most of microcontroller-based incubator temperature control system is in use in lab oratory, industrial, pharmaceutical, agriculture. In the laboratory especially biological labor atories, we have to get more accurate experimental data, for constant temperature test en vironment demanding. So for the laboratory, the role of the incubator is very important. In the industrial production process, we incubator for relatively more stringent requiremen ts, such as heat, cold treatment products, etc., directly affect the quality of the product. I n medicine medical incubator is mainly used for storing drugs and reagents, transport, vaccines, Refrigerated blood, warmed dialysate, saline warming the like. From the above we can clearly see the important role of the incubator. In agriculture greenhouse, the te mperature control system is essential for the growth of crops for agriculture, so that all aspects of life in the temperature control system is always in a very important position.Keywords: MCU—80C51; Incubator; Temperature control目录摘要..................................... 错误!未定义书签。
基于51单片机的篮球计时计分器

基于51单片机的篮球计时计分器基于51单片机的篮球计时计分器随着科技的不断进步,基于51单片机的篮球计时计分器应运而生。
这种计时计分器不仅为篮球比赛提供了方便,还大大降低了人工操作的成本和错误率。
本文将详细介绍基于51单片机的篮球计时计分器的特点、设计、实验验证及未来发展趋势。
一、文章类型和关键词本文属于技术应用类文章,主要关键词包括51单片机、篮球计时计分器、传感器、电路设计、程序设计等。
二、引言篮球比赛需要精确的计时和计分,传统的人工方式往往存在操作不便、易出错等缺点。
随着科技的发展,基于51单片机的篮球计时计分器成为了篮球比赛中的重要工具。
这种计时计分器具有自动化、精确度高、操作方便等优点,被广泛应用于各类篮球比赛中。
三、51单片机与篮球计时计分器51单片机是一种常见的微控制器,具有灵活的指令集和丰富的外围设备,包括定时器、中断控制器、串口通信接口等。
基于51单片机的篮球计时计分器利用了51单片机的这些特性,通过编程实现对比赛计时和计分等功能的控制。
四、篮球计时计分器设计篮球计时计分器的设计包括硬件和软件两部分。
硬件部分主要包括51单片机、传感器、电路连接等。
传感器用于检测篮球比赛中的关键事件,如进球、犯规等,并将这些事件转换为电信号传递给51单片机。
电路连接部分包括电源电路、通信电路等,为51单片机和传感器提供稳定的工作环境。
软件部分包括程序设计、算法实现等。
程序设计根据实际需求进行,实现计时、计分、显示等功能。
算法实现用于优化计时和计分的过程,提高计时计分的准确性和实时性。
五、实验验证为了验证基于51单片机的篮球计时计分器的可行性和有效性,我们进行了一系列实验。
实验中,我们将计时计分器与实际比赛场景相结合,记录了多场篮球比赛的数据。
通过对实验数据的分析,我们发现计时计分器在计时和计分方面的准确率达到了98%以上,证明了其可行性和有效性。
六、未来发展趋势随着技术的不断发展,基于51单片机的篮球计时计分器将具有更广泛的应用前景。
基于51单片机数码管显示篮球记分牌设计

基于51单片机数码管显示篮球记分牌设计#include<reg51.h>unsigned char a1,b1,c1,a2,b2,c2,d1,d2,e3,f3,g3,h3,i,j,flag10,flag11,flag12;unsigned char af,bf,time=24,cnt1,cnt2;signed int time1=720;sbit aj=P1^0;sbit bj=P1^1;sbit cn=P1^2;sbit bn=P1^3;sbit en=P3^2;sbit fn=P3^3;sbit hn=P3^0;sbit gn=P3^4;sbit set=P1^4;sbit tj=P1^5;sbit tz=P1^6;sbit ot=P1^7;bit flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6,flag7,flag8,flag9;unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(unsigned char i);void display();void sw();void abbfen();void esnny();void esnne();void esnns();void esfzw();void hfwz();void ot1();void setj ();void timej ();void timez ();void main(){TMOD=0x11;TH0=0x3c;TL0=0xb0;TH1=0x3c;TL1=0xb0;ET0=1;ET1=1;while(1){display();abbfen();sw();esnny();esnne();esnns();esnne();esfzw();hfwz();timej ();timez ();setj ();ot1();}}void delay(unsigned char i ) {unsigned char j,k;for (k=0;k<i;k++)for (j=0;j<10;j++);}void display(){a1=af/100;b1=af%100/10;c1=af%100%10;P2=0x00;P0=s[a1];delay(2);P2=0x01;P0=s[b1];delay(2);P2=0x02;P0=s[c1];delay(2);P0=s[10];delay(2);a2=bf/100;b2=bf%100/10;c2=bf%100%10;P2=0x04;P0=s[10];delay(2);P2=0x05;P0=s[a2];delay(2);P2=0x06;P0=s[b2];delay(2);P2=0x07;P0=s[c2];delay(2);e3=time1/60/10;f3=time1/60%10; g3=time1%60/10; h3=time1%60%10;P2=0x08;P0=s[e3];delay(2);P2=0x09;P0=s[f3];delay(2);P2=0x0a;P0=s[g3];delay(2);P2=0x0b;P0=s[h3];delay(2);d1=time/10;d2=time%10;P2=0x0c;delay(2);P2=0x0d;P0=s[d2];delay(2);}void abbfen(){if(aj==0){delay(10);}if(aj==0){flag1=1;}if(flag1==1&&aj==1) {flag1=0;af++;}}void sw(){if(bj==0){delay(10);}if(bj==0){flag2=1;}if(flag2==1&&bj==1) {flag2=0;bf++;}}void esnny(){if(cn==0){delay(10);}if(cn==0){flag3=1;}if(flag3==1&&cn==1) {flag3=0;TR0=1;}}void esnne(){if(bn==0){delay(10);}{flag4=1;}if(flag4==1&&bn==1) {flag4=0;TR0=0;}}void esfzw(){if(en==0){delay (10);}if(en==0){flag5=1;}if(flag5==1&&en==1) {flag5=0;TR1=1;}}void esnns(){if (fn==0){delay (10);}if(fn==0){flag6=1;}if(flag6==1&&en==1) {flag6=0;TR1=0;}}void hfwz(){if (gn==0){delay (10);}if(gn==0){flag7=1;}if(flag7==1&&gn==1) {flag7=0;time=24;}}void setj (){if (set==0){delay (10);}if(set==0){flag10=1;}if(flag10==1&&set==1){ flag10=0;j++;if (j==3) j=0;}}void ot1(){if (ot==0){delay (10);}if(ot==0){flag12=1;}if(flag12==1&&ot==1){flag12=0;time1=300;}}void timej (){if (tj==0){delay (10);}if(tj==0){flag8=1;}if(flag8==1&&tj==1){flag8=0;switch(j){case 0x00:break;case 0x01:time1--; break;case 0x02:time1=time1-60;break; default:break;}}}void timez (){if (tz==0){delay (10);}if(tz==0){flag9=1;}if(flag9==1&&tz==1){flag9=0;switch(j){case 0x00:break;case 0x01:time1++; break;case 0x02:time1=time1+60;break; default:break;}}}void int1()interrupt 1{TH0=0x3c;TL0=0xb0;cnt1++;if(cnt1==21){cnt1=0;time1--;}if(time1==-1){time1=720;}}void int3()interrupt 3{TH1=0x3c;TL1=0xb0;cnt2++;if(cnt2==21){cnt2=0;time--;if(time==-1){time=24;hn=0;hn=1;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/****************************************************************************** ** 描述: ** 1602字符型LCD显示演示程序** 在第一行显示 A.T 000:000 B.T ** 在第二行显示TIME 12:00 ********************************************************************************** */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef unsigned int WORD;typedef bit BOOL ;sbit rs = P2^6; //sbit rw = P2^5;sbit ep = P2^7;sbit K1=P3^0;//用于给A对加分sbit K2=P3^1; // 给A对减分sbit K5=P3^6; // 给B对加分sbit K6=P3^7; //给B对减分sbit K4=P3^2; //比赛开始暂停按键sbit BEEP=P1^5;unsigned char Index;unsigned char key;char time,min,sec,num;unsigned char Apoint;unsigned char Bpoint;BYTE code dis1[] = {"A.T 000:000 B.T"};BYTE code dis2[] = {" TIME 12:00 "};delay(BYTE ms){ // 延时子程序BYTE i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);ep = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}lcd_init(){Apoint=0; //A.T分数初始化Bpoint=0; //B.T分数初始化time=0;TMOD=0x10; //定时器1初始化TL1=0xb0;TH1=0x3c;EA=1; //开总中断ET1=1; //开定时器1TR1=0; //定时器1不工作EX0=1; //开中断0ep=0;sec=0;min=12;//LCD初始化设定lcd_wcmd(0x38); //delay(1);lcd_wcmd(0x0c); //delay(1);lcd_wcmd(0x06); //delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}/***************************LCD分数更新*****************************/ void point_lcd(unsigned char add,unsigned char dat){lcd_wcmd (0x80+add);lcd_wdat (0x30+dat/100);lcd_wdat (0x30+(dat%100)/10);lcd_wdat (0x30+dat%10);dat=dat;}void point_lcd2(unsigned char add,unsigned char dat){lcd_wcmd (0x80+add);lcd_wdat (0x30+dat/100);lcd_wdat (0x30+(dat%100)/10);lcd_wdat (0x30+dat%10);dat=dat;}/********************************按键检测*******************************/ void keyscan(void){K1 = 1;K2 = 1;K5 = 1;K6 = 1;if(!K1) //按键按下{delay(10); //按键消抖if(!K1){while(!K1); //放手时才动作Index = 1;}}else if(!K2) //按键按下{delay(10); //按键消抖if(!K2){while(!K2); //放手时才动作Index = 2;}}if(!K5) //按键按下{delay(10); //按键消抖if(!K5){while(!K5); //放手时才动作Index = 3;}}else if(!K6) //按键按下{delay(10); //按键消抖if(!K6){while(!K6); //放手时才动作Index = 4;}}}/***********************比赛倒计时*********************************/ void counter_down(void){unsigned char i;if(time>=2) //每1s倒计时做减一操作{sec--;if((sec==0)&&(min==0)) //检测一节比赛是否结束{TR1=0; //定时器1暂停lcd_wcmd (0x80+0x4c);lcd_wdat(0x30);if((sec==0)&&(min==0)) //每节结束蜂鸣器发出3s的间断报警{for(i=3;i>0;i--){BEEP=0;delay(500);BEEP=1;delay(500);}}sec=0; //倒计时复位min=12;}if(sec==-1){sec=59;min--;}lcd_wcmd(0x80+0x48); //更新倒计时显示lcd_wdat(0x30+min/10);lcd_wdat(0x30+min%10);lcd_wcmd (0x80+0x4b);lcd_wdat(0x30+sec/10);lcd_wdat(0x30+sec%10);time=0;}}/**************************主程序****************************/ main(){BYTE i;lcd_init(); // 初始化LCD,及单片机delay(10);lcd_pos(1); // 设置显示位置为第一行的第2个字符i = 0;while(dis1[i] != '\0'){ // 显示字符"A.T 000:000 B.T"lcd_wdat(dis1[i]);i++;}lcd_pos(0x42); // 设置显示位置为第二行第3个字符i = 0;while(dis2[i] != '\0'){lcd_wdat(dis2[i]); // 显示字符" TIME 12:00 "i++;}while(1){keyscan();P0 = Index;switch(Index){case 1:{Apoint++;point_lcd(0x05,Apoint);delay(20);Index=0;delay(20);}break;case 2:{Apoint--;point_lcd(0x05,Apoint);delay(20);Index=0;delay(20);}break;case 3: //{Bpoint++;point_lcd(0x09,Bpoint);delay(20);Index=0;delay(20);}break;case 4: //{Bpoint--;point_lcd(0x09,Bpoint);delay(20);Index=0;delay(20);}break;P0 = Index;while(1);}}}/***K4按键中断0***/void exter0() interrupt 0 //比赛时间开始/暂停{TR1=~TR1; //定时器1工作/暂停if(TR1==1) //当倒计时工作时,K4按下定时器立即停止工作{PT1=0;}else //倒计时不工作时,K4按下倒计时立即工作{PT1=1;}if(K4==0) //松手检测{while(K4==0){counter_down();}delay(20);}}/***定时器1中断***/void timer1() interrupt 3 //定时器1中断20次为1s{time++;TL1=0xb0;TH1=0x3c;counter_down(); //倒计时}。