《《微型計算機系統(tǒng)》課程設計基于單片機的跑馬燈設計》由會員分享,可在線閱讀,更多相關《《微型計算機系統(tǒng)》課程設計基于單片機的跑馬燈設計(15頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
《微型計算機系統(tǒng)》課程設計
任務書
題目名稱:基于單片機的跑馬燈設計
專業(yè) 自動化 班 自本 132
姓名 學號
學校:青島理工大學自動化學院
指導教師:
2015年11月30日
青島理工大學自動化工程學院
課程設計任務書
課程名稱:微型計算機系統(tǒng)
設計題目:基于單片機的跑馬燈設計
系統(tǒng)硬件要求:
根據(jù)實際要求,以MCS-51單片機為核心,設計3個按鍵,每個按
2、鍵對應一個花樣,可手動顯示,即按一個按鍵,顯示一種花樣,也可以再設計一個按鍵用于連續(xù)顯示每個花樣,每個花樣顯示的時間和花樣設計者自己規(guī)定,并在論文中給定。設計控制系統(tǒng)硬件電路,編寫C語言或匯編語言程序,并用PROTEUS軟件進行實時仿真。
要求:
(1)擴展接口(8255或8155),設計至少4個按鍵
(2)設計至少32個LED
(3)LED顯示至少有3種花樣,可單獨顯示也可自動循環(huán)顯示
軟件設計:
1)主程序設計
2)各功能子程序設計
其他要求:
1、 每位同學獨立完成本設計。
2、依據(jù)題目要求,提出系統(tǒng)設計方案。
3、設計系統(tǒng)電路原理圖。
1、 調試系統(tǒng)硬件電
3、路、功能程序。
2、 編制課程設計報告書并裝訂成冊,報告書內容(按順序)
(1)報告書封面
(2)課程設計任務書
(3)系統(tǒng)設計方案的提出、分析
(4)系統(tǒng)中典型電路的分析
(5)系統(tǒng)軟件結構框圖
(6)系統(tǒng)電路原理圖
(7)源程序
(8)課設字數(shù)不少于3000字
成績
評語
目錄
第一節(jié)AT89C51芯片分析………………………………………………………I
第二節(jié)設計概述………………………………………………………………3
第三節(jié) 算法………………………………………………………………..…5
第四節(jié) 編程技巧………………………………………
4、…………………………7
第五節(jié) 電路設計及功能說明,硬件原理框圖及電路圖(包括接口芯片簡介).8
第六節(jié) 調試過程中的主要難點(自己遇到的)及解決思路和辦法;………….8
課設結果及分析、收獲、體會和建議;………………………………………….9
參考文獻…………………………………………………………………………10
附錄1………………………………………………………………………………11
附錄2………………………………………………………………………………12
第一節(jié)AT8
5、9C51芯片分析
ATMEL的AT89S51是一種高效微控制器,將多功能8位CPU和閃爍存儲器組合在單個芯片中,為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。AT89C51的芯片引腳圖如下:
各引腳的說明和功能分析如下:VCC:供電電壓。GND:接地。
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編
程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:P1口是一個內部提供上拉電
6、阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優(yōu)勢,當對外部八位地址
7、數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時當8051通電,時鐘電路開始工作,在RESET引腳上出現(xiàn)24個時鐘周期以上的高電平,系統(tǒng)即初始復位。初始化后,程序計數(shù)器PC指向0000H,P0-P3輸出口全部為高電平,堆棧指鐘寫入0
8、7H,其它專用寄存器被清“0”。RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址開始執(zhí)行程序。然而,初始復位不改變RAM(包括工作寄存器R0-R7)的狀態(tài),
ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。
9、另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。
PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。
EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸
10、出。
振蕩器特性:XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅動器件,XTAL2應不接。有余輸入至內部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。
芯片擦除:整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE管腳處于低電平10ms來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲字節(jié)被重復編程以前,該操作必須被執(zhí)行。
此外,AT89C51設有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電
11、模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內容并且凍結振蕩器,禁止所用其他芯片功能,直到下一個硬件復位為止。
第二節(jié)設計概述
本程序設計意在展示跑馬燈的色彩樣式及“跑馬”變換效果,如果將跑馬燈做大,會有很高的觀賞價值。通過對一些相關書籍資料的查閱及網(wǎng)上各種作品和代碼的瀏覽,對各種實現(xiàn)代碼的比較和優(yōu)化,總結出本程序,以較優(yōu)秀的代碼實現(xiàn)各種可控的“跑馬燈”功能。
硬件系統(tǒng)部分包括顯示部分、按鍵控制部分和控制芯片。系統(tǒng)框圖如下:
第三節(jié) 算法
編譯兩個函數(shù),分別是voiddisplay()函
12、數(shù)和voiddelay()函數(shù),前者是LED顯示函數(shù),后者是延時函數(shù)。
程序的開始,先定義各個參數(shù)、各口的地址以及各個位。
主函數(shù)中,定義y1、y2分別為PA口PB口的相應地址,控制各個LED燈的亮滅;m為顯示函數(shù)voiddisplay()中for循環(huán)的個數(shù),控制LED燈亮滅循環(huán);k1、k2分別為PA口PB口地址轉移的個數(shù),控制PA口PB口地址轉移的方式;t為延遲的參數(shù),順、跳兩模式定義不同的k值和m值。然后定義CPU的各個狀態(tài),使其正常工作。在順序顯示中,先進入while(1)循環(huán),循環(huán)中兩判斷條件if(P1==0xfd),令k1=1,實現(xiàn)順顯示,和if(P1==0xfb),令k2=2實
13、現(xiàn)跳顯示。根據(jù)條件進入相應模式,各有一個LED燈亮、兩個LED燈亮、四個LED燈亮、八個LED燈亮,和一個LED燈、兩個LED燈、四個LED燈間隔亮
顯示函數(shù)voiddisplay()中,兩個for循環(huán)分別控制PA口PB口LED燈的循環(huán)模式,其中n為for循環(huán)的次數(shù)。先定義PA口PB口的首地址outdata1、outdata2進入循環(huán),函數(shù)_cror_和_crol_控制他們地址不同的轉移方式,k為其中的轉移的個數(shù)。t為延遲函數(shù)的參數(shù),控制亮滅延遲的時間。
延遲函數(shù)voiddelay()中,t為延遲的參數(shù),控制程序中所需的延遲時間。程序中各個參數(shù)之間都一一對應,根據(jù)要求相互呼應。通過控制這些
14、參數(shù)的量值來實現(xiàn)硬件仿真中多種跑馬燈的運行模式。
第四節(jié) 編程技巧
設計中,我將與PA相連的LED燈順序排列,與PB相連的逆序排列,要注意兩組初始值并不相同,明確參數(shù)間的關系,多個參數(shù)組合使用,實現(xiàn)跑馬燈的多種運行方式。
第五節(jié) 電路設計及功能說明,硬件原理框圖及電路圖(包括接口芯片簡介);
本次設計采用AT89C52芯片驅動可編程接口芯片8155的擴展來實現(xiàn)LED燈的多種顯示方式。讓AT89C52芯片的P0口與8155芯片的三態(tài)雙向數(shù)據(jù)總線D0~D7連接,實現(xiàn)數(shù)據(jù)傳送。當CPU執(zhí)行輸入輸出指令時,通過它實現(xiàn)8位數(shù)據(jù)的讀/寫操作,控制字和狀態(tài)信息也通過數(shù)據(jù)總線傳送。8155的地址選
15、擇線A1、A0分別與AT89C52的P2.7和P2.6連接,通過定義不同的地址來定義8155芯片PA口和PB口的工作方式。讀寫命令線分別與單片機的讀寫命令線相連,片選線直接接地,復位線RESET接單片機的P2.5。同時PA口與8個LED燈順序連接。PB口與8個LED燈逆序連接,通過按鍵控制可以選擇不同的運行模式,實現(xiàn)多種跑馬燈的運行模式。
第六節(jié) 調試過程中的主要難點(自己遇到的)及解決思路和辦法;
設計中與PA口連接的LED燈是順序依次亮,與PB口連接的LED燈是逆序依次亮,要注意PA初始狀態(tài)分別是fe、fc、f0、00,PB初始狀態(tài)分別是7f、3f、0f、00。
其次PB口跳躍
16、亮,所以k2初始值為2。
課設結果及分析、收獲、體會和建議;
通過此次為期兩周的課程設計,我加深了對單片機以及C語言的認識和理解,使各部分的知識得到了進一步的鞏固。將平時學的理論知識真正應用到實際中,實現(xiàn)了學與用相結合,應用單片機這一開發(fā)環(huán)境,軟硬件結合來達到設計一實物的目的。同時還了解了兩個專業(yè)軟件:KEILC和PROTEUS仿真軟件,現(xiàn)在基本熟悉了他們的應用與相關知識。
此次課程設計,關鍵的是整個課設過程,這中間有著我們的辛勤勞動和認真的思考,過程有些枯燥,但卻十分有意義。仿真和程序的編寫都會遇到很多問題,但我們保持耐心,認真對待,問題終會解決。整個過程認真堅持下來,你會收獲很多,體
17、會很多,不管是對以后的學習,還是對我們的自身本事的鍛煉,這些都是我們非常寶貴的財富。
課設過程中遇到的苦難,通過對設計的認真分析以及與同學們的討論,找到了其中的出錯點,將其改正,每個問題都這樣一一改正,整個課設完成的十分成功。
此次課設還鍛煉了我們的動手能力,開闊了我們的思維境界,使我們的知識更豐富,不僅加深了我們對所學專業(yè)的認識,更增加了我們對所學專業(yè)的興趣!
參考文獻
1C語言程序設計教程張敏霞,孫麗鳳主編北京:電子工業(yè)出版社,2007.3
2單片機原理及接口技術胡
18、漢才主編北京:清華大學出版社,2010.5
3 模擬電路課本
4 數(shù)字電路課本
附錄1
附錄2
#include
#include
#defineucharunsignedchar
#definePAXBYTE[0x00]
#definePBXBYTE[0x01]
#definePCXBYTE[0x02]
#defineCOMXBYTE[0x03]
sbitk1=P1^0;
s
19、bitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
ucharcodelie[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodehangk0[8]={0x00,0xc3,0xc3,0xff,0xff,0xc3,0xc3,0x00};
ucharcodehangk1[8]={0x1e,0x21,0x42,0x84,0x84,0x42,0x21,0x1e};
ucharcodehangk2[8]={0x00,0x00,0x7f,0x88,0x88,0x67,0x00,0x00};
unsi
20、gnedcharmode;
unsignedcharkey;
voidkeyscan(void);
voiddelay(uchart);
voidlight0(void);
voidlight1(void);
voidlight2(void);
voidmain()
{
PA=0;PB=0;
COM=0x80;
IT0=1;
EX0=1;
EA=1;
while(1)
{
switch(key)
{
case1:light0();break;
case2:light1();break;
case3:light2();break;
case4
21、:light0();delay(1000);light1();delay(1000);light2();delay(1000);break;
default:break;
}
}
}
voidint0(void)interrupt0
{
keyscan();
}
voiddelay(uchart)
{
uchari=0;
while(t--)for(i=0;i<120;i++);
}
voidkeyscan(void)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
key=1;
}
22、}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!k2);
key=2;
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3);
key=3;
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!k4);
key=4;
}
}
}
voidlight0()
{
unsignedchara;
for(a=0;a<8;a++)
{
PA=lie[a];
PB=hangk0[a];
delay(5);
}
}
voidlight1()
{
unsignedcharx;
for(x=0;x<8;x++)
{
PA=lie[x];
PB=hangk1[x];
delay(5);
}
}
voidlight2()
{
unsignedchary;
for(y=0;y<8;y++)
{
PA=lie[y];
PB=hangk2[y];
delay(5);
}
}
15