一、系统方案
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_Time0)
{
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[ix+j]);
else if(right==0)
{
cs1=1,cs2=0;
WriteCom(addX0+row+i);
WriteCom(addY0+(col+j-64));
WriteDat(tab[ix+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;
}
/ 返回一个1616字符索引位置 /
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(K10)
{
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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。