1.1設計目的 (1)加強對單片機和C語言的認識,充分掌握和理解設計各部分 的工作原理、設計過程、選擇芯片器件、模塊化編程等多項知識。 (2)用單片機模擬實現具體應用,使個人設計能夠真正使用。 (3)把理論知識與實踐相結合,充分發揮個人能力,并在實踐中鍛煉。 (4)提高利用已學知識分析和解決問題的能力。 (5)提高實踐動手能力。 1.2控制要求 (1)用七只發光二極模擬工業控制中的7道工序,高電平點亮,每道工序用定時器進行工序間的順序轉換。 (2)與此同時運用動態掃描和定時器1在數碼管上顯示出從765432開始以1/10秒的速度遞減至765398,并保持顯示此數。 1.3系統總體方案設計
設計主要流程:

圖1-1 課程設計總流
2.控制系統原理分析 2.1硬件部分分析 2.1.1 89C51單片機引腳圖及引腳功能介紹 本次實習的中斷功能就是基于89C51單片機的基礎上實現的,首先來簡單認識一下,它的引腳如圖2-1所示: 
圖2-1 89C51引腳示意圖
2.1.2顯示系統工作原理 LED顯示電路: 圖2-2 LCD顯示電路 LCD顯示電路,由U33的74HC245驅動,以顯示電平狀態。高電平為“1”狀態,點亮發光二極管。對于74HC245,實物圖如下 
圖2-3 74HC24實物圖 圖2-4 74LS245結構圖 引腳定義: 第1腳DIR,為輸入輸出端口轉換用,DIR=“1”高電平時信號由“A”端輸入“B”端輸出,DIR=“0”低電平時信號由“B”端輸入“A”端輸出。 第2~9腳“A”信號輸入輸出端,A0=B0,A7=B7,A0與B0是一組,如果DIR=“1”OE=“0”則A1輸入B1輸出,其它類同。如果DIR=“0”OE=“0”則B1輸入A1輸出,其它類同。 第11~18腳“B”信號輸入輸出端,功能與“A”端一樣,不再描述。 第19腳OE,若該腳為“1”A/B端的信號將不導通,只有為“0”時A/B端才被啟用,該腳也就是起到開關的作用。 第10腳GND,電源地。 第20腳VCC,電源正極。  圖2-5 顯示電路結構圖 八段數碼管顯示電路由8155的PB0、PB1經74LS164“串轉并”后輸出得到。6位位碼由8155 的PA0口輸出,經uA2003反向驅動后,選擇相應顯示位。74LS164是串行輸入并行輸出轉換電路,串行輸入的數據位由8155的PB0控制,時鐘位由8155的PB1控制輸出。 寫程序時,只要向數據位地址輸出數據,然后向時鐘位地址輸出一高一低兩個電平就可以將數據位置到74LS164中,并且實現移位。向顯示位選通地址輸出高電平就可以點亮相應的顯示位。 圖2-6 74LS164引腳結構圖 引腳信息: 符號 | 引腳 | 說明 | DSA | 1 | 數據輸入 | DSB | 2 | 數據輸入 | Q0~Q3 | 3~6 | 輸出 | GND | 7 | 地 (0 V) | CP | 8 | 時鐘輸入(低電平到高電平邊沿觸發) | /M/R | 9 | 中央復位輸入(低電平有效) | Q4~Q7 | 10~13 | 輸出 | VCC | 14 | 正電源 |
功能概述: 74LS164是8位邊沿觸發式移位寄存器,串行輸入數據,然后并行輸出。數據通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。時鐘 (CP)每次由低變高時,數據右移一位,輸入到 Q0, Q0 是兩個數據輸入端(DSA和 DSB)的邏輯與,它將上升時鐘沿之前保持一個建立時間的長度。主復位 (MR) 輸入端上的一個低電平將使其它所有輸入端都無效,非同步地清除寄存器,強制所有的輸出為低電平。 字段碼: 
圖2-7 數碼管數字代碼表
2.2軟件設計流程圖 圖2-8 設計流程圖 P1口的P1.0~P1.6接七只發光二極管,P1.7接報警器,P3.4接開工啟動開關,P3.2接外部故障輸入模擬開關。 主程序流程圖:當程序啟動,開啟中斷,并使P1、P3口初始化,當給start開始信號即P3.4得電時,運行主程序中使發光二極管得電的程序,從L0至L7,按順序每次只點亮一只二極管,并延時一段時間,然后點亮下一只二極管,當第七只二極管得電延時完成后,程序跳轉到工序1開始的地方,按此規律從工序1到工序7依次循環進行下去。 中斷服務子程序:當外部故障輸入模擬開關即P3.3得電時,運行中斷子程序,先使P1=0x00即關閉輸出保護現場,speak=1使報警器報警。然后判斷故障情況,如果故障清除,則恢復現場跳出中斷子程序回到主程序;如果故障沒有清除,則報警器繼續報警直至故障清除。
3.程序分析 3.1順序控制程序 #include "reg51.h" #define WORD unsigned int #define BYTE unsigned char sbit Speak=P1^7; P1.7對應報警開關,用P1.7對應的得電信號來改變是否故障 sbit Start = P3^4; 定義P3口的P3.4為啟動開關 sbit test = P1^0; /*定義變量,報警P1.7;啟動P3.4;外部故障開關P3.3*/ void delay(WORD time) { WORD i; for(i=0;i<=time;i++); } /*延時中斷程序*/ void ErroBl (void) interrupt 2 using 1 { P1=0X00; { Speak=1; delay(200); Speak=0; delay(100); } } /*外部故障中斷報警程序,循環報警*/ void main() 主函數 { IE=0x84; IP=0x04; PSW=0x00; /*輔助繼電器賦值,允許外部中斷;優先級別最高*/ while(1) 循環 { if(Start==1) /*啟動信號*/ { P1=0X01; /*工序一*/給P1口賦值為00000001,即工序1對應的燈得電,燈亮。 delay(6000); /*工序一延時*/采用延時程序,是得電信號延時,即燈亮延時6000后滅。 其他燈的亮滅只是對賦值進行更改,來達到讓7個燈互相交替亮滅。 程序分析說明: P3.4為開工啟動開關,高電平啟動。在主程序中P1 = 0xff表示高電平有效啟動;IT0 = 0;表示Enable EX0,外部中斷INT0低電平有效;EX0 = 1;表示中斷標志位為1時,允許INT0中斷;EA = 1;表示中斷總控制開關,為1時CPU允許中斷;在while語句中,P1 = 0xfe;表示從右第一個燈亮;Delay(1000);表示延時1S;往后以此類推。但是在Delay(1000);表示進入延時函數調用。其中while (cnt-- !=0)表示從1000往下減1。 3.2數碼管顯示程序 顯示設計程序是在八段數碼顯示設計程序的基礎上加以修改得到的。按要求高三位是固定不變的,只需要變化低三位。在低三位遞減到指定數據時,保持固定不變。
- <font style="font-size: 12pt">#include<absacc.h>
- #define LEDLen 6
- #define mode 0x03;
- #define CAddr XBYTE[0xe100]/* 控制字地址 */
- #define OUTBIT XBYTE[0xe101]/* 位控制口 */
- #define CLK164 XBYTE[0xe102]/* 段控制口(接164時鐘位) */
- #define DAT164 XBYTE[0xe102] /* 段控制口(接164數據位) */
- #define IN XBYTE[0xe103] /* 鍵盤讀入口 */
- unsigned char LEDBuf[LEDLen]; /* 顯示緩沖 */
- code unsigned char LEDMAP[] = { /* 八段管顯示碼 */
- 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
- 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
- };
-
- void Delay(unsigned char CNT) /*延時中斷程序*/
- {
- unsigned char i;
- while (CNT-- !=0)
- for (i=100; i !=0; i--);
- }
- 如何保證最后停在7654398,在前面建立一個無限循環程序,當滿足一定條件是跳入該程序就能保證顯示數碼管把持不變,下面是該程序。
- void display() /*按要求最后顯示765398,并用無限循環保持不變*/
- {
- while(1) {
- unsigned char j;
- LEDBuf[0] = LEDMAP[(7) & 0x0f]; /*六個八段數碼管依次賦值*/
- LEDBuf[1] = LEDMAP[(6) & 0x0f];
- LEDBuf[2] = LEDMAP[(5) & 0x0f];
- LEDBuf[3] = LEDMAP[(3) & 0x0f];
- LEDBuf[4] = LEDMAP[(9) & 0x0f];
- LEDBuf[5] = LEDMAP[(8) & 0x0f];
- for(j=0; j<30; j++) /*延時*/
- DisplayLED(); /*顯示上面賦值數據*/
- }
- }
- 如何讓數碼管由765432逐漸遞減到7654398,下面是主函數的編寫,循環的編寫,來滿足要求。
- void main() 主函數
- {
- unsigned char i=2;
- unsigned char m;
- unsigned char j;
- unsigned char n=3;
- unsigned char k=4; /*定義變量*/
- CAddr = mode;
- while(1) {
- LEDBuf[0] = LEDMAP[(m+7) & 0x0f]; /*八段數碼管依次賦值*/
- LEDBuf[1] = LEDMAP[(m+6) & 0x0f];
- LEDBuf[2] = LEDMAP[(m+5) & 0x0f];
- LEDBuf[3] = LEDMAP[(k) & 0x0f];
- i--; /*個位逐漸減1*/
- LEDBuf[4] = LEDMAP[(n) & 0x0f]; /*十位八段數碼管賦值*/
- if(i==0) /*當個位減小為0時,十位減1。同時給個{ 位賦值9*/
- n--;
- i=9;
- }
- LEDBuf[5] = LEDMAP[(i) & 0x0f];
- if(n==0&&i==1) { /*當十位個位同時減小到0時,百位減1;
- k--; 同時給個位和十位賦值9*/
- i=9;
- n=9;
- }
- for(j=0; j<30; j++)
- DisplayLED(); /* 顯示該次循環所得數據 */
- if(k==3&&i==8) /*當減小到765398時,進去子程序display無限循環顯示
- display(); 765398*/
- }
- }</font>
復制代碼
4.運行調試 4.1軟件調試過程 點開軟件,進入程序編譯系統。點擊菜單欄“項目”,選擇下拉框里面的“新項目”。如下圖4-1所示。  
圖 4-1 新建項目 新建項目是要選擇“Atmel”下拉框中的“AT89C51”然后點擊確定。如下圖 圖4-2 目標選擇設備 新建項目之后,需要點擊“新建一個文件”在項目目錄下新建程序編譯文件。 之后點擊保存,需要注意的是保存時文檔名稱后面要加“.c”。如下圖。 
圖4-3 新建程序編譯文件 文件建好之后,就可以開始編寫程序了。編寫程序時注意減少不必要的編寫錯誤,注意語句后面的分號是否需要;每個程序段的前大括號和后大括號相對應。這樣在編譯過程中能減少很多工作。
添加文件到組,編寫程序完成后。右鍵單擊源代碼組1。選擇添加文件到組“源代碼組1”,出現如圖所示對話框,選擇剛建立的編譯程序文件到源代碼組1,完成添加。 
圖 4-4 編譯重建目標文 編寫完程序添加到組之后開始調試,首先檢查程序是否有錯誤,單擊“編譯當前文件”,如果輸出窗口中顯示沒有錯誤,那么接著單擊“重建所有目標文件”;如果編譯過程中出現錯誤,那么需要按照輸出窗口中提示的錯誤改正之后再重建文件。
 

