日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)

發布時間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、實驗要求
  • 二、知識要點
    • (一)數碼管
    • (二)八段數碼管的字形編碼
    • (三)C51變量定義的四要素
    • (四)中斷源
    • (五)相關的特殊功能寄存器
      • 1、定時器/計數器控制寄存器TCON
      • 2、中斷允許控制寄存器IE
    • (六)中斷程序
      • 1、中斷初始化步驟
      • 2、中斷服務程序函數
  • 三、Proteus仿真軟件畫原理圖
  • 四、Keil編程軟件編寫程序
  • 五、實驗結果
    • (一)仿真結果
    • (二)連接電路
    • (三)燒錄并觀察實驗現象

一、實驗要求

【實驗目的】
1、熟悉51單片機的5個中斷源;
2、掌握外部中斷的中斷初始化和中斷服務函數的程序編寫方法,編程實現實現數碼管上顯示外部中斷計數。
【實驗內容】
1、用Proteus繪制硬件原理圖,并設置元件參數;
2、用KeilC51軟件編程實現數碼管上顯示外部中斷計數。

【硬件要求】
連接方法:P2.0-P2.7連接一只共陽型7段LED數碼管,按鍵K1連接至單片機P3.2(INT0)引腳。

二、知識要點

(一)數碼管

數碼管是一種半導體發光器件,基本單元是發光二極管,玻璃管中包括一個金屬絲網制成的陽極和多個陰極,它可以顯示數字和其他信息。

按其內部結構即發光二極管單元連接方式不同可分為共陽極和共陽極兩種數碼管,共陽級數碼管是指將數碼管內部的發光二極管的陽極接到一起形成一個公共陽極(COM),當某一字段的發光二極管的陰極為低電平時,相對應的字段點亮,而當某一字段的陰極為高電平時,相對應的字段就不亮;共陰極數據管與共陽極數碼管相反。

共陽的LED數碼管在應用時應將公共極COM接到+5V;共陰的LED數碼管在應用時應將公共極COM接到地線GND上。

(二)八段數碼管的字形編碼

以下是八段數碼管的字形編碼表,在使用時方便查閱:

字符共陽極共陰極
0C0H3FH
1F9H06H
2A4H5BH
3B0H4FH
499H66H
592H6DH
682H7DH
7F8H07H
880H7FH
990H6FH

(三)C51變量定義的四要素

C51變量定義的四要素如下:

1、存儲種類(重點!)
存儲種類分為四類:auto(自動型)、extern(外部型)、static(靜態型)、register(寄存器型),默認的存儲種類為自動型變量(auto),一般情況下不用寫出來。
自動型變量的作用范圍在定義它的函數體或語句塊內,執行結束后,變量所占用的內存會被釋放;
外部型的變量在其源文件中定義之后,在其它源文件中需要通過extern說明后才能使用該變量;
靜態型與自動型相反,在執行結束后其占用的內存單元繼續保留;
寄存器型變量是指將變量對應的存儲單元指定為通用寄存器,從而可提高程序的運行速度。
2、數據類型
數據類型分為整型、長整型、字符型、浮點型和指針型五種數據類型。
3、存儲類型(重點!)
C51編譯器三種編譯方式對應三種默認的存儲類型:SMALL對應data類型、COMPACT對應pdata類型、LARGE對應xdata類型,一般情況下若無特殊聲明,為SMALL編譯模式。
data類型變量的存儲區域位于直接尋址區(片內低128B RAM),其訪問數據的速度最快且容量較小,作為常用變量或臨時性變量存儲器;
idata類型變量的存儲區域位于間接尋址區(片內高128B RAM);
xdata類型變量的存儲區域位于外部寄存器(片外64KB RAM),常用于存放不常用的變量或者待處理的數據;
pdata類型變量的存儲區域位于分頁尋址區(片外低256B RAM),常用于外部設備訪問;
code類型變量的存儲區域位于程序存儲區(ROM),常用于存放數據表格等固定信息;
bdata類型變量的存儲區域位于位尋址區(片內可位尋址區),其允許位與字節混合訪問。

