您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于C51单片机的篮球计分器设计
基于C51单片机的篮球计分器设计题目要求:1.设计一款能够显示篮球比分的记分牌;2.通过加分按钮可以给A队,或B队加分;3.设计对调功能,更换场地后,AB队分数互换;仿真截图:完整源代码:#includereg51.hcodeunsignedseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//分别对应数码管显示字形0-9intm=15,n=00,x=0,y=0,jie=2,bujin=1,zanting=0,chuzanting=0;//初始化,m、n为分、秒计时x、y为A、B两队分数,其余为中间变量sbitA_add=P3^0;//A队加分按钮sbitB_add=P3^1;//B队加分按钮sbitTime_add=P3^2;//时间加按钮sbitTime_sub=P3^3;//时间减按钮sbitA_sub=P3^4;//A队减分按钮sbitB_sub=P3^5;//B队减分按钮sbitpause=P3^6;//暂停、启动按钮sbitchange=P3^7;//换场地按钮voidkeyScan();//按键扫描函数voiddelay(intt)//延时子程序,通过参数t,可以调整暂停时间{while(t--){unsignedinti;for(i=0;i200;i++);//设置变量i的变化范围,能调整延时的单位时间长度,i越小,延时单位时间越短,精度越高}}voiddisplay(intm,intn,intx,inty)//数码管动态刷新显示程序{if(jie==1&&bujin!=2)//中间变量jie=1时,为上半场,对p1赋值P1=0xbf;//p1=0xbf,即p1=1011111B,点亮上半场对应指示灯P2=0xfe;//数码管动态刷新显示程序p2=11111110,i为分钟P0=seg[m/10];//刷新显示时间显示分钟十位,调用延时程序delay(1);//延时数码管的点亮P2=0xff;P0=0;P2=0xfd;//同理,分钟个位并延时点亮P0=seg[m%10];delay(1);P2=0xff;P0=0;P2=0xfb;//秒钟十位P0=seg[n/10];delay(1);P0=0;P2=0xff;P2=0xf7;//秒钟个位P0=seg[n%10];delay(1);P0=0;P2=0xff;P2=0xef;//A队分数十位P0=seg[x/10];delay(1);P2=0xff;P0=0;P2=0xdf;//A队分数个位P0=seg[x%10];delay(10);P2=0xff;P0=0;P2=0xbf;//B队分数十位P0=seg[y/10];delay(1);P0=0;P2=0xff;P2=0x7f;//B队分数个位P0=seg[y%10];delay(1);P0=0;P2=0xff;}voidt0(void)interrupt1//调用定时器T0基本计时单位秒中断{inti;TH0=0xb1;//利用定时器T0,送入计数初值TH0,TL0TL0=0x10;//定时器定时单位为20msi++;if(i==50)//利用中间变量i,令i的值为5050*20ms=1秒{if(n==0)//分钟与秒时间的调整当秒减到0后分钟减1{n=60;if(m0)m--;}n--;//实现1秒计时i=0;}}voidmain()//主程序{TMOD=0x01;//设置定时器工作方式EA=1;ET0=1;TH0=0xb1;//定时计送计数初值,EA=1,开中断p3口电平拉高TL0=0x10;//p1-0x7f,上半场指示灯点亮TR0=1;P3=0xff;P1=0x7f;while(1)//通过while(1),反复调用循环体内子程序{display(m,n,x,y);//调用动态刷新显示程序keyScan();//按键处理函数if(m=0&&n=0)//时间结束了{ET0=0;//关闭中断,停止计时TR0=0;}}}voidkeyScan()//按键扫描函数{inttemp;//中间变量temp,检测到有按键按下时交换A,B两队分数if(A_add==0)//当检测到A队加分按键按下,对应加分{delay(1);//调用延时子程序,实现按键抖动功能,即当检测到按键按下时,延时,按键仍按下,说明非抖动,A队对应加分if(A_add==0){x++;}}if(B_add==0)//B队加分键被按下{delay(1);if(B_add==0){y++;}}if(A_sub==0)//A队减分{delay(1);if(A_sub==0){if(x=1)x--;}}if(B_sub==0)//B队减分{delay(1);if(B_sub==0){if(y=1)y--;}}if(Time_add==0)//时间增加按钮{delay(10);if(Time_add==0){n++;if(n==60){m++;n=1;}}}if(Time_sub==0)//时间减少{delay(10);if(Time_sub==0){if(!(m==0&&n==0))//防止被减成了负数{if(n=0){n=60;m--;}n--;}}}if(change==0)//交换场地{delay(1);if(change==0){temp=x;//两个分数值对调x=y;y=temp;}}if(pause==0)//检测到暂停键按下是,令EA=0关闭中断{delay(1);if(pause==0){if(EA==0){EA=1;}else{EA=0;}}}//当有按键没被松开时不要接着往下执行,防止按键被重复检测while(A_add==0||B_add==0||A_sub==0||B_sub==0||pause==0||change==0){display(m,n,x,y);//等待按钮被松开}}Proteus仿真图:
本文标题:基于C51单片机的篮球计分器设计
链接地址:https://www.777doc.com/doc-4301026 .html