圖 4-5 設置調試接口 重建目標文件之后需要先設置好通訊借口,計算機需要與硬件設備向通訊,需要設置合理的通訊方式。本調試中使用(U):Keil Monitor-51 driver,保護接口選擇Com3,波特率選用38400,其他默認。 

通訊方式選擇后啟動調試,單擊菜單欄中“啟動/停止調試(D)”開始調試。然后可選擇運行到指定位置來檢驗程序是否能正常運行。一直檢查無誤后,可直接點擊“運行”觀察實驗現象。 4.2安裝調試及方法 (1)P3.4連K1,P3.3連K2,P1.0—P1.6分別連到L1—L7,P1.7連SIN(電子音響輸入端)。 (2)K1開關撥在上面,K2撥在上面。 (3)用連續方式從起始地址0580H開始運行程序(輸入0580后按EXEC鍵),此時應在等待開工狀態。 (4)K1撥至下面(顯低電平),各道工序應正常運行。 (5)K2撥至下面(低電平),應有聲音報警(人為設置故障)。 (6)K2撥至上面(高電平),即排除故障,程序應從剛才報警的那道工序繼續執行。
4.3 結果分析 實驗中延時的時間的計算為DELAY1t=20*125*200*12*2/12000000=1S; 分別代表的含義為:20、125、200是循環的次數相乘,12代表一個指令周期為12個機器周期,2代表該指令周期為雙指令周期,12000000表示晶振的頻率,也是機器周期。 在實驗中可以觀察到VL1~VL7依次按照1~7秒間隔循環亮起。在故障出現時能夠保護現場,待故障消除后從現場又開始循環。 數碼管上顯示出從765432開始以1/10秒的速度遞減至765398,并保持顯示此數。
5.總結 通過本設計,我們大家對單片機的工作原理以及運用要求有了更進一步的了解,對我們的動手能力,編程能力都有很大的幫助。這次課程設計的控制要求有兩個,一個是用七只發光二極管模擬工業控制中的7道工序,高電平點亮,每道工序用定時器進行工序間的順序轉換。另一個是在第一個的基礎上運用動態掃描和定時器1在數碼管上顯示出從765432開始以1/10秒的速度遞減至765398,并保持顯示此數。我們首先收集了大量的資料,查找有關集成芯片和器件的文獻,只有對各種元器件有了充分的了解之后我們在實際的操作才會更快。 在完成第一個發光二極管的控制要求時,程序全部正確在走,硬件連接也全部正確,但是燈卻一直是全亮的,搞不懂怎么回事。把老師請來了才知道,是我們設置的燈的閃光時間太短,就是說燈是按照要求在點亮,但是由于點亮的速度太快,肉眼分辨不出它是否熄滅過,看起來就像一直在亮。可見如果不對整個設計的每一個細節都了解的清清楚楚的話,哪怕你做對了,你都搞不懂這是怎么回事。這告訴我們,以后無論在工作還是在生活中,都要認真對待每一個細節,不能得過且過,不求甚解。 在編程方面一直是我的弱項,好多程序我都搞不明白,這個時候我都會盡量去問同學,在課程設計的過程中,同學之間的相互幫助是相當重要的,有時自己的一個坎半天都過不去,但是說不定同學的一個點撥,我們就通了。所以,我們要學會團結協作,這樣,才會事半功倍。這次的設計教會我們的不止是專業知識,在生活道理上也教會了很多,讓我們終生受益。
完整的Word格式文檔51黑下載地址:
單片機原理及應用設計報告設計格式評分標準裝訂首頁.docx
(504.83 KB, 下載次數: 6)
2019-6-13 09:25 上傳
點擊文件名下載附件
單片機課程設計
|