(四)中斷源

C51單片機的中斷系統有五個中斷源,分為2個外部中斷源和3個內部中斷源,它們是兩個外部中斷INT0(P3.2)和INT1(P3.3)、兩個片內定時器/計數器T0和T1和一個片內串行口的發送或接收中斷請求源T1或R1。
另外具有兩級中斷優先級,由中斷優先級控制寄存器IP控制,每個中斷源的優先級高低都可以通過編程控制,中斷允許受到CPU開中斷和中斷源開中斷的兩級控制。

(五)相關的特殊功能寄存器

1、定時器/計數器控制寄存器TCON

定時器/計數器控制寄存器TCON控制定時器/計數器的啟動與停止以及標志定時器的溢出和中斷情況,對TCON既可以采用字節尋址也可以采用位尋址,當51單片機系統復位時,TCON的所有位都會清零。
TCON的格式如下,高4位用于控制定時器/計數器的啟動和中斷請求,低4位控制外部中斷:

(1)TR1和TR0為運行控制位,等于0時停止定時器工作,等于1時啟動定時器工作(例啟動定時器T1工作:TR1=1);
(2)TF1和TF0為溢出中斷標志位,定時器溢出由硬件自動置為1,CPU響應中斷后,硬件自動清零(例TF1=0無溢出,TF1=1時溢出);
(3)IT1和IT0為外部中斷INT0、INT1的觸發方式控制位,由軟件來置1或清0,以控制外部中斷的觸發方式。(例IT1=1時,外部中斷INT1為下降沿觸發,IT1=0時,外部中斷INT1為低電平觸發);
(4)IE1和IE0為外部中斷的請求標志位,當引腳上出現中斷請求信號(低電平或脈沖下降沿)時,硬件自動將IEX置1,從而產生中斷請求標志,而當CPU響應中斷時,由硬件消除(例外部中斷INT0P3.2引腳有中斷請求信號時,IE0置1,即IE0=1)。

2、中斷允許控制寄存器IE

在中斷系統中,中斷源向CPU發出中斷請求后,由中斷允許控制寄存器IE和中斷優先級控制寄存器IP(本次實驗未使用)來管理CPU。
中斷允許控制寄存器IE控制中斷源的開放或屏蔽,它共6位,字節地址為A8H,如下:

