標題: 基于51單片機籃球計分器12864顯示仿真及源程序 [打印本頁]
作者: bbxyliyang 時間: 2023-11-12 20:11
標題: 基于51單片機籃球計分器12864顯示仿真及源程序
一、系統方案
1、本設計采用51單片機作為主控器。
2、比分液晶12864顯示。
3、主客隊加減分、節數、24秒、復位等功能。
1.png (5.29 KB, 下載次數: 39)
下載附件
2023-11-12 20:11 上傳
二、硬件設計
原理圖如下:
2.png (60.23 KB, 下載次數: 30)
下載附件
2023-11-12 20:11 上傳
三、單片機軟件設計
1、首先是系統初始化
void Timer_0()interrupt 1
{
TL0 = 0x00;
TH0 = 0xDC;
Count++;
if(Count==100)
{
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(K1==0)
{
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仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
3.png (61.04 KB, 下載次數: 38)
下載附件
2023-11-12 20:11 上傳
作者: cs=zlh 時間: 2023-12-27 19:20
樓主能分享壓縮包給我們學習一下嗎?
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |