51单片机篮球记分牌设计

 题目要求:

  1. 基本要求

  (1) 按照题目要求独立设计系统所需电路,并完成硬件电路的制作及调试。(40分)

(2)结合硬件能够正常计分(1,2,3)。(10分)

(3)能够正常显示分值。(10分)

(4)能够正常修改工作模式(计分与24秒)。(10分)

(5)能够24秒的误差不小于1秒。(15分)

2、发挥部分

  能够两队球员犯规次数计数。(15分)

总体设计思路

废话不多说直接上原理:

接下来就是代码部分:

数码管显示、定时器初始化、按键处理等等

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit key_0=P1^0; 
uint key_0_const; 
sbit key_1=P1^1;  
uint key_1_const;
sbit key_2=P1^2; 
uint key_2_const;
sbit key_3=P1^3;  
uint key_3_const;
sbit key_4=P1^4; 
uint key_4_const;
sbit key_5=P1^5;  
uint key_5_const;
sbit key_6=P1^6; 
uint key_6_const;
sbit key_7=P1^7; 
uint key_7_const;
sbit key_8=P3^7;  
uint key_8_const;

sbit led_1=P3^4;  
sbit led_2=P3^5;  
sbit led_3=P3^6;  

sbit fmq=P2^4;		

int i = 0;

uchar mode=1;		//切换选择
uchar red=0;	   
uchar blue=0;	  
uchar red_foul=0;  //甲队犯规次数
uchar blue_foul=0; //乙队犯规次数
int miao=24;		//24秒倒计时初值
uchar flag=0;
uint time_const;
uint beep_const;           
uchar mode_1=0;//重置24miao
uchar DUANMA[] = { 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F };
uchar WEIXUAN[] = {0x0E,0x0D,0x0B,0x07 };
void init_timer0(void) ;
void delay( int t);
void delay_1(void);
void display_fen(void);
void display_foul(void);
void display_time(void);
void key_scan(void)	;



int main(void)	//主程序
{
	init_timer0();//中断初始化
	fmq=0;
	while (1)
	{
		switch(mode)	//工作方式选择
		{
			case 1:
			flag=0;
			miao=24;
			display_fen(); 		 break;
			case 2:
			flag=0;
			miao=24;
			display_foul();     	 break;
			case 3:
			flag=1; 
			if(mode_1)
			{
				miao=24;
				mode_1=0;
			}
			display_time();    	 break;
		}
	}
}

void init_timer0(void) 
{
 TMOD =0x01;
 TH1= (65536 - 50000)/256;   
 TL1= (65536 - 50000)%256; 
 EA=1;
 ET1=1;
 TR1=1;
}
void delay_1(void)
{
  uint i;  
  for(i=0;i<800;i++);//800
}
void delay( int t)
{
    unsigned int i,j;
    for(i = 0;i < 40;i++)
        for(j = 0;j < t;j++);
} 
void display_fen(void)//加分调用程序1
{
	uchar i=0;
	uchar red_unit=red%10;
	uchar red_decade=red/10;
	uchar blue_unit=blue%10;
	uchar blue_decade=blue/10;
	for(i=0;i<4;i++)
	{    
		P2=WEIXUAN[0];P0=DUANMA[blue_unit];
		delay_1();
		P2=0xff;
		P2=WEIXUAN[1];P0=DUANMA[blue_decade];
		delay_1();
		P2=0xff;
		P2=WEIXUAN[2];P0=DUANMA[red_unit];
		delay_1();
		P2=0xff;
		P2=WEIXUAN[3];P0=DUANMA[red_decade];
		delay_1();
		P2=0xff;
   }

}
void display_foul(void)//加分调用程序2
{
	uchar i=0;
	uchar red_foul_unit=red_foul%10;
	uchar red_foul_decade=red_foul/10;
	uchar blue_foul_unit=blue_foul%10;
	uchar blue_foul_decade=blue_foul/10;
	for(i=0;i<4;i++)
	{     

		P2=WEIXUAN[0];P0=DUANMA[red_foul_unit];
		delay_1();
		P0=0x00;
		P2=WEIXUAN[1];P0=DUANMA[red_foul_decade];
		delay_1();
		P0=0x00;
		P2=WEIXUAN[2];P0=DUANMA[blue_foul_unit];
		delay_1();
		P0=0x00;
		P2=WEIXUAN[3];P0=DUANMA[blue_foul_decade];
		delay_1();
		P0=0x00;
   }
}
void display_time(void)  //24miao 倒计时
{  
   uchar i=0;
   uchar countdown_unit=miao%10;
   uchar countdown_decade=miao/10;   
   for(i=0;i<2;i++)
   {    
     P2=WEIXUAN[1];P0=DUANMA[countdown_decade];
     delay_1();
	   P0=0x00;
     P2=WEIXUAN[0];P0=DUANMA[countdown_unit];
     delay_1();    
	   P0=0x00;
   }      
}

还有部分代码就不放出来了,代码写得不太好,只作为借鉴。

以上是我自己写的代码,功能拓展都实现了,如有错误还请指出,谢谢

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值