(1)EA為中斷允許總控位,控制CPU的開放中斷,當EA=0時,CPU屏蔽所有中斷請求;EA=1時,CPU開放中斷(5個中斷源的中斷請求是否允許,要根據其中斷請求允許控制位來決定)。
(2)EX0、EX1分別為外部中斷0允許位和外部中斷1允許位,EX0=0時,禁止外部中斷0中斷,EX0=1時,允許外部中斷0中斷;EX1=0時,禁止外部中斷1中斷,EX1=1時,允許外部中斷1中斷。
(3)ET0、ET1分別為定時器/計數器Tx(x=0,1)溢出中斷允許位,等于0時禁止Tx(x=0,1)中斷,等于1時允許Tx(x=0,1中斷。
(4)ES為串行口中斷允許位,ES=0時禁止串行口中斷,ES=1時允許串行口中斷。

(六)中斷程序

中斷程序分為中斷初始化和中斷服務兩個部分組成。

1、中斷初始化步驟

中斷初始化是指用戶對特殊功能寄存器中的各控制位進行賦值,其步驟如下:
第一步,開相應中斷源的中斷,經中斷允許控制寄存器IE;
第二步*(兩個以上中斷需設定優先級),設定所用中斷源的中斷優先級,經中斷優先級控制寄存器IP;
第三步,若為外部中斷,則應規定采取的觸發方式,即采取的觸發方式是電平觸發方式或脈沖觸發方式,經定時器控制寄存器TCON。

當外部中斷采用電平觸發方式時,CPU在每個機器周期的S5P2時刻都檢測INT0和INT1引腳的輸入電平,若檢測到低電平,則認為由中斷信號,且在中斷服務結束前低電平必須清楚,否則中斷返回之前將再次產生中斷。
當外部中斷采用脈沖觸發方式時,CPU在每個機器周期的S5P2時刻都檢測INT0和INT1引腳的輸入電平,需連續檢測兩次(第一次檢測為高電平,第二次檢測為低電平),即檢測一個下降沿才被認為是一個有效的中斷請求信號。

2、中斷服務程序函數

中斷服務是指單片機檢測到中斷后響應中斷事件,中斷服務的步驟如下:
第一步,在中斷向量入口放置一條跳轉指令,讓程序從該入口跳轉到實際代碼的起始位置;
第二步,保存當前寄存器的內容;
第三步,清除中斷標志位,處理中斷事件;
第四步,恢復寄存器的內容,返回到原來主程序的執行處;

也就是創建中斷服務程序函數,該函數的定義格式如下,其中n為中斷源編號,可以為0-31之間的整數,前面跟上interrupt表示將函數聲明為中斷服務函數,而using m由于實現工作寄存器組的切換,m即為中斷服務子程序中選用的工作寄存器組號(0-3):

返回值 函數名稱([參數])interrupt n[using m]{ }

要注意中斷服務函數不能進行參數傳遞,且它沒有返回值(可以將中斷服務函數定義為void類型),另外不能調用中斷服務函數,因為會導致編譯錯誤。

三、Proteus仿真軟件畫原理圖

原理圖如下,其中的八段數碼管為7SEG-MPX1-CA,按鍵與P3端的P3.2INT0相連(外部中斷0請求輸入端,低電平有效,這里采用電平觸發方式):

四、Keil編程軟件編寫程序

首先創建一個數組Tab[],根據C51變量定義的四要素,將數組Tab定義為unsigned char code Tab[],其中的code的含義是用code把數組Tab[]定義在程序存儲器中,總的來說就是定義一個無符號字符型(自動變量)數組Tab[],且該變量位于ROM中,根據共陽極數碼管段碼,即unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};。
設置一個延時函數,依然還是設置一個有參數的函數,調用函數delay(1000)即延時1秒:

//延時函數 void delay(unsigned int x) {unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++); }

編寫中斷服務程序函數,如下:

unsigned char m; ... //中斷服務程序函數 void counter(void) interrupt 0 {EX0=0; //禁止外部中斷0中斷m++; //中斷計數P2=Tab[m]; //依次取數組Tab內的元素if(m==10){m=0;P2=Tab[m];}EX0=1; //允許外部中斷0中斷 }

完整程序代碼如下:

#include<reg51.h> unsigned char m; unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽極,對應八段數碼管的數字0-9 void delay(unsigned int x) //延時函數 {unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++); } void counter(void) interrupt 0 {EX0=0; //禁止外部中斷0中斷m++; //中斷計數P2=Tab[m]; //依次取數組Tab內的元素if(m==10){m=0;P2=Tab[m];}EX0=1; //允許外部中斷0中斷 } void main() {EX0=1; //允許外部中斷0中斷IT0=1; //外部中斷INT0為下降沿觸發EA=1; //使能CPU,CPU開放中斷while(1){P2=Tab[m]; //依次取數組Tab內的元素delay(1000); //調用延時函數,參數為1000,即1s} }

五、實驗結果

(一)仿真結果

導入可執行文件,點擊開始仿真:

按下按鍵一次:

按下第二次:

……依次到第九次,數字到9:

(二)連接電路

注意排線的接線方式,否則數碼管會顯示錯誤:

(三)燒錄并觀察實驗現象

燒錄后,實驗現象如下,按下按鍵:

再次按下按鍵,數字變為2:

……依次,按第九次按鍵,顯示數字9:

總結

以上是生活随笔為你收集整理的单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。