基于51單片機(jī)的籃球計分器液晶LCD1602顯示( proteus仿真+程序+設(shè)計報告+實物仿真講解視頻)
仿真圖proteus8.16(有低版本)
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計編號:P09
1.主要功能:
基于51單片機(jī)AT89C51/52(與AT89S51/52、AT89C51/52、STC89C51/52等51內(nèi)核單片機(jī)通用)
基于51單片機(jī)的籃球計分器液晶LCD1602顯示
設(shè)計內(nèi)容:
1、設(shè)計LCD顯示籃球比賽計時計分牌。
2、通過加分按鈕可以給A隊或B隊加分。
3、設(shè)計對調(diào)功能,A隊和B隊分?jǐn)?shù)互換,意味著中場交換場地。
4、顯示比賽倒計時功能。
5、創(chuàng)新內(nèi)容:
如顯示第幾小節(jié)。
可以通過按鍵完成+1、+2、+3、-1操作。
籃球比賽24秒進(jìn)攻倒計時功能
(目前僅完全適配普中開發(fā)板A234,其他普中開發(fā)板型號可能需要做代碼修改或接線)
需注意仿真中51單片機(jī)芯片是兼容的,AT89C51,AT89C52是51單片機(jī)的具體型號,內(nèi)核是一樣的。相同的原理圖里,無論stc還是at都一樣,引腳功能都是一樣的,程序是兼容的,芯片可以替換為STC89C52/STC89C51/AT89C52/AT89C51等51單片機(jī)芯片。
以下為本設(shè)計資料展示圖:
講解視頻:
仿真講解+代碼講解
2.仿真
開始仿真
打開仿真工程,雙擊proteus中的單片機(jī),選擇hex文件路徑,然后開始仿真。
以上仿真結(jié)果均符合設(shè)計要求。
3. 程序代碼
使用keil4或者keil5編譯,代碼有注釋,可以結(jié)合報告理解代碼含義。
主要代碼
//延時子函數(shù)
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//LCD1602液晶寫指令子函數(shù)
void write_com(uchar com)
{
RS=0;
RW=0;//寫入
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶寫數(shù)據(jù)子函數(shù)
void write_date(uchar date)
{
RS=1;
RW=0;//寫入
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
LCD1602液晶設(shè)置當(dāng)前行
//void write_sfm(uchar hang,uchar add)
//{
// if(hang==1) //設(shè)置當(dāng)前行
// write_com(0x80+add);
// else
// write_com(0x80+0x40+add);
//}
/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '?') break;
write_date(*p);
p++;
}
}
//LCD1602液晶初始化子函數(shù)
void LCD1602_init()
{
uchar i;
a_team=0; //H.T分?jǐn)?shù)初始化
b_team=0; //R.T分?jǐn)?shù)初始化
time=0;
TMOD=0x10; //定時器1初始化
TL1=0x00;
TH1=0x4c; //設(shè)置定時器初值 定時器50ms一次中斷
EA=1; //開總中斷
ET1=1; //開定時器1
TR1=0; //定時器1不工作
E=0;
miao=0;
fen=12;//默認(rèn)單節(jié)比賽時間(單位分鐘)
num=1;
sec_24=24;
change_flag = 0;
write_com(0x38); //LCD設(shè)置初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80); //LCD顯示初始化
for(i=0;i<16;i++)
{
write_date(table1[i]);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table2[i]);
}
}
//分?jǐn)?shù)更新子函數(shù)
void point_lcd(uchar add,uchar dat)
{
write_com(0x80); //LCD顯示初始化
if(change_flag){
write_string(1,2,"B");
write_string(1,8,"A");
}else{
write_string(1,2,"A");
write_string(1,8,"B");
}
if(change_flag){
if(add == 0x04){
add = 0x0A;
}else if(add == 0x0A){
add = 0x04;
}
}
write_com(0x80+add);
write_date(0x30+dat/100);
write_date(0x30+(dat%100)/10);
write_date(0x30+dat%10);
write_com(0x80+add);
}
//按鍵掃描子函數(shù)
void keyscan()
{
uchar i=0;
i=Matrix_buttons_scan();//按鍵檢測
if(i==1) //A分?jǐn)?shù)加一
{
if(a_team<1000)a_team++;
point_lcd(0x04,a_team);
}
else if(i==2) //A分?jǐn)?shù)加二
{
if(a_team<1000)a_team=a_team+2;
point_lcd(0x04,a_team);
}
else if(i==3) //A分?jǐn)?shù)加三
{
if(a_team<1000)a_team=a_team+3;
point_lcd(0x04,a_team);
}
else if(i==4) //A分?jǐn)?shù)減一
{
if(a_team>=1)a_team=a_team-1;
point_lcd(0x04,a_team);
}
else if(i==5) //B分?jǐn)?shù)加一
{
if(b_team<1000)b_team++;
point_lcd(0x0A,b_team);
}
else if(i==6) //B分?jǐn)?shù)加二
{
if(b_team<1000)b_team=b_team+2;
point_lcd(0x0A,b_team);
}
else if(i==7) //B分?jǐn)?shù)加三
{
if(b_team<1000)b_team=b_team+3;
point_lcd(0x0A,b_team);
}
else if(i==8) //B分?jǐn)?shù)減一
{
if(b_team>=1)b_team=b_team-1;
point_lcd(0x0A,b_team);
}
else if(i==9) //交換
{
if(change_flag){
change_flag = 0;
}else{
change_flag = 1;
}
point_lcd(0x04,a_team);
point_lcd(0x0A,b_team);
}
else if(i==10) //
{
TR1=~TR1; //定時器1工作/暫停
if(TR1==1) //當(dāng)?shù)褂嫊r工作時,S1按下定時器立即停止工作
{
PT1=0;//取消定時器1優(yōu)先級最高
}
else //倒計時不工作時,S1按下倒計時立即工作
{
PT1=1;//定時器1優(yōu)先級最高
}
}
else if(i==11) //
{
sec_24=24;
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+sec_24/10); //更新倒計時時間
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
}
}
//比賽倒計時/24s倒計時
void counter_down()
{
if(time>=20) //每1s倒計時做減一操作
{
miao--;
sec_24--;
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+sec_24/10);
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
if(sec_24==0) //24s結(jié)束
{
sec_24=24;
TR1=0; //定時器1暫停
}
if((miao==0)&&(fen==0)) //檢測一節(jié)比賽是否結(jié)束
{
TR1=0; //定時器1暫停
write_com(0x80+0x44);
write_date(0x30);
num++;
sec_24=24; //24s計時復(fù)位
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+sec_24/10);
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
write_com(0x80+0x4b); //更新"SEC-?"
write_date(0x30+num);
write_com(0x80+0x4b);
miao=0; //倒計時復(fù)位
fen=12;
}
if(miao==-1)
{
miao=59;
fen--;
}
write_com(0x80+0x40); //更新倒計時顯示
write_date(0x30+fen/10);
write_date(0x30+fen%10);
write_com(0x80+0x43);
write_date(0x30+miao/10);
write_date(0x30+miao%10);
write_com(0x80+0x43);
time=0;
}
}
//主函數(shù)
void main()
{
LCD1602_init();
while(1)
{
keyscan(); //分?jǐn)?shù)按鍵檢測
}
}
4. 設(shè)計報告
9978字設(shè)計報告,內(nèi)容包括摘要,硬件設(shè)計、軟件設(shè)計、軟硬件框圖、調(diào)試、結(jié)論等
5. 設(shè)計資料內(nèi)容清單&&下載鏈接
資料設(shè)計資料包括仿真,程序代碼、講解視頻、功能要求、設(shè)計報告、軟硬件設(shè)計框圖等。
0、常見使用問題及解決方法–必讀?。。。?/p>
1、仿真圖
2、程序源碼注釋
3、功能要求
4、開題報告
5、設(shè)計報告
6、軟硬件流程框圖
7、燒錄工具
8、講解視頻
Altium Designer 安裝破解
filename.bat
KEIL+proteus 單片機(jī)仿真設(shè)計教程
KEIL安裝破解
Proteus安裝
Proteus簡易使用教程
單片機(jī)學(xué)習(xí)資料
普中-2&普中-3&普中-4開發(fā)板原理圖.pdf
相關(guān)數(shù)據(jù)手冊
答辯技巧
設(shè)計報告常用描述
鼠標(biāo)雙擊打開查找嘉盛單片機(jī)51 STM32單片機(jī)課程畢業(yè)設(shè)計.url