|
實(shí)訓(xùn)題目:籃球計(jì)分牌
1 系統(tǒng)設(shè)計(jì)
1.1 設(shè)計(jì)要求
1.1.1 設(shè)計(jì)任務(wù)
(1) 按照題目要求獨(dú)立設(shè)計(jì)系統(tǒng)所需電路,并完成硬件電路的制作及調(diào)試。(40分)
(2)結(jié)合硬件能夠正常計(jì)分(1,2,3)。(10分)
(3)能夠正常顯示分值。(10分)
(4)能夠正常修改工作模式(計(jì)分與24秒)。(10分)
(5)能夠24秒的誤差不小于1秒。(15分)
能夠兩隊(duì)球員犯規(guī)次數(shù)計(jì)數(shù)。
1.2 設(shè)計(jì)思路及設(shè)計(jì)框圖
1.2.1設(shè)計(jì)思路
通過(guò)利用STC89C52RC芯片進(jìn)行設(shè)計(jì),7個(gè)按鍵實(shí)現(xiàn)對(duì)應(yīng)功能:
(1)P1^3通過(guò)控制點(diǎn)對(duì)應(yīng)切換1隊(duì)和2隊(duì)加分。
(2)P1^0、P1^1、P1^2分別對(duì)應(yīng)+1、+2、+3分。
(3)P1^4計(jì)分清零
(4)P1^5對(duì)應(yīng)24秒倒計(jì)時(shí)和計(jì)分的轉(zhuǎn)換。
(5)P1^7外接復(fù)位鍵,對(duì)應(yīng)復(fù)位功能。
外加復(fù)位鍵,按下則數(shù)碼管顯示回到比分計(jì)分顯示,并清零;24秒倒計(jì)時(shí)至5秒時(shí)led燈依次點(diǎn)亮,倒計(jì)時(shí)結(jié)束時(shí)全部點(diǎn)亮。倒數(shù)為0時(shí)蜂鳴器響,重新倒數(shù)時(shí)蜂鳴器關(guān)閉。切換加分后24s倒計(jì)時(shí)會(huì)自動(dòng)重新計(jì)時(shí)。24s倒計(jì)時(shí)需要用定時(shí)器中斷方式0實(shí)現(xiàn),采用工作方式一。并且每秒的時(shí)長(zhǎng)要有晶振電路控制。
將12MHZ的石英晶體振蕩器和單片機(jī)對(duì)應(yīng)的引腳正確連接,將晶振產(chǎn)生的時(shí)鐘信號(hào)作為定時(shí)信號(hào)。籃球計(jì)分牌分為三個(gè)部分:開(kāi)關(guān)控制、數(shù)碼管顯示和警示電路。P主要在籃球比賽中用于記錄24秒犯規(guī)計(jì)時(shí)和顯示紅藍(lán)兩隊(duì)在比賽過(guò)程中的比分情況,本計(jì)時(shí)計(jì)分器有兩部分組成:一部分用來(lái)實(shí)現(xiàn)計(jì)時(shí)功能,其基本原理和定時(shí)鬧鐘相似;另一部分用來(lái)實(shí)現(xiàn)計(jì)分功能,其基本原理和計(jì)數(shù)器相似,只不過(guò)所要記錄和顯示的對(duì)象分別是按鍵按下的次數(shù)和掃描脈沖次數(shù)。
1.2.2總體設(shè)計(jì)框圖
2 各個(gè)模塊程序的設(shè)計(jì)
2.1 AT89S52芯片模塊
本次實(shí)驗(yàn)所用到的主要芯片,AT89S52是美國(guó)ATMEL公司生產(chǎn)的低電壓,高性能CMOS8位單片機(jī),片內(nèi)含4K bytes的可反復(fù)擦寫的只讀程序存儲(chǔ)器(PEROM)和128 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),期間采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和Flash存儲(chǔ)單元,功能強(qiáng)大AT89S52單片機(jī)可為您提供許多高性價(jià)比的應(yīng)用場(chǎng)合,可靈活應(yīng)用于各種控制領(lǐng)域。
2.2振蕩電路模塊
晶振模塊給電路提供一定頻率的穩(wěn)定的震蕩(脈沖)信號(hào)。
2.3數(shù)碼管顯示模塊
排阻保護(hù)電路使數(shù)碼管正常輸出相應(yīng)的數(shù)據(jù)信息。
2.4 LED電路
通過(guò)LED燈來(lái)指示隊(duì)伍、提示犯規(guī)、計(jì)時(shí)提示等功能。
2.5按鍵模塊
按鍵控制加分、切換、計(jì)時(shí)控制等。
2.6電源部分
為電路提供電源,使其工作。
2.7復(fù)位模塊
作用是將單片機(jī)復(fù)位,將單片機(jī)初始化。
3 調(diào)試過(guò)程
3.1制作過(guò)程
n 設(shè)計(jì)電路原理圖;
n 上網(wǎng)查閱C51管腳及數(shù)碼管管腳資料;
n 把器件安在打好孔的萬(wàn)用板上,然后焊接;
n 焊接好后,接通5V電源,檢查電路是否顯示正常;
n 根據(jù)硬件寫出實(shí)現(xiàn)實(shí)訓(xùn)要求的對(duì)應(yīng)程序,并進(jìn)行調(diào)試,直到能全部正確實(shí)現(xiàn)要求的功能。
4 功能測(cè)試
4.1 測(cè)試儀器與設(shè)備
n 單片機(jī)程序下載線 1條
n 萬(wàn)用表 1個(gè)
n PC機(jī) 1臺(tái)
4.2 性能指標(biāo)測(cè)試
1、指標(biāo)測(cè)試:以實(shí)現(xiàn)兩隊(duì)比分的正確顯示,可以進(jìn)行24S正常倒計(jì)時(shí)并報(bào)警,能記兩隊(duì)的1分2分3分。
2、軟件調(diào)試還算順利,沒(méi)有太大的問(wèn)題。
3、第一次硬件調(diào)試時(shí),發(fā)現(xiàn)有一盞LED沒(méi)有亮,確定是LED燈壞了便從新焊上一個(gè)好的。
4、拆掉所有跳線后,被指出所有的按鍵連接錯(cuò)誤,這些按鍵內(nèi)部結(jié)構(gòu)是對(duì)腳線相連。于是重連按鍵。刪掉原理圖中不需要的元器件,直接按著原理圖焊接跳線。
4.3 誤差分析
倒計(jì)時(shí)24s在倒計(jì)時(shí)方面時(shí)和現(xiàn)實(shí)的時(shí)間存在點(diǎn)小誤差,但是誤差很小可以忽略.感覺(jué)軟件方面沒(méi)有什么問(wèn)題,硬件上按鍵不是很靈敏,可能是線路接觸不良。數(shù)碼管驗(yàn)收出現(xiàn)小問(wèn)題,是管腳虛焊導(dǎo)致的。
5 實(shí)訓(xùn)心得體會(huì)
通過(guò)這次實(shí)訓(xùn),讓我學(xué)習(xí)了很多。這次實(shí)訓(xùn)應(yīng)該算是目前最難得一次實(shí)訓(xùn)吧。輔導(dǎo)老師給了基本的原理圖,然后經(jīng)過(guò)自己百度和同學(xué)幫助下完善了原理圖。然后自己根據(jù)原理圖焊了很久,最后焊完時(shí)讓同學(xué)幫我下載程序,結(jié)果程序下載不進(jìn)去,最后在學(xué)霸的幫助下解決了這個(gè)下問(wèn)題。驗(yàn)收的時(shí)候我看其他同學(xué)都有好多的功能,感覺(jué)自己的功能略少,心里一陣緊張。不過(guò)幸運(yùn)的是基本功能還是能實(shí)現(xiàn)的。就是驗(yàn)收的時(shí)候出現(xiàn)了一點(diǎn)小問(wèn)題,數(shù)碼管段選除了一些問(wèn)題,應(yīng)該是數(shù)碼管管腳虛焊,但是在宿舍前一晚還好,以后要是在做實(shí)訓(xùn)要加強(qiáng)焊接
總的來(lái)說(shuō)過(guò)程是最重要的,很開(kāi)心自己能夠完成這次實(shí)訓(xùn),在這過(guò)程中又讓我學(xué)很多知識(shí)。每次焊接雖然都要到晚上兩點(diǎn) ,雖然很累但是發(fā)現(xiàn)問(wèn)題解決問(wèn)題讓我信心滿滿,這次實(shí)訓(xùn)讓我明白了不要老想著靠別人自己動(dòng)手操作一根根的去找,按照原理圖一根去接會(huì)發(fā)現(xiàn)問(wèn)題出在哪里,以前只想出現(xiàn)問(wèn)題了去找大神幫忙,但是這次實(shí)訓(xùn)給了我很大的信心,雖然我每次實(shí)訓(xùn)都是一波三折,但是這也代表我不放棄所以以后做實(shí)訓(xùn)一定要自己査好資料,出現(xiàn)問(wèn)題了先自己解決,在回答問(wèn)題上我準(zhǔn)備的還是不夠充分,本來(lái)在前一天晚上看到了兩點(diǎn),一直再看原理圖,但是關(guān)于周期和程序問(wèn)題還是沒(méi)回答上,不過(guò)在動(dòng)手能力上又增強(qiáng)了很多信心!也謝謝兩位老師開(kāi)題的指導(dǎo),衷心謝謝老師。
附錄
附錄1:原理圖
附錄2:程序清單
#include<reg52.H> //*****頭文件*****//
#define ucharunsigned char //*定義變量*//
#define uint unsigned int //*定義uint為無(wú)符號(hào)整形變量*//
unsigned t =0x3cb0;
uchar CZ=24; //*計(jì)時(shí)初值*//
uchar key=0;
uchar score;
uchar mode=1;//*模式變量*//
uchar score1=0; //*甲隊(duì)得分變量*//
ucharscore2=0; //*乙隊(duì)得分變量*//
ucharbittime=0,bitdisplay=0; //*定義變量*//
uchar codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //*段碼0,1,2,3,4,5,6,7,8,9*//
sbit J0=P1^0; //*獨(dú)立按鍵 *//
sbit J1=P1^1;
sbit J2=P1^2;
sbit J3=P1^3;
sbit J4=P1^4;
sbit J5=P1^5;
sbit J6=P1^6;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
sbit LED3 = P3^6;
sbit LED4 = P3^7;
sbit SPK=P1^7;
/********延時(shí)函數(shù)******/
void delay(ucharz)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/* 服務(wù)程序*/
void timer0 (void)interrupt 1 using 0
{
TH0=0x3c; //*50ms*//
TL0=0xb0;
bittime++; //每來(lái)一次中斷,中斷次數(shù)bittime自加1
while(bittime==20)
{
bittime=0; //每經(jīng)一秒調(diào)用一次顯示程序
bitdisplay=1;
if(bitdisplay)
{
bitdisplay = 0;
CZ--;
if(-1 == CZ) CZ=24;
}
}
}
/* 甲隊(duì)分?jǐn)?shù)顯示函數(shù)*/
voiddisplay_1(uint z)
{
P2 = 0XFD; /*11111101甲隊(duì)個(gè)位分?jǐn)?shù)顯示*/
P0 = tab[z%10];
delay(10);
P2 = 0XFE; /*11111110甲隊(duì)十位分?jǐn)?shù)顯示*/
P0 = tab[z/10];
delay(10);
}
/* 乙隊(duì)分?jǐn)?shù)顯示函數(shù)*/
voiddisplay_2(uint z)
{
P2 = 0Xfb; /*11110111乙隊(duì)個(gè)位分?jǐn)?shù)顯示*/
P0 = tab[z%10];
delay(10);
P2 = 0Xf7; /*11111011乙隊(duì)十位分?jǐn)?shù)顯示*/
P0 = tab[z/10];
delay(10);
}
/* 甲分?jǐn)?shù)處理函數(shù)*/
int inc1()
{
if(~J3)
{
delay(10);
score1=score1+1;
}while(~J3);
if(~J4)
{
delay(10);
score1= score1+2;
}while(~J4);
if(~J5)
{
delay(10);
score1=score1+3;
}while(~J5);
returnscore1;
}
/* 乙分?jǐn)?shù)處理函數(shù)*/
int inc2()
{
if(~J3)
{
delay(10);
score2=score2+1;
}while(~J3);
if(~J4)
{
delay(10);
score2= score2+2;
}while(~J4);
if(~J5)
{
delay(10);
score2=score2+3;
}while(~J5);
returnscore1;
}
/* 甲乙隊(duì)切加分換處理函數(shù)*/
uchar turn()
{
if(~J2)
{
delay(10);
if(~J2)
{
delay(10);
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 1;
key = 1;
}while(~J2);
}
if(~J6)
{
delay(10);
if(~J6)
{
delay(10);
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
key = 2;
}while(~J6);
}
return key;
}
/* 加分顯示函數(shù)*/
void marks()
{
turn();
if(key== 1)
{
inc1();
if(score1<100)
{
display_1(score1);
display_2(score2);
}
else score1 =score1-100;
}
elseif(key == 2)
{
inc2();
if(score2<100)
{
display_1(score1);
display_2(score2);
}
else score2 = score2-100;
}
}
/*模式選擇函數(shù)*/
ucharmode_select()
{
if(~J0)
{
delay(10);
if(~J0)
{
delay(10);
mode = 1;
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
}while(~J0);
}
if(~J1)
{
delay(10);
if(~J1)
{
delay(10);
mode = 2;
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 1;
}while(~J1);
}
return mode;
}
/*倒計(jì)時(shí)處理*/
void time_count()
{
TR0 = 1;
P2 = 0XFD; /*11111010甲乙十位顯示*/
P0 = tab[CZ/10];
delay(10);
P2 = 0XFB; /*11110101甲乙個(gè)位顯示*/
P0 = tab[CZ%10];
delay(10);
}
/* 主函數(shù)*/
int main()
{
TMOD= 0x01;
TH0=0x3c;
TL0=0xb0;
EA = 1; //cpu允許所有中斷
ET0 =1;//定時(shí)器T0中斷允許
TR0 = 0;//關(guān)閉定時(shí)器T0
P2 = 0XF0;
P0 = 0x3f;
SPK=0;
while(1)
{
mode_select();
if(1 == mode) //加分功能
{
TR0 = 0;//關(guān)閉定時(shí)器
CZ = 24; //重新賦初值24秒
display_1(score1);
delay(10);
display_2(score2);
marks();
}
if(2== mode) //計(jì)時(shí)功能
{
if(CZ == 0){TR0 = 0,SPK=1;delay(30);SPK =0;
foul_sever();
}
time_count();}
}
return 0;
}
|
評(píng)分
-
查看全部評(píng)分
|