基于51单片机篮球控制器12864显示仿真及源程序

一、系统方案
1、本设计采用51单片机作为主控器。
2、比分液晶12864显示。
3、主客队加减分、节数、24秒、复位等功能。
在这里插入图片描述
二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
void Timer_0()interrupt 1
{
TL0 = 0x00;
TH0 = 0xDC;
Count++;
if(Count100)
{
Count=0;
Attack_Time–;
Time_sec–;
if(Attack_Time
0)
{
if(BF_flag==0){BF();BF();BF();BF();BF();}

		Attack_Time=24;
		BF_flag=0;
	}
	if(Time_sec==0)
	{
		
		Time_sec=59;
		Time_min--;
		if(Time_min==0)
		{
			Time_min=11;
		}
	}
}

}
2、液晶显示程序
void busy12864()
{
lcdDat=0xff; //口线置1,防止干扰
rs=0; rw=1; //置“命令、读”模式
//en=1; while(lcdDat&0x80); en=0;//忙等待
}
/** 写命令 参数:comDat为要发送的命令 /
void WriteCom(uchar comDat)
{
busy12864(); //忙,则等待
rs=0;rw=0; //置“命令、写”模式
lcdDat=comDat;en=1;en=0;//送出命令,并使之有效
}
/
写数据 参数:dat为要发送的数据 **/
void WriteDat(uchar dat){
busy12864(); //忙,则等待
rs=1;rw=0; //置“数据、写”模式
lcdDat=dat;en=1;en=0; //送出数据,并使之有效
}

/******** 任意尺寸点阵显示函数 ***********|
|参数:显示位置:row页数,col列号, |
| 字符大小:x横向像素,y纵向页数 |
| 显示内容:tab字模表 *****/
void showXY(uchar row,uchar col,uchar x,uchar y,uchar tab){
uchar i,j;
bit right;
if(col<64){right=0;}
else {col-=64;right=1;}
for(i=0;i<y;i++){
if(right)cs1=1,cs2=0;
else cs1=0,cs2=1;
WriteCom(addX0+row+i);
WriteCom(addY0+col);
for(j=0;j<x;j++){
if(col+j<64)WriteDat(tab[i
x+j]);
else if(right==0)
{
cs1=1,cs2=0;
WriteCom(addX0+row+i);
WriteCom(addY0+(col+j-64));
WriteDat(tab[i
x+j]);
}
}
}
}

/* 返回一个8*16字符索引位置 /
uchar enN(uchar s){
uchar i;
for(i=0;zm8x16_index[i]!=0;i++)
if(zm8x16_index[i]==s[0])break;
return i;
}
/
返回一个16
16字符索引位置 /
uchar cnN(uchar s){
uchar i;
for(i=0;zm16x16_index[i]!=0;i+=2)
if(zm16x16_index[i]*s&&zm16x16_index[i+1]
(s+1))break ;
return i/2;
}
/
显示中英文字符串 */
void showStr(uchar row,uchar col,uchar *s)
{
uchar i;
for(i=0;s[i]!=0;i++){
if(s[i]<0x80){
showXY(row,col,8,2,zm8x16_Table[enN(&s[i])]);
col+=8;
}else{
showXY(row,col,16,2,zm16x16_Table[cnN(&s[i])]);
col+=16;i+=1;
}
if(col>120)
{
col=0;
row+=2;
}
}
}
3、按键程序
void Select()
{
if(K10)
{
delay_ms(5);
if(K1
0)
{
while(!K1);
BF_flag++;
A_Team++;
if(A_Team==999)
{
A_Team=0;
}
BF();
}
}

if(K2==0)
{
	delay_ms(5);
	if(K2==0)
	{
		while(!K2);
		
		A_Team--;
		if(A_Team==0)
		{
			A_Team=999;
		}
		BF();
	}
}

if(K3==0)
{
	delay_ms(5);
	if(K3==0)
	{
		while(!K3); 
		BF_flag++;
		B_Team++;	
		if(B_Team==999)
		{
			B_Team=0;
		}
		BF();
	}
}	

if(K4==0)
{
	delay_ms(5);
	if(K4==0)
	{
		while(!K4); 
		B_Team--;
		if(B_Team==0)
		{
			B_Team=999;
		}
		BF();
	}
}	

if(K5==0)
{
	delay_ms(5);
	if(K5==0)
	{
		while(!K5); 
		TR0=0;BF();
		A_Team=0,B_Team=0;BF_flag=0;
		Time_min=12,Time_sec=0;
		Screenings=1;
		Attack_Time=24;
		Display();
		
	}
}	

if(K6==0)
{
	delay_ms(5);
	if(K6==0)
	{
		while(!K6);	BF();
		Attack_Time=24;BF_flag=0;
	}
}	
if(K7==0)
{
	delay_ms(5);
	if(K7==0)
	{
		while(!K7); BF();
		Screenings++;
		Attack_Time=24;BF_flag=0;
		Time_min=11,Time_sec=59;
		if(Screenings==5)
		{
			Screenings=1;	
		}
	}
}		
if(K8==0)
{
	delay_ms(5);
	if(K8==0)
	{
		BF();
		while(!K8);
		BF_flag=0;
		T_Count++;
		if(T_Count==1)
		{
			Time_min=11;Attack_Time=23;
			Time_sec=59;			
			TR0=1;	
			T_Count=2;
		}
		if(T_Count==3)
		{
			TR0=0;	
		
		}
		if(T_Count==4)
		{
			TR0=1;	
			T_Count=2;
		}
	}
}

}
4、核心算法程序
void main()
{

Init12864();//初始化
EA=1;ET0=1;
Timer0Init();
while(1)
{
	
	Select();
	Display();
	if(Time_min==0&&Time_sec==0&&Screenings==4&&Attack_Time==0)//比赛打完
	{ 
		BF();BF();BF();BF();BF();BF();BF();BF();
	}
}

}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbxyliyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值