一、實驗相關知識點 1.掌握外部中斷的工作原理; 2.學會中斷程序設計。 二、實驗內容及要求 【實驗內容】 (1)創建一個包含80C51固件,采用Keil for 8051編譯器的新項目; (2)仿照圖A.5和表A.4繪制電路原理圖; (3)編寫C51源程序,要求采用中斷方法實現如下功能:程序啟動后,D1處于熄燈、LED1處于黑屏狀態;單擊K1,可使D1亮燈狀態反轉一次;單擊K2,可使LED1顯示值加1,并按十六進制數顯示,達到F后重新從1開始。 (4)完成源程序編譯和動態調試,實現實驗4的控制功能要求; (5)完成實驗4文檔的撰寫。 【實驗要求】 提交實驗文檔并包括如下內容: (1)電路原理圖 (2)C51源程序(含注釋語句) (3)軟件調試分析 (4)仿真運行截圖 (5)實驗小結 三、實驗方法 1.實驗電路圖中按鍵K1和K2分別接于P3.2和P3.3,發光二極管D1接于P0.4,共陰極數碼管LED1接于P2口。 2.軟件編程原理為:將數碼管0~F的顯示字模保存在數組中,K1和K2的按鍵動作分別作為的中斷請求,在中斷函數中進行LED燈控制和數碼管顯示刷新。初始化后,主函數處于無限循環狀態,等待中斷請求。 四、實驗流程 1.電路原理圖 2. C51源程序(含注釋語句) - #include "reg51.h"// 引入8051單片機的頭文件
- unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,};
- // 定義一個無符號字符型數組 led_mod,用于存儲數碼管顯示 0 - F 以及其他字符的段碼
- // 這里共陰極數碼管顯示 0 - F 及部分字符對應的段碼依次存儲在數組中
- unsigned char count = 0; // 定義一個無符號字符型變量 count,用于記錄數碼管顯示的索引值,初始化為 0
- sbit P04 = P0^4;// 使用 sbit 關鍵字定義 P0 口的第 4 位為 P04,方便后續對該引腳進行操作
- // 外部中斷 0 的中斷服務函數,當外部中斷 0 觸發時執行此函數
- // 函數名為 int0_key,中斷號為 0
- int0_key() interrupt 0{
- P04 = !P04; // 對 P04 引腳的電平取反,實現連接在該引腳的 LED 燈亮滅狀態的切換
- }
- // 外部中斷 1 的中斷服務函數,當外部中斷 1 觸發時執行此函數
- // 函數名為 int1_key,中斷號為 2
- int1_key() interrupt 2{
- P2 = led_mod[count];
- if (++count>=0x10) count=0;
- // 先將 count 的值加 1,然后判斷是否大于等于 0x10
- // 如果大于等于 0x10,則將 count 重新置為 0,實現循環顯示
- }
- // 主函數,程序的入口點
- void main(){
- IT0=IT1=EX0=EX1=EA=1;
- // 設置外部中斷 0 和外部中斷 1 的觸發方式為下降沿觸發
- // IT0 控制外部中斷 0 的觸發方式,IT1 控制外部中斷 1 的觸發方式
- // EX0 使能外部中斷 0,EX1 使能外部中斷 1
- // EA 是總中斷允許位,置 1 表示允許所有中斷
- P2 = 0; // 將 P2 口初始化為低電平,即數碼管初始不顯示任何字符
- while(1);
- // 主函數進入一個無限循環,程序會一直停留在這個循環中
- // 等待外部中斷的觸發,當有中斷觸發時,會跳轉到相應的中斷服務函數執行
- }
復制代碼3. 程序分析 這段代碼主要功能是利用外部中斷來控制硬件設備。具體而言,通過外部中斷 0 控制一個 LED 燈(連接在 P0.4 引腳)的亮滅狀態切換,通過外部中斷 1 控制共陰極數碼管(連接在 P2 口)循環顯示預設的字符段碼。 (1)頭文件包含 引入了reg51.h頭文件,該頭文件中定義了 8051 單片機的特殊功能寄存器和位定義,使得代碼可以方便地訪問和操作單片機的各個寄存器。 (2)數碼管段碼數組 定義了一個無符號字符型數組led_mod,用于存儲共陰極數碼管顯示 0 - F 以及其他字符的段碼。每個元素對應一個字符的顯示編碼,當需要顯示某個字符時,只需將對應的段碼輸出到數碼管的控制端口。 (3)計數器變量 定義了一個無符號字符型變量count,初始值為 0。該變量作為索引,用于從led_mod數組中選取要顯示的段碼,同時在外部中斷 1 的處理中用于控制顯示的循環。 (4)引腳定義 使用sbit關鍵字將 P0 口的第 4 位定義為P04,這樣在代碼中可以直接使用P04來操作該引腳,提高了代碼的可讀性和可維護性。 (5)外部中斷 0 服務函數 函數名為int0_key。中斷號為0,表示這是外部中斷 0 的服務函數。當外部中斷 0 觸發時,將P04引腳的電平取反,從而實現連接在該引腳的 LED 燈亮滅狀態的切換。 (6)外部中斷 1 服務函數 函數名為int1_key,中斷號為2,表示這是外部中斷 1 的服務函數。功能是將led_mod數組中索引為count的段碼賦值給 P2 口,驅動數碼管顯示對應的字符。并將count的值加 1,然后判斷是否大于等于0x10。如果大于等于0x10,則將count重新置為 0,實現數碼管顯示的循環。 (7)主函數 中斷和觸發方式設置:IT0 = IT1 = 1,將外部中斷 0 和外部中斷 1 的觸發方式設置為下降沿觸發。EX0 = EX1 = 1,使能外部中斷 0 和外部中斷 1。EA = 1,使能總中斷,允許所有中斷源產生中斷。 數碼管初始化:P2 = 0,將 P2 口初始化為低電平,使數碼管初始狀態不顯示任何字符。 無限循環:while(1);,主函數進入一個無限循環,程序會一直停留在這個循環中,等待外部中斷的觸發。當有中斷觸發時,程序會跳轉到相應的中斷服務函數執行。 4. 軟件調試 5. 仿真運行截圖
實驗結論
本次實驗基于 80C51 單片機,成功運用 Keil for 8051 編譯器完成項目創建與代碼編寫,通過繪制電路原理圖并搭建硬件連接,實現了外部中斷控制功能。其中,K1 按鍵觸發外部中斷 0,能夠準確實現 D1 亮燈狀態的反轉;K2 按鍵觸發外部中斷 1,可使 LED1 按十六進制數規律循環顯示數值。經編譯調試與仿真運行,程序穩定運行,功能完全符合預期,驗證了外部中斷工作原理在單片機控制系統中的有效性和實用性,達到了實驗目標。
實驗個人體會
通過本次實驗,我對外部中斷的工作機制有了更深刻的理解,從理論學習到實際編程調試,掌握了中斷程序設計的基本方法和技巧。在調試過程中,遇到過按鍵抖動導致誤觸發、數碼管顯示異常等問題,通過查閱資料和逐步排查,最終得以解決,這極大地提升了我的問題分析和解決能力。同時,也意識到代碼規范性、注釋添加以及硬件連接準確性的重要性。未來,我將繼續深入學習單片機知識,加強實踐操作,提升綜合應用能力,以便更好地應對復雜的嵌入式系統開發任務。
仿真文件和Word ppt下載:
實驗5.7z
(979.97 KB, 下載次數: 0)
2025-5-28 09:14 上傳
點擊文件名下載附件
數碼管的中斷控制 下載積分: 黑幣 -5
|