01課程設計目的
單片機原理及應用課程設計是學生綜合運用所學知識,全面掌握單片微型計算機及其接口的工作原理、編程和使用方法的重要實踐環節。通過獨立或協作提出并論證設計方案,進行軟、硬件調試,最后獲得正確的運行結果,可以加深和鞏固對理論教學和實驗教學內容的掌握,進一步建立計算機應用系統整體概念,初步掌握單片機軟、硬件開發方法。
根據單片機原理及應用課程的要求,主要進行兩個方面的設計,即單片機最小系統和存儲器擴展設計、接口技術應用設計。其中,單片機最小系統主要要求學生熟悉單片機的內部結構和引腳功能、引腳的使用、復位電路、時鐘電路、4個并行接口和一個串行接口的實際應用,從而可構成最小應用系統,并編程進行簡單使用。
存儲器擴展設計要求學生掌握常用半導體芯片與單片機的接口,如EPROM存儲器用作外部程序存儲器時與單片機的連接關系,SRAM存儲器用作外部數據存儲器時與單片機的連接關系,E2PROM存儲器用作外部程序/數據存儲器時與單片機的連接關系。能合理分配和使用單片機的內部和外部存儲器,編程實現正常的讀寫功能。
02課程設計的任務與要求
2.1課程設計的任務
根據所學的單片機知識,設計一個八路的電子搶答器系統,實現功能為:可供8個選手使用,可顯示30s倒計時,并可顯示出搶到的選手號。
2.2課程設計要求
(1)設計出硬件電路;
(2)設計出軟件編程方法,并寫出源代碼;
03設計方案與論證
3.1設計方案
系統采用51系列單片機AT89C51作為控制核心,該系統可以完成運算控制、信號識別以及顯示功能的實現。由于用了單片機,使其技術比較成熟,應用起來方便、簡單并且單片機周圍的輔助電路也比較少,便于控制和實現。整個系統具有極其靈活的可編程性,能方便地對系統進行功能的擴張和更改。
3.2方案論證
(1)可靠性好:單片機按照工業控制要求設計,抵抗工業噪聲干擾優于一般的CPU,程序指令和數據都可以寫在ROM里,許多信號通道都在同一芯片,因此可靠性高,易擴充。
(2)單片機有一般電腦所必須的器件,如三態雙向總線,串并行的輸入及輸出引腳,可擴充為各種規模的微電腦系統。
(3) 控制功能強:單片機指令除了輸入輸出指令,邏輯判斷指令外還有更豐富的條件分支跳躍指令。
04設計原理及功能介紹
4.1設計原理
八路搶答器的工作原理是利用單片機的定時器T0、T1中斷完成,其余狀態循環調用顯示子程序,用4個共陰極LED數碼管來顯示,用P0口作為數碼管的八個段選,用P2口中的P2.0、P2.1、P2.2、作為4個數碼管其中3個位選,P1口接8個按鍵,提供選手搶答,P3.0-P3.5四個接四個按鍵,提供開始、結束、答題時間調整、搶答時間調整,加1、減1調整之用
接通電源后,主持人將開關撥到“清除”狀態,搶答器處于禁止狀態,編號顯示器滅燈,定時器顯示設定時間;主持人將開關置,“開始”狀態,宣布“開始”搶答器工作。定時器倒計時,揚聲器給出聲響提示。選手在定時時間內搶答時,搶答器完成:優先判斷、編號鎖存、編號顯示、揚聲器等提示。當一輪搶答之后,定時器停止、禁止二次搶答、定時器顯示剩余時間。如果再次搶答必的條件分支跳躍指令。其原理框圖如4-1所示
4-1八路搶答器原理框圖
4.2功能介紹
(1)如果想調節搶答時間或答題時間,按"搶答時間調節"鍵或"答題時間調節"鍵進入調節狀態,此時會顯示現在設定的搶答時間或回答時間值,如想加一秒按一下"加1s"鍵,如果想減一秒按一下"-1s"鍵,時間LED上會顯示改變后的時間,調整范圍為0s~99s, 0s時再減1s會跳到99,99s時再加1s會變到0s。
(2)主持人按"搶答開始"鍵,會有提示音,并立刻進入搶答倒計時(預設30s搶答時間),如有選手搶答,會有提示音,并會顯示其號數并立刻進入回答倒計時(預設60s搶答時間),不進行搶答查詢,所以只有第一個按搶答的選手有效。倒數時間到小于5s會每秒響一下提示音。
(3)如倒計時期間,主持人想停止倒計時可以隨時按"停止"按鍵,系統會自動進入準備狀態,等待主持人按"搶答開始"進入下次搶答計時。
(4)如果主持人未按"搶答開始"鍵,而有人按了搶答按鍵,犯規搶答,LED上不斷閃爍FF和犯規號數并響個不停,直到按下"停止" 鍵為止。
(5)P3.0為開始搶答,P3.1為停止,p1.0-p1.7為八路搶答輸入 數碼管段選P0口,位選P2口低3位,蜂鳴器輸出為P3.6口。P3.2搶答時間調整結,P3.3回答時間調整,P3.4為時間加1調整,P3.5為時間減1調整。
05單元電路設計
5.1時鐘電路
5-1時鐘電路圖
一般選用石英晶體振蕩器。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產生幅度為3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率確定。電路中有兩個電容C1,C2它們的主要作用為:一是幫助振蕩器起振;二是對振蕩器的頻率進行微調。C1,C2的典型值為30PF。
單片機在工作時,由內部振蕩器產生或由外直接輸入的送至內部控制邏輯單元的時鐘信號的周期稱為時鐘周期。其大小是時鐘信號頻率的倒數,常用fosc表示。如時鐘頻率為12MHz,即fosc=12MHz,則時鐘周期為1/12μs。
5.2復位電路
AT89C51的復位由外部的復位電路實現。復位電路通常采用上電自動復位和按鈕復位兩種方式。本次設計采用按鈕復位方式。
單片機的第9腳RST為硬件復位端,只要持續4個機器周期的高電平即可實現復位,硬件復位后的各狀態可知寄存器以及存儲器的值都恢復到了初始值。
5-2復位電路圖
5.3數碼管顯示電路
本次課程設計采用了7SEG-MPX2-CC 的兩位7段共陰極數碼管,用來顯示30s倒計時,和7SEG-MPX1-CC的一位7段共陰極數碼管,用來顯示搶答中的選手號碼。位選端分別與P2口的第七位,第六位以及第零位相接。同時7段數碼管線段通過上拉電阻接power,實現數碼管的點亮。
5-3數碼管顯示電路圖
5.4報警電路
這里能利用程序來控制單片機P3.7口線反復輸出高電平或低電平,即在該口線上產生一定頻率的矩形波,接上揚聲器就能發出一定頻率的聲音,再利用延時程序控制“高”“低”電平的持續時間,就能改變輸出頻率,從而改變音調,使揚聲器發出不同的聲音,由于材料有限,本次實驗采用發光二極管代替報警器。
5-4報警電路圖
5.5按鈕輸入電路
5-5按鈕電路圖
8個按鈕接P1口,表示8個選手的搶答按鈕,一個總開關接P3.0口負責啟動定時程序。
06軟件調試過程及結果
6.1調試過程
(1)軟件調試
問題1:選手搶答后計時未停止。
解決辦法:在if語句判斷按鈕是否按下后,增加TR0=0語句,使計時器停止計時。
問題2:倒計時開始之前,以及選手搶答后都可按下按鈕。
解決辦法:增加檢測變量n,當TR0為1是n為1,當n為1時才開始檢測是否有鍵按下,一旦有鍵按下n置為0,此后按鍵均無效。
(2)硬件仿真調試
問題1:七段數碼管不亮
解決辦法:開始采用Input作為數碼管電源,改為power后顯示正常。
問題2:一位七段數碼管管腳較密集無法正常畫線
解決辦法:在走線困難的地方按住ctrl鍵即可。
6.2調試結果
(1) keil uVision3
6.2.2 proteus
(2)開始計時
(3)7號選手搶答
07
總結
經過一周的單片機課程設計,終于完成了八路搶答器的設計,不僅基本上達到設計要求,而且還是收獲良多。通過這次課程設計,使我更進一步地熟悉了單片機芯片的工作原理和其具體的使用方法。單片機課程設計重點就在于軟件算法的設計,需要有很巧妙的程序算法,這鍛煉了自己獨立思考問題的能力和通過查看相關資料來解決問題的習慣。還有了解了課程設計的一般步驟,和設計中應注意的問題。
設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。下面我對整個設計的過程做一下簡單的總結。第一,接到任務以后進行選題。選題是設計的開端,選擇恰當的、感興趣的題目,這對于整個設計是否能夠順利進行關系極大。好比走路,這開始的第一步是具有決定意義的,第一步邁向何方,需要慎重考慮。否則,就可能走許多彎路、費許多周折,甚至南轅北轍,難以到達目的地。因此,選;題時一定要考慮好了。第二,題目確定后就是找資料了。查資料是做設計的前期準備工作,好的開端就相當于成功了一半,到圖書館、書店、資料室去雖說是比較原始的方式,但也有可取之處的。總之,不管通過哪種方式查的資料都是有利用價值的,要一一記錄下來以備后用。第三,通過上面的過程,已經積累了不少資料,對所選的題目也大概有了一些了解,這一步就是在這樣一個基礎上,綜合已有的資料來更透徹的分析題目。第四,有了研究方向,就應該動手實現了。其實以前的三步都是為這一步作的鋪墊。通過這次設計,我對數字電路設計中的邏輯關系等有了一定的認識,對以前學的數字電路又有了一定的新認識,溫習了以前學的知識,就像人們常說的溫故而知新嘛,但在設計的過程中,遇到了很多的問題,有一些知識都已經不太清楚了,但是通過一些資料又重新的溫習了一下數字電路部分的內容。在這次設計中也使我們的同學關系更進一步了,同學之間互相幫助,有什么不懂的大家在一起商量,聽聽不同的看法我們更好的理解知識,所以在這里非常感謝幫助我的同學。
在此要感謝我的指導老師,感謝老師給我這樣的機會鍛煉。在整個設計過程中我懂得了許多東西,也培養了我獨立工作的能力,樹立了對自己工作能力的信心,相信會對今后的學習工作生活有非常重要的影響。而且大大提高了動手的能力,使我充分體會到了在創造過程中的探索的艱難和成功的喜悅。雖然這個項目還不是很完善,但是在設計過程中所學到的東西是這次設計的最大收獲和財富,使我終身受益。
參考文獻
[1] 張毅剛.單片機原理及應用[M].高等教育出版社 2003.
[2] 王章瑞.單片機課程實驗及課程設計指導書[J]. 西南石油大學 2013.
[3] 李光飛.單片機課程設計實例指導[J].北京航天航空大學出版社 2004.
[4] 馮育長.單片機系統設計與實例指導[J].西安電子科技大學出版社2007.
[5] 王冬梅等.基于單片機的八路搶答器設計與實現[M].佳木斯大學學報 2009.
[6] 吳亦峰、陳德為.單片機原理與接口技術[M]. 北京:電子工業出版社.2005.
[7] 周潤景、張麗娜.基于PROTEUS的電路及單片機仿真[M]. 北京: 航空航天大學出版社,2007.
[8] 胡耀輝、朱朝華等.單片機系統開發實例經典[M].北京:冶金工業出版社.2006.
[9] 張迎新.單片機初級教程[M]. 北京: 航空航天大學出版社,2007.
附錄1:電路原理圖
附錄2:實物圖
附錄3:元器件清單
序號 |
名稱 |
型號規格 |
數量 |
1 |
單片機 |
STC89C51 |
1 |
2 |
三極管 |
8050 |
4 |
3 |
電阻 |
10K |
13 |
4 |
電容 |
30PF |
2 |
5 |
晶振 |
12MHz |
1 |
6 |
小型 |
1 |
|
7 |
搶答按鈕 |
小型 |
10 |
8 |
LED |
黃色 |
1 |
附錄4:源程序
#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定義"啟動"按鈕
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7; //選手按鍵
sbit beep=P3^7; //蜂鳴器
uchar temp;
ucharaa,shi,ge,i;
uint n;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //共陰極數碼管編碼
void display(ucharshi,ucharge); //聲明顯示子函數
void dis(uchari);
void delay(uint z); //聲明延時子函數
void init(); //聲明初始化函數
void main()
{
init( ); //調用初始化子程序
while(1)
{
if(key1==0) //檢測"啟動"按鈕是否按下
{
delay(10); //延時去抖動
if(key1==0) //再次檢測"啟動"按鈕是否按下
{
while(!key1); //松手檢測,若按鍵沒有釋放,key1始終為0,那么!key1始終為1,程序就一直停在此while語句處
TR0=1; //啟動定時器開始工作
n=1;
}
}
display(shi,ge); //調用顯示子函數
dis(i); //顯示選手號數
if(n==1) {
if(k1==0){ delay(10);if(k1==0){while(!k1) i=1;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k2==0){ delay(10);if(k2==0){while(!k2) i=2;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k3==0){ delay(10);if(k3==0){while(!k3) i=3;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k4==0){ delay(10);if(k4==0){while(!k4) i=4;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k5==0){ delay(10);if(k5==0){while(!k5) i=5;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k6==0){ delay(10);if(k6==0){while(!k6) i=6;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k7==0){ delay(10);if(k7==0){while(!k7) i=7;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k8==0){ delay(10);if(k8==0){while(!k8) i=8;TR0=0;n=0;beep=1;delay(500);beep=0;}}
}
}
}
void delay(uint z) //延時子函數
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(ucharshi,ucharge) //顯示子程序
{
P2=0xbf;
P0=table[shi];
delay(10);
P2=0x7f;
P0=table[ge];
delay(10); //使用動態掃描的方法實現數碼管顯示
}
void dis(uchari)
{ P2=0xfe;
P0=table[i];
delay(10);
}
void init( ) //初始化子程序
{
n=0;
temp=30;
TMOD=0x01; //使用定時器T0的方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定時50ms中斷一次
EA=1; //中斷總允許
ET0=1; //允許定時器T0中斷
}
void timer0( ) interrupt 1
{
TH0=(65536-50000)/256;//重新賦初值
TL0=(65536-50000)%256;
aa++; //中斷一次變量aa的值加1
if(aa==20) //中斷20次后,定時時間為20*50ms=1000ms=1s,將變量temp的值加1
{
aa=0;
temp--;
if (temp==0)
{ temp=30;
}
shi=temp%100/10;
ge=temp%10; //分離個位和十位
}
}
審核編輯:湯梓紅
-
搶答器
+關注
關注
16文章
243瀏覽量
34582 -
單片機
+關注
關注
6043文章
44621瀏覽量
638579 -
存儲器
+關注
關注
38文章
7528瀏覽量
164345
原文標題:4
文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論