《課程設(shè)計(論文)-基于51單片機(jī)的搶答器設(shè)計.doc》由會員分享,可在線閱讀,更多相關(guān)《課程設(shè)計(論文)-基于51單片機(jī)的搶答器設(shè)計.doc(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1. 系統(tǒng)設(shè)計1.1設(shè)計要求1、 需要自己設(shè)計電路并焊接電路板。2、 基本要求:有一個主持人控制開關(guān)和6路搶答按扭,當(dāng)主持人允許搶答時才能進(jìn)行搶答操作,并用一個數(shù)碼管顯示搶答選手的號碼,同時其他選手不能再搶答。3、 當(dāng)主持人允許搶答后倒計時5秒時間,在這5秒內(nèi)搶答有效,過后就不能進(jìn)行搶答了。4、 電路上要加個蜂鳴器的電路,當(dāng)有選手搶答時蜂鳴器響一下。5、 當(dāng)有選手搶答后,進(jìn)行倒計時20秒作為選手回答問題時間,用兩個數(shù)碼管顯示,倒計時時間到時有聲光提示。6、 畫電路板時要增加下載接口,方便調(diào)試程序。7、 擴(kuò)展功能(選做),8、 用按鍵可設(shè)置倒計時的時間,范圍在5秒到30秒之間。1.2設(shè)計原理1.
2、3總體思路 以AT89S52單片機(jī)為核心的單片機(jī),通過相應(yīng)的程序,并且通過按鍵來進(jìn)行電平識別,再由單片機(jī)輸出相應(yīng)的程序,并將相應(yīng)數(shù)值通過數(shù)碼管來顯示。1.4設(shè)計方案通過平時所學(xué)知識、查找資料和老師的答疑。我得到了正確的交通燈原理圖,在正確的電路圖前提下進(jìn)行編程把程序燒到52芯片里,再把芯片連接到電路板上通過52芯片實現(xiàn)程序功能,實現(xiàn)步驟如下:通過P1.0到P1.7分別控制按鍵一到八,P0控制位選,P2.3控制段選,這樣就能基本達(dá)到了老師給我們搶答器 的要求了。2、模塊電路的設(shè)計2.1 2.1 數(shù)碼管顯示模塊 由于單片機(jī)的P0口沒有上拉電阻,當(dāng)它做為輸出時,需要對其接上拉電阻。因為P0口做為數(shù)碼
3、管的段選輸出,所以要在P0口接一個1K的排阻。P2口做為數(shù)碼管的位選,任選其4個IO口接線,就可以了,然后利用軟件來控制四個數(shù)碼管的亮滅。2.2 八個選手按鍵輸入 當(dāng)按鍵按下時,對P1口輸入低電平,通過程序讀取低電平的IO口,然后進(jìn)行鎖存,對數(shù)碼管做相應(yīng)的輸出,提供搶答選手號數(shù)。2.3 蜂鳴器輸出 蜂鳴器電路是利用NPN開關(guān)電路,當(dāng)基極為高電平時,三極管導(dǎo)通;當(dāng)為低電平時,三極管截止。利用這一特性,可以畫出蜂鳴器的電路圖3、程序編寫調(diào)試過程 #include #define uchar unsigned char#define uint unsigned int位定義sbit s1=P30;
4、sbit led=P33;sbit fmq=P34;段碼表 uchar tab=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0X07,0 x7f,0 x6f; 定義字符型變量uchar flag1,flag2,num,m1,m,m2,t;延時程序void ys(uchar z) uchar i,j;for(i=z;i0;i-)for(j=0;j150;j+);void uinit()/初始化fmq = 0;TMOD=0X01; TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;num=0;m2=
5、0;m1=0;led=0;flag2=1;void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;t+;if(t=20&flag2=0) t=0;if(m1=0) TR0=0; flag2=1; /flag1=0; led=1; fmq=1;else m1-; if(t=20&flag1=1&flag2=1) t=0;m1=m%10;m2=m/10;if(m=0) m=0;led=1;fmq=1; else m-;led=0;fmq=0; void key() if(s1=0) ys(10); if(s1=0)
6、flag1=1;m1=5;flag2=0;num=0;led=0;m2=0;TR0=1;fmq=0; if( flag2=0) switch(P1) case 0 xfe:TR0=0;num=1;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xfd:TR0=0;num=2;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xfb:TR0=0;num=3;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xf7:TR0=0;num=4;flag2=1;m=20;led=1;
7、fmq=1;TR0=1;break; case 0 xef:TR0=0;num=5;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xdf:TR0=0;num=6;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xbf:TR0=0;num=7;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 x7f:TR0=0;num=8;flag2=1;m=20;led=1;fmq=1;TR0=1;break; main()uchar k;uinit();while(1) key();
8、k=0;switch(k) case 0:P2=0XFe;P0=tabm2;ys(5);case 1:P2=0XFd;P0=tabm1;ys(5);case 2:P2=0XFb;P0=0 x40;ys(5);case 3:P2=0XF7;P0=tabnum;ys(5); 4、焊接制作與調(diào)試過程 焊接制作過程:這次我們用的是萬用板,直接焊接。先把器件布局,布局好以后,再把各個幾件焊上去,最后再根據(jù)PCB圖用絕緣線或者焊錫把各個器件,芯片連接起來。調(diào)試過程:把程序燒進(jìn)芯片后開始接電源,看看結(jié)果。如果出現(xiàn)亂碼 哪檢查線路沒問題后 就看看程序的接口有沒有錯,主要問題就是在接口上。5、心得體會 通過這次
9、實訓(xùn),我不僅提高了Keil uVision3 , Protel 99 SE這些應(yīng)用程序的運用,還讓我懂得了如何編寫一些簡單的程序,學(xué)會了如何制作單片機(jī)應(yīng)用程序,還有焊接和程序固化,這幾天我經(jīng)過老師耐心的講解和指導(dǎo)通過自己認(rèn)真的動手操作,終于將一個完整的裝有程序的單片機(jī)芯片版制作出來了。但在實訓(xùn)中間暴露出很多問題:對平時上課講的理論知識沒有完全掌握消化,到了實際操作中還得請教老師和同學(xué),在焊接中焊接的基本工夫掌握不到家,手上工夫還是很欠缺的,使得電路板不是很美觀。這些問題的發(fā)現(xiàn),有助于提高我在以后的工作和學(xué)習(xí)中對此類問題的認(rèn)識,確保不在同一問題上再次犯錯。給我的一個最大的感觸就是一個好的電工不應(yīng)
10、該只會接線,而是會發(fā)現(xiàn)錯誤,改正錯誤。這次實訓(xùn)不僅加深了我們對知識的理解,更重要的是提高了我們的動手能力,增強(qiáng)了我對電工學(xué)習(xí)的熱愛,增加了學(xué)習(xí)的動力和興趣。6、參考文獻(xiàn)1.單片機(jī)C語言編程與實例趙亮、侯國瑞 人民郵電出版社 2.例說8051 張義和編著 人民郵電出版社 7附錄(程序和原理圖)1PCB圖2原理圖3 源程序#include #define uchar unsigned char#define uint unsigned intsbit s1=P30;sbit led=P33;sbit fmq=P34; uchar tab=0 x3f,0 x06,0 x5b,0 x4f,0 x66,
11、0 x6d,0 x7d,0X07,0 x7f,0 x6f;uchar flag1,flag2,num,m1,m,m2,t;void ys(uchar z) uchar i,j;for(i=z;i0;i-)for(j=0;j150;j+);void uinit()/初始化fmq = 0;TMOD=0X01; TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;num=0;m2=0;m1=0;led=0;flag2=1;void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-500
12、00)%256;t+;if(t=20&flag2=0) t=0;if(m1=0) TR0=0; flag2=1; /flag1=0; led=1; fmq=1;else m1-; if(t=20&flag1=1&flag2=1) t=0;m1=m%10;m2=m/10;if(m=0) m=0;led=1;fmq=1; else m-;led=0;fmq=0; void key() if(s1=0) ys(10); if(s1=0) flag1=1;m1=5;flag2=0;num=0;led=0;m2=0;TR0=1;fmq=0; if( flag2=0) switch(P1) case 0
13、xfe:TR0=0;num=1;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xfd:TR0=0;num=2;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xfb:TR0=0;num=3;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xf7:TR0=0;num=4;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xef:TR0=0;num=5;flag2=1;m=20;led=1;fmq=1;TR0=1;break; ca
14、se 0 xdf:TR0=0;num=6;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 xbf:TR0=0;num=7;flag2=1;m=20;led=1;fmq=1;TR0=1;break; case 0 x7f:TR0=0;num=8;flag2=1;m=20;led=1;fmq=1;TR0=1;break; main()uchar k;uinit();while(1) key();k=0;switch(k) case 0:P2=0XFe;P0=tabm2;ys(5);case 1:P2=0XFd;P0=tabm1;ys(5);case 2:P2=0XFb;P0=0 x40;ys(5);case 3:P2=0XF7;P0=tabnum;ys(5);