1. 程式人生 > >51微控制器0號與1號外部中斷例項

51微控制器0號與1號外部中斷例項

中斷的概念

CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷髮生); CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後,

再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。

我第一眼看見這東西,感覺跟函式巢狀呼叫的過程特別像。

中斷允許控制

CPU對中斷系統所有中斷以及某個中斷源的開放和遮蔽是由中斷允許暫存器IE控制的

EX0(IE.0),外部中斷0允許位;

ET0(IE.1),定時/計數器T0中斷允許位;

EX1(IE.2),外部中斷1允許位;

ET1(IE.3),定時/計數器T1中斷允許位;

ES(IE.4),序列口中斷允許位;

EA (IE.7), CPU中斷允許(總允許)位

中斷請求標誌

IT0(TCON.0),外部中斷0觸發方式控制位。

當IT0=0時,為電平觸發方式。

當IT0=1時,為邊沿觸發方式(下降沿有效)。

IE0(TCON.1),外部中斷0中斷請求標誌位。

IT1(TCON.2),外部中斷1觸發方式控制位。

IE1(TCON.3),外部中斷1中斷請求標誌位。

TF0(TCON.5),定時/計數器T0溢位中斷請求標誌位。

TF1(TCON.7),定時/計數器T1溢位中斷請求標誌位。

中斷優先順序原則

CPU同時接收到幾個中斷時,首先響應優先級別最高的中斷請求。

正在進行的中斷過程不能被新的同級或低優先順序的中斷請求所中斷。

正在進行的低優先順序中斷服務,能被高優先順序中斷請求所中斷

中斷響應條件

中斷源有中斷請求;

此中斷源的中斷允許位為1;

CPU開中斷(即EA=1)。

以上三條同時滿足時,CPU才有可能響應中斷

以外部中斷0為例

 主程式中需要有以下程式碼:

EA=1;//開啟總中斷開關

EX0=1;//開外部中斷0

IT0=0/1;//設定外部中斷的觸發方式(  0為低電平, 1為下降沿 )

接下來。我們用K3獨立按鍵,控制led的狀態翻轉

#include <reg52.h>
/************ 0號中斷控制led燈狀態翻轉 ***********/

sbit LED = P0^0
; sbit k3 = P3^2; //0號中斷 typedef unsigned int u16; typedef unsigned char u8; void delay( u16 i ){ while( i-- ); } void int0_init(){ //開啟0號外部中斷的條件 EA = 1; //總中斷開關 EX0 = 1; //允許外部中斷0 IT0 = 1; //外部中斷0的觸發方式 } void trigger_int0() interrupt 0{ delay( 1100 ); if( k3 == 0 ) { //k3按下 LED = ~LED; } } void main(){ int0_init(); while( 1 ); }

接線: 用杜邦線連線K3與P3的2腳。P0的0腳連線LED的排針。interrupt 0 這個0指的是中斷號

下例用k4按鍵,處理1號外部中斷。相應的連線也要做出調整:

#include <reg52.h>
/************ 1號中斷控制led燈狀態翻轉 ***********/

sbit LED = P0^0;
sbit k4 = P3^3; //1號中斷

typedef unsigned int u16;
typedef unsigned char u8;

void delay( u16 i ){
    while( i-- );
}

void int1_init(){  //開啟1號外部中斷的條件
    EA = 1;  //總中斷開關
    EX1 = 1;    //允許外部中斷1
    IT1 = 1;    //外部中斷1的觸發方式
}

void trigger_int1() interrupt 2{
    delay( 1100 );
    if( k4 == 0 ) { //k3按下
        LED = ~LED;        
    }
}

void main(){
    int1_init();
    while( 1 );
}

相關推薦

51微控制器01外部中斷例項

中斷的概念 CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷髮生); CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後, 再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。 我第一眼看見這東西,感覺跟函式巢狀呼叫的過

51單片機01外部中斷實例

har 處理 reg 寄存器 typedef image str IE span 中斷的概念 CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生); CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後, 再

微信公眾平臺開發教程(十) 訂閱服務的區別

接口文檔 lpad 手機 全部 oauth2.0 spa 上傳 ima lsp 為了消除大家對訂閱號與服務號的疑問,特總結如下: 功能點 介紹 訂閱號 服務號 註冊 註冊賬號 個人信息 個人信息和企業相關信息 展示 在

MyBatis mapper.xml中SQL處理小於大於 和小於等於

class lsp adding style eight mybatis family height app 我們只需作如下替換即可避免上述的錯誤: < <= > >= & ‘ " &lt; &lt;= &

通過xml處理sql語句時對小於大於的處理轉換

當我們需要通過xml格式處理sql語句時,經常會用到< ,<=,>,>=等符號,但是很容易引起xml格式的錯誤,這樣會導致後臺將xml字串轉換為xml文件時報錯,從而導致程式錯誤。 這樣的問題在iBatiS中或者自定義的xml處理sql的程式中經常需要我們來處理。其實很簡

xml處理sql語句時對小於大於的處理轉換

當我們需要通過xml格式處理sql語句時,經常會用到< ,<=,>,>=等符號,但是很容易引起xml格式的錯誤,這樣會導致後臺將xml字串轉換為xml文件時報錯,從而導致程式錯誤。 這樣的問題在iBatiS中或者自定義的xml處理

微信公眾 訂閱服務的區別

