• 方案介紹
    • 1.主要功能:
    • 講解視頻:
    • 2.仿真
    • 3. 程序代碼
    • 4. 設計報告
    • 5. 設計資料內(nèi)容清單&&下載鏈接
  • 附件下載
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

【普中開發(fā)板】基于51單片機的籃球計分器液晶LCD1602顯示( proteus仿真+設計報告)

2024/11/05
2342
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

設計資料獲取聯(lián)系方式.doc

共1個文件

基于51單片機的籃球計分器液晶LCD1602顯示( proteus仿真+程序+設計報告+實物仿真講解視頻)

仿真圖proteus8.16(有低版本)

程序編譯器:keil 4/keil 5

編程語言:C語言

設計編號:P09

1.主要功能:

基于51單片機AT89C51/52(與AT89S51/52、AT89C51/52、STC89C51/52等51內(nèi)核單片機通用)

基于51單片機的籃球計分器液晶LCD1602顯示

設計內(nèi)容:

1、設計LCD顯示籃球比賽計時計分牌。

2、通過加分按鈕可以給A隊或B隊加分。

3、設計對調(diào)功能,A隊和B隊分數(shù)互換,意味著中場交換場地。

4、顯示比賽倒計時功能。

5、創(chuàng)新內(nèi)容:

如顯示第幾小節(jié)。

可以通過按鍵完成+1、+2、+3、-1操作。

籃球比賽24秒進攻倒計時功能

(目前僅完全適配普中開發(fā)板A234,其他普中開發(fā)板型號可能需要做代碼修改或接線)

需注意仿真中51單片機芯片是兼容的,AT89C51,AT89C52是51單片機的具體型號,內(nèi)核是一樣的。相同的原理圖里,無論stc還是at都一樣,引腳功能都是一樣的,程序是兼容的,芯片可以替換為STC89C52/STC89C51/AT89C52/AT89C51等51單片機芯片。

以下為本設計資料展示圖:

講解視頻:

仿真講解+代碼講解

img

2.仿真

開始仿真

打開仿真工程,雙擊proteus中的單片機,選擇hex文件路徑,然后開始仿真。

以上仿真結果均符合設計要求。

img

3. 程序代碼

使用keil4或者keil5編譯,代碼有注釋,可以結合報告理解代碼含義。

img

主要代碼


//延時子函數(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液晶設置當前行
//void write_sfm(uchar hang,uchar add)
//{
//	if(hang==1)   			   //設置當前行
//		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分數(shù)初始化
	b_team=0;    //R.T分數(shù)初始化
	time=0;
	TMOD=0x10;    //定時器1初始化 
	TL1=0x00;
	TH1=0x4c;  //設置定時器初值 定時器50ms一次中斷
	EA=1;     //開總中斷
	ET1=1;     //開定時器1
	TR1=0;     //定時器1不工作

	E=0; 
	miao=0;
	fen=12;//默認單節(jié)比賽時間(單位分鐘)
	num=1;
	sec_24=24;
	change_flag = 0;
	write_com(0x38);  //LCD設置初始化
	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]);
	}
}
//分數(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分數(shù)加一
	{
		if(a_team<1000)a_team++;
  		point_lcd(0x04,a_team);  	
	}
	else if(i==2)    //A分數(shù)加二
	{
		if(a_team<1000)a_team=a_team+2;
  		point_lcd(0x04,a_team);
	}
	else if(i==3)    //A分數(shù)加三
	{
		if(a_team<1000)a_team=a_team+3;
  		point_lcd(0x04,a_team);
	}
	else if(i==4)    //A分數(shù)減一
	{
		if(a_team>=1)a_team=a_team-1;
  		point_lcd(0x04,a_team);
	}
	else if(i==5)    //B分數(shù)加一
	{
		if(b_team<1000)b_team++;
  		point_lcd(0x0A,b_team);
	}
	else if(i==6)    //B分數(shù)加二
	{
		if(b_team<1000)b_team=b_team+2;
		point_lcd(0x0A,b_team);
	}
	else if(i==7)    //B分數(shù)加三
	{
		if(b_team<1000)b_team=b_team+3;
		point_lcd(0x0A,b_team);
	}
	else if(i==8)    //B分數(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)  //當?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結束
  		{
   			sec_24=24;
			TR1=0;     //定時器1暫停
  		}
  		if((miao==0)&&(fen==0))  //檢測一節(jié)比賽是否結束
  		{
   			TR1=0;     //定時器1暫停
   			write_com(0x80+0x44);
   			write_date(0x30);
   			num++;
   			sec_24=24;    //24s計時復位
   			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;     //倒計時復位
			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();  //分數(shù)按鍵檢測
	}
}

4. 設計報告

9978字設計報告,內(nèi)容包括摘要,硬件設計、軟件設計、軟硬件框圖、調(diào)試、結論等

img

5. 設計資料內(nèi)容清單&&下載鏈接

資料設計資料包括仿真,程序代碼、講解視頻、功能要求、設計報告、軟硬件設計框圖等。

0、常見使用問題及解決方法–必讀?。。?!

1、仿真圖

2、程序源碼注釋

3、功能要求

4、開題報告

5、設計報告

6、軟硬件流程框圖

7、燒錄工具

8、講解視頻

Altium Designer 安裝破解

filename.bat

KEIL+proteus 單片機仿真設計教程

KEIL安裝破解

Proteus元器件查找

Proteus安裝

Proteus簡易使用教程

單片機學習資料

普中-2&普中-3&普中-4開發(fā)板原理圖.pdf

相關數(shù)據(jù)手冊

答辯技巧

設計報告常用描述

鼠標雙擊打開查找嘉盛單片機51 STM32單片機課程畢業(yè)設計.url

資料下載鏈接(可點擊):

  • 設計資料獲取聯(lián)系方式.doc
    下載

相關推薦