第一篇:單片機數碼管顯示實驗
實驗一
數碼管實驗
一、實驗目的
1.了解數碼管的顯示原理;2.掌握JXARM9-2440 中數碼管顯示編程方法
二、實驗儀器
JXARM9-2440教學實驗箱、ADT1000仿真器和ADT IDE集成開發環境、串口連接線、PC機。
三、實驗原理
7段LED由7個發光二極管按“日”字形排列,所有發光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。
LED顯示器的接口一般有靜態顯示與動態顯示接口兩種方式。
本實驗中采用的是動態顯示接口,其中數碼管掃描控制地址為0x20007000,位0-位5每位分別對應一個數碼管,將其中某位清0 來選擇相應的數碼管,地址0x20006000 為數碼管的數據寄存器。數碼管采用共陽方式,向該地址寫一個數據就可以控制LED 的顯示,數據中的1對應的不亮,0對應的亮,數碼管各位從高到低排列為dp-g-f-e-d-c-b-a,例如當數據寄存器是11111111時則不亮,當是01111111時則顯示8,其原理圖如圖所示。
四、實驗內容
1、編程實現:六個數碼管同時正向顯示0-F,然后反向顯示F-0。
2、編程實現:在六個數碼管上依次顯示與自己姓名有關的內容,可分辨出輪流顯示。
3、編程實現:在六個數碼管上依次顯示與自己姓名有關的內容,分辨不出輪流顯示。
4*、編程實現:在每個數碼管上遞增顯示0—9。5*、自行開發。
五、實驗程序
1, /****************************************************************************/ /*文件名稱: LEDSEG7.C
*/ /*實驗現象: 數碼管依次顯示出0、1,2、??
9、a、b、C、d、E、F
*/ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = {
/* 0
7*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8
A
B
C
D
E
F*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試
*/ /* 功能描述: 依次在7段數碼管上顯示0123456789ABCDEF
*/ /* 返回代碼: 無
*/ /* 參數說明: 無
*/ /****************************************************************************/ void Test_Seg7(void){
int i;
*((U8*)0x20007000)=0x00;/*6個數碼管都亮*/ for(;;){
/*數碼管從0到F依次將字符顯示出來*/
for(i=0;i<0x10;i++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
/*數碼管從F到0依次將字符顯示出來*/
for(i=0x0f;i>0x00;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
} }
// TODO } /****************************************************************************/
/* Function name : 循環延時子程序
*/ /* Description : 循環 'time' 次
*/ /* Return type :void
*/ /* Argument
: 循環延時計數器
*/ /****************************************************************************/ void Delay(int time){
int i;int delayLoopCount=10000;
for(;time>0;time--);
for(i=0;i 2, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示ZHAngg,并能看出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 在六個數碼管上分別顯示字母,與姓名有關 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(10000);} // TODO } /***************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 3, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示出ZHAngg,并看不出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 在六個數碼管上分別顯示字母,與姓名有關 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(1);} // TODO } /***************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 4, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示出0、1,2、?? 9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* 0 7*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 依次在7段數碼管各自遞增顯示0—9 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i;for(;;){ for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } // TODO } /****************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 六、實驗結果與分析 實驗一結果:六個數碼管同時顯示相同的符號,從0-F再由F-0之間的循環變換。 分析:在數碼管掃描控制地址處選中六個數碼管,使其同時亮,在給其數碼管的數據寄存器存入不同符號對應的數值,加上相應的延遲,就 可以是輪流變換的循環的符號變換。 實驗二結果:第一個數碼管顯示Z后,第二個顯示H,接著第三個顯示A,接著第四個顯示n,接著第五個顯示g,接著第六個顯示g,接著第一個再顯示Z…..如此循環。 分析:設置控制地址使其單獨并且循環顯示,每個數碼管的數據寄存器送入不同的符號的數值,并設置較大的延遲時間即可產生該現象。 實驗三結果:六個數碼管一起顯示“ZHAngg”。 分析:原理同實驗二,只是將延遲時間改小到人眼無法分辨的地步即使一起顯示。 實驗四結果:第一個數碼管顯示0—9之后,第二個接著顯示0—9,接著第三個,第四個….分析:設置循環使六個數碼管循環單獨顯示,在每個數碼管顯示中再加入循環,使其遞增顯示0—9,設置較大的延遲,是我們可以看清實驗現象。 七、實驗總結與心得體會 本次試驗需要了解數碼管的基本工作原理,基于C語言設計編程完成實驗,實驗的關鍵在于把握實現各種現象的本質上的差異,在程序上作出修改。通過本次試驗對于實驗的嚴謹性有了進一步的體驗,稍有不小心實驗結果就適得其反,以后要更加用心,更加認真的做實驗。 單片機數碼管顯示課程設計 目錄引言...............設計任務和要求.............1 2.1 設計目的............1 2.2 設計意義............1總原理圖及主要模塊的流程圖......1 3.1 總原理圖及元器件清單..............1 3.2 主要流程圖..........1性能測試與分析.............35 結論與心得..........4致謝...........4 參考文獻.............4 單片機數碼管顯示課程設計引言 從上世紀70年代第一批單片機問世,短短二三十年時間,單片機技術已經成為計算機技術的一個重要分支,廣泛運用到工業控制、儀器、儀表、消費產品,汽車、辦公自動化和通信等領域。因此,單片機技術已經成為電子、測控、自動化、通信等許多工科專業學生的必備技能。 我用AT89C51芯片來設計一個簡單的數碼管顯示。此設計給出了源代碼,通過仿真測試,其性能指標達到了設計要求。 關鍵詞:單片機,AT89C51,數碼管設計任務和要求 2.1 設計目的1.學習基本理論在實踐中綜合運用的初步經驗,掌握模擬電路設計的基本方法、設計步驟,培養綜合設計與調試能力。 2.了解AT89C51這個芯片的使用和性能指標測試方法。 3.培養實踐技能,提高分析和解決實際問題的能力。 2.2 設計意義 為了更好地熟悉和掌握單片機的基本功能和編程,掌握數碼管動態掃描顯示原理及實現方法。自我動態掃描顯示電路驅動程序的編寫方法。通過課程設計,達到理論與實際應用相結合,提高學生對微機硬件結構的軟件設計方法的理解,使學生能夠根據實際應用,初步實現硬件及軟件的設計,對硬件開發有更深層的認識,為今后打軟硬件開發,打下堅實的基礎??傇韴D及及主要模塊的流程圖 3.1 總原理圖及元器件清單 (1)我用Proteus 7 professional來畫出我設計的總原理圖,如圖3-1。 如圖3-1 此電路圖就用到AT89C51這個芯片,和一個數碼管。 3.2 主要流程圖(四號宋體加粗) 1.主程序的流程圖 圖3.2-1主流程圖 2.子程序的流程圖 圖3.2-2子流程圖性能測試與分析 主程序和子程序都存放在AT89C51單片機中。主程序的功能是:顯示數字。子程序的功能有:延時。程序代碼: ORG 0000H;初始化 LJMP START;轉入主程序 ORG 0010H;初始化 START: CLR P2.7;P2.7←00H MOVR0,#00H;R0←00H MOV R2,#10;R2←10 MAIN: MOV DPTR,#TAB;DPTR←TAB MOV A,R0;A←(RO) MOVC A,@A+DPTR;A←((A)+(DPTR)) MOV P0,A;P0←(A) LCALL DELAY;調用延時程序 INC R0;RO←(R0)+1 DJNZR2,MAIN;判斷 JMP START;循環 DELAY:;延時程序 MOV R3,#11 D1: MOV R4,#100 D2: MOV R5,#100 DJNZ R5,$ DJNZ R4,D2 DJNZ R3,D1 RET TAB: DB 00101000B;0 DB 11101011B;1 DB 00110010B;2 DB 10100010B;3 DB 11100001B;4 DB 10100100B;5 DB 00100100B;6 DB 11101010B;7 DB 00100000B;8 DB 10100000B;9 END 我用Proteus 7 professional 軟件來測試我設計的電路圖。當運行時,數碼管顯示0。如圖4-1。 圖4-1 當221ms后,數碼管顯示1。如圖 4-2.圖4-2 我的程序是一個循環的,一直到顯示9,之后又重新開始顯示0。在此不一一列出來。 為了能在實際在到應用,我用開發板來驗證我所設計的電路圖。其結果如下: 圖4-3顯示1 圖4-4顯示8 從仿真的結果可以看出,我的設計是滿足我設計的要求的。結論與心得 通過單片機課程設計,我不僅加深了對單片機理論的理解,將理論很好地應用到實際當中去,而且我還學會了如何去培養我們的創新精神,從而不斷地戰勝自己,超越自己。創新,是要我們學會將理論很好地聯系實際,并不斷地去開動自己的大腦,從為人類造福的意愿出發,做自己力所能及的,別人卻沒想到的事。使之不斷地戰勝別人,超越前人。同時,更重要的是,我在這一設計過程中,學會了堅持不懈,不輕易言棄。設計過程,也好比是我們人類成長的歷程,常有一些不如意,也許這就是在對我們提出了挑戰,勇敢過,也戰勝了,勝利的鐘聲也就一定會為我們而敲響。 這個設計過程中,我遇到過許多次失敗的考驗,就比如,我在軟件上仿真軟件上能實現其功能,但是把它寫進開發板就無法運行,我不停地找原因。最后我找到了答案,這樣我明白,做設計不但是軟件可以運行,用在硬件上一樣是那么重要的。我做的這個設計主要是用AT89C51這個芯片來實現,這個芯片具有很多優點,程序簡單易讀,結構清楚,最重要的是成本低。很適合我們學生用來學生。在做這個設計的過程中,我也了解到了自己的不足,在日后的學習中,我還需加倍努力學習。 參考文獻) [1]梁炳東.單片機原理與應用。北京:人民郵電出版社,2009 [2] [3]http://wenku.baidu.com/album/view/702db2c7aa00b52acfc7cae7 致謝(小三號 宋體 加粗) 在此次課程設計中,我遇到不懂的問題,老師和同學都幫我,讓我把問題順利地得到解決,最后完成此次課程設計報告。從中我學到了很多東西,在此,謝謝我的老師和同學,感謝你們在我遇到難題的時候幫我解答。 仲愷農業工程學院實驗報告紙 信息學院(院、系)專業班組單片機原理及接口技術課實驗四單片機鍵盤輸入以及數碼管顯示編程 一、實驗目的1、掌握單片機鍵盤以及數碼管顯示的工作原理; 2、掌握單片機鍵盤以及數碼管顯示的編程方法。 二、實驗內容 1、學習單片機鍵盤檢測、消抖以及譯碼等; 2、學習單片機數碼管靜態以及動態的顯示方式; 3、利用單片機鍵盤以及數碼管編寫程序驅動開發板上的蜂鳴器以及數碼管按一定規律工作。 三、實驗設備 1、STC單片機開發板; 2、PC機以及串口線。 四、實驗步驟 參考實驗指導書。 五、實驗總結 實驗五 按鍵及七段數碼管實驗 一、實驗目的1、熟悉keil軟件; 2、掌握矩陣式按鍵的原理; 3、掌握七段數碼管顯示的原理; 4、掌握STC單片機的按鍵及數碼管程序編寫及下載; 二、實驗要求 1、編寫矩陣式按鍵的讀取程序、七段數碼管的動態顯示程序,并將程序結合在一起,產生某一按鍵按下,顯示對應鍵值的程序。 2、編寫串行通信的發送及接收程序,實現串行口跟PC及的通信,并在PC機上用串口調試工具觀察實驗結果; 3、利用keil軟件調試程序,并產生.hex文件; 4、將.hex文件利用STC單片機下載工具下載到單片機最小系統中,并觀察LED燈的顯示狀態; 5、提交實驗報告,報告包含程序及LED的顯示結果。 三、實驗內容 1、打開keil軟件,熟悉軟件的菜單、工作界面及工具。然后按照keil的編程步驟編寫程序(創建工程----選擇單片機AT89C51----新建源文件----保存為C程序----編寫完整的C51程序----將文件添加到工程----編譯并修改錯誤----連接產生.hex文件)。 2、打開STC下載軟件,將keil生成的.hex文件打開,下載到最小系統板,測試程序并觀察實驗結果。 3、按鍵及七段LED的程序,實現更多的LED與按鍵結合的效果。 四、實驗說明 1、程序中使用的按鍵及LED燈的IO端口要與自己的單片機最小系統板對應; 2、按鍵程序注意抗消抖; 3、思考計算器程序如何實現; 成都理工大學工程技術學院 單片微機原理及應用課程設計 《一位LED數碼管顯示0-9》 學生姓名: 學 號: 專 業: 班 級: 指導教師: 完成日期: 目 錄 一 實驗目的與任務…………………………………2 二 實驗要求…………………………………………2 三 實驗內容…………………………...……………2 四 元器件清單………………………………………2 五 LED數碼管的結構及工作原理…………………2 六 關于PLC控制LDE介紹………………………4 七 原理圖繪制說明…………………………………5 八 流程圖繪制以及說明……………………………9 九 電路原理圖與仿真………………………………10 十 源程序……………………………………………12 十一 心得體會………………………………………12 十二 參考文獻………………………………………13 一、實驗與任務 結合實際情況,編程設計、布線、程序調試、檢查與運行,完成一個與接近實際工程項目的課題,以培養學生的實際操作能力,適應生產一線工作的需要。做到能檢查出錯誤,熟練解決問題;對設備進行全面維修。通過實訓對PLC的組成、工作原理、現場調試以及基于網絡化工作模式的基本配置與應用等有一個一系列的認識和提高。 利用51單片機、1個獨立按鍵及1位7段數碼管等器件,設計一個單片機輸入顯示系統,要求每按一下獨立按鍵數碼管顯示數據加1(數碼管初始值設為0,計到9后再加1,則數碼管顯示0)。 本次設計采用12MHz的晶體振蕩器為單片機提供振蕩周期,外加獨立按鍵,復位電路和顯示電路組成。 二、實驗要求 1、了解七段LED數碼管的結構、分類以及數碼管的顯示碼。 2、學習1位LED數碼管靜態顯示與動態顯示的編程方法。 3、掌握可編程序控制器技術應用過程中的一些基本技能。 4、了解可編程控制器的裝備、調試的全過程。 三、實驗內容 1、練習設計、連接、調試控制電路; 2、學習PLC程序編程; 四、元器件清單 從PROTUES庫中選擇元器件(1)AT89C51;單片機。(2)RES、RX8;電阻、8排阻。 (3)7SEG-COM-CAT-BLUE;帶公共端共陰極七段藍色數碼管。(4)CAP/CAP-ELEC;電容、電解電容。(5)CRYSTAL:晶振。 五、LED數碼管的結構及工作原理 led數碼管(LED Segment Displays)是由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似于3位“+1”型。位數有半位0,1,2,3,4,5,6,8,10位等等....,led數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬件電路有差異外,編程方法也是不同的。圖2是共陰和共陽極數碼管的內部電路,它們的發光原理是一樣的,只是它們的電源極性不同而已。顏色有紅,綠,藍,黃等幾種。led數碼管廣泛用于儀表,時鐘,車站,家電等場合。選用時要注意產品尺寸顏色,功耗,亮度,波長等。下面將介紹常用LED數碼管內部引腳圖1 圖1 10引腳的LED數碼管 圖2 LED數碼管引腳定義 LED數碼管要正常顯示,就要用驅動電路來驅動數碼管的各個段碼,從而顯示出我們要的數位,因此根據LED數碼管的驅動方式的不同,可以分為靜態式和動態式兩類。 A、靜態顯示驅動: 靜態驅動也稱直流驅動。靜態驅動是指每個數碼管的每一個段碼都由一個單片機的I/O埠進行驅動,或者使用如BCD碼二-十進位*器*進行驅動。靜態驅動的優點是編程簡單,顯示亮度高,缺點是占用I/O埠多,如驅動5個數碼管靜態顯示則需要5×8=40根I/O口來驅動,要知道一個89S51單片機可用的I/O口才32個呢。故實際應用時必須增加*驅動器進行驅動,增加了硬體電路的復雜性。B、動態顯示驅動: 數碼管動態顯示介面是單片機中應用最為廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃“a,b,c,d,e,f,g,dp ”的同名端連在一起,另外為每個數碼管的公共極COM增加位元選通控制電路,位元選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決于單片機對位元選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位元就顯示出字形,沒有選通的數碼管就不會亮。 透過分時輪流控制各個LED數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位元數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極體的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示資料,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O口,而且功耗更低。 六、關于PLC控制LED介紹 PLC可編程控制器:它采用一類可編程的存儲器,用于其內部存儲程序、執行邏輯運算、順序控制、定時、計數與算數操作等面向用戶的指令,并通過數字或模擬式輸入/輸出控制各種類型的機械或生產過程。 用PLC控制LED直接進行數據顯示,可以降低成本,使得數據顯示直觀。傳統數顯有兩種方法: 1、由PLC編制程序進行譯碼,來控制顯示a-g段; 2、利用 譯碼組合電路產生a-g各段譯碼信號實現LED數碼管顯示。前一種方法邏輯譯碼關系復雜,后一種方法譯碼電路冗長,都不利于顯示的實現。傳統數顯邏輯譯碼關系復雜,而用PLC的位組合元件和譯碼功能指令方法來實現LED數顯.前一種方法將表示十進制數的4位BCD碼的位元件成組使用,形成位組合元件數顯;后一種方法用7段譯碼指令把指定元件的低4位對應的十六進制數譯碼后,驅動數顯.這兩種方法邏輯簡單,易于理解,便于實現。 設計任務:LED數碼管顯示:0到9 七、原理圖繪制說明 本次設計主要用到單片機AT89C51、晶振時序電路。AT89C51是一種帶4KB閃爍可編程可擦出只讀存儲器的低電壓、高性能CMOS微處理器,俗稱單片機。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微處理器,為很多嵌入式控制系統提供了一種靈活性高且廉價的方案,AT89C51的管腳分配(如圖1)。 圖1 AT89C51芯片及管腳圖 AT89C51單片機主要由4個輸入輸出端口(P0口、P1口、P2口、P3口)及個控制引腳組成的,本次設計用到P1、P2的部分引腳,及18、19腳外接晶振電容為單片機提供時鐘,9管腳為復位引腳,外接復位電路。 晶振時序電路:XTAL1和XTAL2分別為片內反相放大器的輸入和輸出端,當單片機采用外部時鐘信號時,前者接地,后者引入外部輸入信號,本次設計采用12M的石英晶體振蕩器為單片機提供時鐘(如圖2)。 圖2 AT89C51的晶振時序電路圖 本次設計的原理圖是在PROTEUS ISIS中繪制的,其工作界面分為原理圖編輯窗口(Editing window)、預覽窗口(Overview window)和工具欄。 1、新建*.dsn 打開繪圖界面后,首先新建一個繪圖文件,選擇“【文件】——【新建設計】”,并保存成.dsn型文件。 2、繪制原理圖 6(1)添加元器件:元件拾取共有兩種辦法,一種是按類別查找和拾取元件,另一種是直接查找和拾取元件。我采用的是前一種方法,元件通常以其英文名稱或器件代號在庫中存放。我們在取一個元件時,首先要清楚它屬于哪一大類,然后還要知道它歸屬哪一子類,這樣就縮小了查找范圍,然后在子類所列出的元件中逐個查找,根據顯示的元件符號、參數來判斷是否找到了所需要的元件。雙擊找到的元件名,該元件便拾取到編輯界面中了。右側列表中自上而下分別為元件圖形和元件封裝。具體如圖3所示: 圖3 分類拾取元件示意圖 (2)元件的放置 在原理圖編輯區的藍色方框內,單擊鼠標左鍵即完成元件的釋放。具體如圖4所示: 圖4 元件的放置示意圖 (3)電路連線 PROTEUS的連線是非常智能的,它會判斷你下一步的操作是否想連線從而自動連線,而不需要選擇連線的操作,只需用鼠標左鍵單擊編輯區元件的一個端點拖動到要連接的另外一個元件的端點,先松開左鍵后再單擊鼠標左鍵,即完成一根連線。如果要刪除一根連線,右鍵雙擊連線即可。根據設計完成連線后即可得到完整的電路原理圖,具體如圖5: 圖5 連線后的完整電路原理圖 八、流程圖繪制以及說明 主程序設計說明 主程序主要分為四部分,包括復位電路部分、獨立按鍵的判別部分、單片機控制主程序部分和譯碼顯示部分,模塊流程圖如圖6所示: 圖6 數碼管顯示程序流程圖 九、電路原理圖與仿真 1、Hex文件的導入過程 在仿真前,須先在KEIL4中生成.HEX文件。編譯完源程序并且沒有錯誤后,選擇“Project-Options for Target ‘Target1’-Output”,在“Create HEX File”前面的空挑勾,再“確定”,即可生成HEX文件,如圖7所示 : 圖7 生成HEX文件示意圖 在進入PROTEUS ISIS中,雙擊AT89C51芯片,出現如圖8所示的對話框。在“Program File”一項中查找“seg.hex”文件的路徑并加上該文件即可開始仿真,如圖8所示: 圖8 keil的seg.hex文件載入單片機的示意圖 2.在導入hex文件后,便可運行該設計系統,打開仿真開關,顯示如圖 十、源程序清單 org 0000h sjmp main org 000bh sjmp t0_isr org 0030h main:clr a mov dptr,#table movc a,@a+dptr mov p0,a mov tmod,#01h mov th0,#0d8h mov tl0,#0efh setb et0 setb ea setb tr0 pd: cjne r0,#100,$ inc dptr clr a movc a,@a+dptr cjne a,#00h,aaa mov dptr,#table ;如果花樣數據完應重新循環 clr a movc a,@a+dptr aaa: mov p0,a mov r0,#00h sjmp pd t0_isr: clr tr0 mov th0,#0d8h mov tl0,#0efh inc r0 setb tr0 reti table:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00h end 十一、心得體會 通過此次課程設計,使我更加扎實的掌握了有關單片機知識,用匯編語言在KEIL4中編程,在PROTEUS中繪制原理圖并進行仿真,通過對這兩個軟件的學習,了解了其功能的強大,掌握了AT89C51的內部結構及工作原理,對于我們以后的 學習和實踐有很大的指導意義,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。過而能改,善莫大焉。在課程設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設計終于順利完成了,在設計中遇到了很多問題,最后在老師的指導下,終于游逆而解。此次設計也讓我明白了團隊精神的重要性,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結就是力量,只有互相之間默契融洽的配合才能換來最終完美的結果。 十一、參考文獻 [1]高欽和.可編程控制器應用技術與設計實例.北京:人民郵電出版社,2004 [2]虞鶴松編.可編程序控制器原理及應用.南京:東南大學出版社,1995 [3]田庭主編.常用可編程序控制器編程器及編程軟件使用手冊.北京:機械工業出版社,1994第二篇:單片機數碼管顯示課程設計
第三篇:實驗四 單片機鍵盤輸入以及數碼管顯示編程
第四篇:單片機實驗五 按鍵及七段數碼管實驗
第五篇:《一位LED數碼管顯示0-9》