1. 說明 微信公眾平臺有4類賬號:訂閱號、服務號、企業號及小程式。 訂閱號和服務號統稱為公眾號。 2. 區別 2.1 主要區別 訂閱號的註冊主體可以為個人,但現在已關閉個人認證。服務號的註冊主體不能為個人。 表:主要區別 說明 訂閱號 服務號 賬號說明 偏於為使

MyBatis mapper.xml中SQL處理小於大於

這種問題在xml處理sql的程式中經常需要我們來進行特殊處理。      其實很簡單,我們只需作如下替換即可避免上述的錯誤: < <= > >= & ' " &lt; &lt;= &gt; &gt

51微控制器ADD,ADDCSUBB指令詳細分析

ADD與ADDC 加法指令: 例如:執行0xfefe+0x0003由於微控制器只能處理8位資料加減法 具體操作如下: /////////////////////////////低八位加法////////////////////////////////// mov r0,#0

SQL獲取上個月1,本月1,下個月1,本月天數 [sql語句]

上個月1號 select CONVERT(varchar(7), dateadd(mm,-1,getdate()) , 120) + '-1' 本月1號 select CONVERT(varchar(7), getdate() , 120) + '-1' 下個月1

氣泡排序法 這個j 10-i-1 為什麼j要小於N-i?是什麼意思? 氣泡排序的一步演算法 for (j=0; j( 小於)(len-1-i); ++j) 沒理解 求詳細說明!

再醉不逍遙 答: 裡面的for迴圈完成一次迴圈,就將最大值轉移到最後,那麼下一次(外面for)就要排除最後已經得到的最大值,在剩下的值中再次得到最大值並轉移到最後。 每一次冒泡後,都要少比較一個數據,比如 4 5 2 1 一次冒泡得 4 2 1 5 二次冒泡得(這時只要遍歷3個 4 2 1 )2

山東大學電子設計飛思卡爾協會培訓1——51微控制器

我理解的51微控制器 電子設計與飛思卡爾協會培訓1 作為功能強大的微型控制器,很多地方將之與CPU放在一起討論可能比較容易理解。 比如我們現在手邊恰好有一塊STC89C52RC型號的微控制器,我們該怎麼使用它呢?看說明書。這裡,我們一般叫——資料手冊。記得

Redis叢集~StackExchange.Redis(10月61.1.608.0)連線Twemproxy支援Auth指令了

回到目錄 對於StackExchange.Redis這個驅動來說,之前的版本在使用Proxy為Twemproxy代理時,它是不支援Password屬性的,即不支援原始的Auth指令,而我也修改過原始碼,為CommandMap添加了Auth但最後測試的結果還是失敗了,就在10月1過完後的第一天,我升級了Sta

微信公眾HTML 5混合模式揭祕1——如何部署JSSDK

本文是連載JSSDK+H5的書,這裡是第一篇揭祕————如何部署JSSDK 部署JSSDK不會太難,有時候需要一點後臺知識,但也不是太難的那種,本節主要是用PHP作為後臺參考語言,為了照顧初學者,把程式碼寫的簡單一點,實現最終目的是第一優先權。 在上一節中已經講解了部署

51微控制器之——外部中斷0(INT0)

暫存器是幹什麼的?怎麼配置它?配置完暫存器後,有什麼作用呢? 暫存器是中央處理器內的組成部分。它是有限存貯容量的高速存貯部件,它們可用來暫存指令、資料和地址。暫存器可以用來暫存指令、暫存資料、暫存地址。換而言之,我們配置暫存器,便是給暫存器中賦予一定的值,而這

IP地址、子網掩碼、網路、主機、網路地址、主機地址以及ip段/數字-如192.168.0.1/24是什麼意思?

背景知識 IP地址 IP地址被用來給Internet上的電腦一個編號。大家日常見到的情況是每臺聯網的PC上都需要有IP地址,才能正常通訊。我們可以把“個人電腦”比作“一臺電話”,那麼“IP地址”就相當於“電話號碼”,而Internet中的路由器,

IP地址、網路、主機、網路地址、子網掩碼、閘道器、192.168.0.1/24是什麼意思

IP地址 IP地址通俗上講,就是臺電腦在網路世界的唯一標識,它由32的二進位制陣列成,也就是4個位元組,就像人的身份證一樣,它能夠唯一標識一臺電腦。 IP地址的組成 IP地址=網路ID+主機ID,同一個網路的IP地址能夠公用(不能全為“0”,也不能全為“1”)。

linux的 0程序 和 1 程序

前言 Linux下有3個特殊的程序,idle程序(PID = 0), init程序(PID = 1)和kthreadd(PID = 2) * idle程序由系統自動建立, 執行在核心態  idle程序其pid=0,其前身是系統建立的第一個程序,也是唯一一個沒有通過fork或者kernel_threa

Linux程序的管理排程(六) -- Linux下1程序的前世(kernel_init)今生(init程序)

Linux下有3個特殊的程序,idle程序(PID=0), init程序(PID=1)和kthreadd(PID=2) * idle程序由系統自動建立, 執行在核心態 idle程序其pid=0,其前身是系統建立的第一個程序,也是唯一一個沒有通過fork或者kernel

s3c6410外部中斷引腳問題

在編寫Linux驅動程式時,我想用某一個引腳做外部中斷。但是在呼叫 int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs ),unsigne