篮球比赛计时计分器.docx
- 文档编号:27561262
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:38
- 大小:42.64KB
篮球比赛计时计分器.docx
《篮球比赛计时计分器.docx》由会员分享,可在线阅读,更多相关《篮球比赛计时计分器.docx(38页珍藏版)》请在冰豆网上搜索。
篮球比赛计时计分器
设计任务:
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按键用ZLG7290
RESTART%重新计时按键2-定义为RESTART
RESET%重新比赛按键3-定义为RESET
5、存储近5场的成绩到AT24C02格式:
1-队名1队名2=90:
100类推20分
RECALL1%提取存储的第1场成绩,在数码管上显示,只显示比分,串口传回队名+比分
&整场结束,提示是否保存成绩,按键4-存储键按键5-放弃键15分
源代码:
接线说明:
PSB-VCCRS-P1.0RW-P1.1P1.3-EINT-P3.2TXD-P3.1RXD-P3.0
SDA-P1.6SCL-P1.7I2C总线的ABC》别接键盘的ABCD以程序
为准凭记忆写出来的)
主程序
#include
#include
#include
#include
#include
#defineuncharunsignedchar#defineunitunsignedint#defineLcd_BusP0
#defineuncharunsignedcharunsignedcharKeyValue,FlagINT;intney;//纪录第及场比赛
sbitRS=P1A0;//LCD显示屏
sbitRW=P1A1;
sbitE=P1A3;
uncharcodelcddata[]={"0123456789:
"};
uncharcodeduiming[]={'1','H','O','U',':
','2','C','H','I','='};
uncharbifen[7];
uncharfen1;
uncharfen2;
uncharjie;
uncharmin;
uncharsec;
uncharcontrol;
unchartable[10];
voiddelay(unsignedintt){unsignedinti,j;
for(i=0;i /*写命令到LCD*/ voidwrite_com(unsignedcharcmdcode){ //chk_busy(); RS=0;//置零 RW=0; E=1; Lcd_Bus=cmdcode; delay(10);//在数据写入的时候加入适当的延时E=0; } /*写数据到LCD*/ voidwrite_data(unsignedcharDispdata) { //chk_busy(); RS=1;//写数据 RW=0; E=1; Lcd_Bus=Dispdata; delay(10);//在数据写入的时候加入适当的延时E=0; /*******函数名称: Write_Char*功能描述: 写字符******/ voidwrite_char(unsignedintnum) { //chk_busy(); RS=1; RW=0; E=1; Lcd_Bus=lcddata[num]; E=0; } /*显示字符串*/ voidhzkdis(unsignedcharcode*s) {while(*s>0) {write_data(*s); s++; /*初始化LCD屏 */ //选择基本指令集(30H) //点设定,游标右移 //开显示控制(无游标、不反白) //清除显示,并且设定地址指针为00H //uncharduiming[]="1-HOU: 2-CHI";//队名数组 //uncharbifen[7];//比分数组 unchark;//记录第几场比赛 /*** 用作计时***/ voidtimer0init(void) { TMOD=0X21; TH0=0X31; TL0=0XB0; ET0=1; EA=1; TR0=1; //IT0=1; //EX0=1; } /*****用作串口通信****/voidtimer1init(void) { TH1=0xf3; TL1=0XF3; SCON=0X50; EA=1; ES=1; TR1=1; } /****保存成绩*/ voidsave(intney) { inti; uncharbuff[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的数据通过串口通信发还给电脑**/voidfahuan(unsignedchark) { uncharbuff[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; } /****定时器中断用作计时**/voidtimer0(void)interrupt1using1{ staticuncharcount=0;unchari; 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(); } } } } /****主要用作显示比分**/ voidshow_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); } /****显示比分队名顺序相反**/ voidshow_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); delay(16); 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); } /***显示时间**/ voidshow_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); delay(16); } voidshow() { write_com(0x80); hzkdis("是否保存成绩? ”); write_com(0x90); hzkdis("ypressbutter4");write_com(0x88); hzkdis("npressbutter5");write_com(0x98); hzkdis(""); } /*****串口中断处理来自串口助手的命令*/voidchuanko()interrupt4 { unchari=0; uncharbuff[]="wrong"; while (1) {while(! RI); RI=0;if(SBUF=='%')break;table[i]=SBUF; i++; }if(table[0]=='A'&&table[1]=='+'&&table[2]=='1')fen1++; elseif(table[0]=='A'&&table[1]=='+'&&table[2]=='2'){ fen1++; fen1++; } elseif(table[0]=='A'&&table[1]=='+'&&table[2]=='3'){ fen1++; fen1++; fen1++; } elseif(table[0]=='B'&&table[1]=='+'&&table[2]=='1') fen2++; elseif(table[0]=='B'&&table[1]=='+'&&table[2]=='2') { fen2++; fen2++; } elseif(table[0]=='B'&&table[1]=='+'&&table[2]=='3') { fen2++; fen2++; fen2++; } elseif(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; /****外部中断初始化响应按键中断**/ voidSystemInit() { I2C_Init(); EA=0; IT0=1;//负边沿触发中断 EX0=1;//允许外部中断 EA=1;//等待ZLG7290复位完毕} /*****外部中断函数响应各个按键**/ voidINT0_SVC()interrupt0{ unchari;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和I2C.H只要是7和7290.C729O.h的一些驱动程序 Ex_i2c.c是at24c01的驱动程序~ I2C.C 标准80C51单片机模拟I2C总线的主机程序 Copyright(c)2005,广州周立功单片机发展有限公司 Allrightsreserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的 */ #include"I2C.h" //定义延时变量,用于宏l2C_Delay() unsignedchardataI2C_Delay_t; /* 宏定义: I2C_Delay() 功能: 延时,模拟I2C总线专用 */ #defineI2C_Delay()\ {\ I2C_Delay_t=(I2C_DELAY_VALUE);\while(--I2C_Delay_t! =0);\ /* 函数: I2C_Init() 功能: I2C总线初始化,使总线处于空闲状态 说明: 在main()函数的开始处,通常应当要执行一次本函数 */ voidI2C_Init() { I2C_SCL=1; I2C_Delay(); I2C_SDA=1; I2C_Delay(); /* 函数: I2C_Start() 功能: 产生I2C总线的起始状态说明: SCL处于高电平期间,当SDA出现下降沿时启动I2C总线不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态本函数也可以用来产生重复起始状态 本函数执行后,I2C总线处于忙状态 */ voidI2C_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: 要写到总线上的数据 */voidI2C_Write(chardat) { unsignedchart=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个字节的数据返回: 读取的一个字节数据 */ charI2C_Read() { chardat; unsignedchart=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);returndat; } /* 函数: I2C_GetAck()功能: 读取从机应答位返回: 0: 从机应答 1: 从机非应答说明: 从机在收到每个字节的数据后,要产生应答位从机在收到最后1个字节的数据后,一般要产生非应答位*/ bitI2C_GetAck() { bitack; I2C_SDA=1; I2C_Delay(); I2C_SCL=1; I2C_Delay(); ack=I2C_SDA;I2C_SCL=0; I2C_Delay(); returnack; /* 函数: I2C_PutAck()功能: 主机产生应答位或非应答位参数: ack=O: 主机产生应答位 ack=1: 主机产生非应答位 说明: 主机在接收完每一个字节的数据后,都应当产生应答位主机在接收完最后一个字节的数据后,应当产生非应答位 */ voidI2C_PutAck(bitack) { I2C_SDA=ack; I2C_Delay(); I2C_SCL=1; I2C_Delay(); I2C_SCL=0; I2C_Delay(); } /* 函数: I2C_Stop() 功能: 产生I2C总线的停止状态 说明: SCL处于高电平期间,当SDA出现上升沿时停止I2C总线 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态本函数执行后,I2C总线处于空闲状态 */ voidI2C_Stop() { unsignedintt=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总线综合发送函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 篮球比赛 计时 计分