娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | 51單片機入門教程(5)——定時器中斷

發布者:DelightWish123 來源: eefocus關鍵字:51單片機  定時器中斷  微處理器 手機看文章 掃描二維碼
隨時隨地手機看文章

寫在開頭:中斷是包括單片機在內的所有微處理器很重要的功能之一,初學單片機必須這一部分的知識。


一、中斷的概念

先看百度百科是怎么定義中斷的:


中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。

—— 百度百科


那么怎么理解中斷?看下面的例子。


關于中斷:

小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉去玩吃雞游戲。玩了幾局后,關掉游戲,繼續學習。


關于中斷優先級:

小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉去玩吃雞游戲,(吃雞過程中,小A女朋友打來電話,于是掛機游戲,去接電話,接完電話,繼續游戲。)玩了幾局后,關掉游戲,繼續學習。


幾個重要概念:

中斷:小A學習被小B打斷的過程就稱為中斷。

中斷源:小B被稱為中斷源。

中斷服務程序:小A執行的玩游戲操作稱為中斷服務程序

中斷優先級:小A女朋友的電話比游戲優先級高


在89c52單片機中,有3類中斷源:


1、外部中斷:當外部中斷引腳信號產生跳變(低電平→高電平)時引起中斷。

2、定時器/計數器中斷:當計數器計滿溢出時引起跳變。

3、串口中斷:串行端口完成一幀數據的發送/接受時引起(如藍牙傳輸)。


其優先級如下表:


中斷源 優先級 中斷服務號

INT0 – 外部中斷0 最高 0

T0 – 定時器/計數器0中斷 第2 1

INT1 – 外部中斷1 第3 2

T1 – 定時器/計數器1中斷 第4 3

串口中斷 第5 4

T2 – 定時器/計數器2中斷 最低 5

下面以定時器中斷為例,討論中斷的編程方法。


二、定時器中斷

2.1 軟件延時的不足

根據現有的知識,如果要在程序中等待一端時間,想到的操作應該是通過執行若干次空指令,達到延時的效果。

如下:


//延時xms

void delayms(uint xms){

  uint i,j;

  for(i = 0; i < xms; ++i)

    for(j = 0; j < 110; ++j)

    ;

}


但是,假設要實現以下功能:


1、8位數碼管動態掃描顯示。

2、LED燈每隔1s閃爍一次。


電路如下:

在這里插入圖片描述

考慮程序怎么寫……


//代碼不完整,僅為舉例說明

void main(){

  P2 = 0x01;       //數碼管從最低位開始掃描

  while(1){

    //功能1:執行數碼管動態掃描

    //P2控制顯示哪一個數碼管,P0控制數碼管顯示什么內容

    P2 = P2<<1;      //掃描更高一位的數碼管

    P0 = xxxx;       //輸出段碼

    delayms(5);      //延時5ms后顯示下一位數碼管

  

    //功能2:執行LED燈閃爍

    led = ~led;     //LED燈狀態取反

    delayms(1000);  //延時1000ms

  }

}


功能1和功能2單獨寫都沒有問題。

但是如果組合在一起,寫在一個while循環中,就會有問題了:

一個while循環中有兩個延時函數,因此執行一次while循環,共延時了1005ms。這并不是我們所希望的結果。我們希望led閃爍的延時不影響數碼管動態掃描的延時。


2.2 中斷寄存器

要使用硬件定時,主要涉及到寄存器的操作。51單片機里的關于中斷的寄存器如下:


IE – 中斷允許控制寄存器

IP – 中斷優先級控制寄存器

TMOD – 定時器工作方式寄存器

TCON – 定時器控制寄存器

SCON – 串口控制寄存器

THx/TLx – 定時器初值寄存器


在定時器中斷中,需要設置的有TMOD、THx/TLx、TCON、IE。

下面只介紹使用定時器中斷所需要設置的寄存器,其余寄存器可自行查閱資料。


2.2.1 中斷允許控制寄存器 IE

該寄存器的主要功能是控制中斷的開啟與關閉,共7個有效位,包含一個全局中斷控制位和6個中斷源的控制位。

中斷允許控制寄存器 IE各位的定義如下表:


序號 D7 D6 D5 D4 D3 D2 D1 D0

符號 EA – ET2 ES ET1 EX1 ET0 EX0

說明:

EA 全局中斷允許位,當此位是1時中斷可用。(重要)

ET2 定時器/計數器2中斷允許位

ES 串口中斷允許位

ET1 定時器/計數器1中斷允許位

EX1 外部中斷1允許位

ET0 定時器/計數器0中斷允許位 (重要)

EX0 外部中斷0允許位

要使用定時器中斷,需要將IE寄存器中的EA位設置為1,以及需要將ETx(x = 0,1,2)設置為1。


2.2.2 定時器工作方式寄存器 TMOD

該寄存器的主要功能是設置定時器/計數器中斷的工作方式。如設置位定時器模式、定時器模式的計數位的位數。以下是詳細介紹:

定時器工作方式寄存器 TMOD各位的定義如下表:


序號 D7 D6 D5 D4 D3 D2 D1 D0

符號 GATE

C/TˉˉˉC/bar{T}

C/ 

T

ˉ

 

M1 M0 GATE

C/TˉˉˉC/bar{T}

C/ 

T

ˉ

 

M1 M0

說明:

GATE 定時器/計數器的開關控制選項。常將該位置0,即定時器/計數器的開關控制僅由TCON寄存器中的TRx(x = 0,1)控制。(見2.2.3的TRx)

C/T 定時器模式和計數器模式選擇位,將該位置0則為定時器模式。

M1M0 設置定時器/計數器工作方式,常將該兩位設置為0 1,其定義如下表:


M1 M0 工作方式

0 0 模式0,13位計數

0 1 模式1,16位計數,常用此模式

1 0 模式2,8位初值自動重裝

1 1 模式3,僅適用于T0,分為兩個8位計數器,T1停止計數

2.2.3 定時器控制寄存器 TCON

該寄存器用于控制中斷,如控制定時器的啟動,停止、判斷定時器的溢出和中斷情況。

定時器控制寄存器 TCON各位的定義如下表:


序號 D7 D6 D5 D4 D3 D2 D1 D0

符號 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

說明:

TF1 定時器1溢出標志位

TR1 定時器1運行控制位,將該位置1時啟動定時器1

TF0 定時器0溢出標志位

TR0 定時器0運行控制位,將該位置1時啟動定時器0 (重要)

IE1 外部中斷1請求標志

IT1 外部中斷1觸發方式選擇位

IE0 外部中斷0請求標志

IT0 外部中斷0觸發方式選擇位


2.2.4 定時器初值寄存器 THx/TLx

以定時器T0為例,其的工作原理是,每當晶振產生一次脈沖,就將該寄存器TL0加一,當TL0加滿溢出后,將TL0清空,TH0加一,TH0計滿后產生定時中斷。即TH0與TL0組成了一個16位的計數器,這個計數器可以從0x0000(0)加到0xffff(65535)。


以12Mhz的晶振、定時10ms為例:

51單片機為12分頻單片機,因此執行一條指令的時間是12×(1/12M) s,即計數器每1us加一。


若定時10ms,則共需要加10000次。

因此將TH0、TL0設置從(65536-10000)= 55536開始計數。55536 的16進制為0xD8F0。因此將TH0設置為0xD8,TL0 設置為0xF0。


2.3 定時器中斷程序寫法

首先要初始化定時器,即將命令寫入以上的寄存器。 假設使用定時器T0

首先設置定時器工作模式TMOD:GATE設置為0;C/T位設置為0使其工作在定時器模式下;M1M0設置為01,使用16位計數。

因此第一句代碼是


TMOD = 0x01;   // 0000 0001


然后設置定時器時長THx/TLx:


TH0 = 0xD8;

TL0 = 0xF0;


設置定時器允許寄存器IE,打開中斷總開關和T0中斷開關


EA = 1;

ET0 = 1;


最后設置定時器控制寄存器TCON,使定時器開始計數


TR0 = 1;


因此,完整的定時器初始化代碼如下


void initT0(){

  TMOD = 0x01;   // 0000 0001.

  TH0 = 0xD8;    //65536-10000

  TL0 = 0xF0;    //55536

  EA = 1;

  ET0 = 1;

  TR0 = 1;

}


當定時器計數觸發中斷時,單片機會調用中斷服務程序。中斷服務程序的格式如下:


void 函數名() interrupt 中斷號 using 工作組

{

  //所要執行內容

}


說明:

中斷服務函數要寫在主函數后面,且不需要聲明 。

中斷服務函數無返回值,所以用void

函數名可以隨便起

interrupt后的中斷號由下表的重點服務號確定

using 工作組可省略不寫


中斷源 優先級 中斷服務號

INT0 – 外部中斷0 最高 0

T0 – 定時器/計數器0中斷 第2 1

INT1 – 外部中斷1 第3 2

T1 – 定時器/計數器1中斷 第4 3

串口中斷 第5 4

T2 – 定時器/計數器2中斷 最低 5

因此T0中斷服務程序如下:


void t0Intr() interrupt 0

{

  //因為執行到此時,計數器已經清零,所以要重新賦值

  TH0 = 0xD8;    //65536-10000

  TL0 = 0xF0;    //55536

  

  //下面寫需要執行的操作

}


根據以上內容,可設計一個簡單定時器電路如下:

在這里插入圖片描述

其中:


D1燈由定時器控制,每秒閃一次

D2 - D8由軟件延時實現流水燈效果,周期為100ms


代碼如下


#include

#include

//num為計數器,每10ms將num加一,當num為100時為1s

unsigned char num;

sbit led = P1^0;

//函數聲明

void delay100ms();  //軟件延時100ms

void initT0();      //初始化定時器T0


void main()

{

  unsigned char k ;

  //初始化num值

  num = 0;

  //初始化定時器

  initT0();

  //初始化led燈

  led = 0;

  //初始化流水燈

  P0 = 0xfe;

  k = 0xfe;

  while(1)

  {

    //每100ms流水燈移位一次

    k = _crol_(k, 1);

    P0 = k;

    delay100ms();

  }

}

//t0定時器中斷服務程序

//每隔10ms進入一次該程序

void t0Intr() interrupt 1

{

  TH0 = 0xD8;

  TL0 = 0xF0;

  

  num++;   //該變量加至100說明為1s

  if(num == 100)

  {

    num = 0;

    led = ~led;   //翻轉led燈狀態

  }

}

void delay100ms()

{

  unsigned char a,b,c;

  for(c=19;c>0;c--)

    for(b=20;b>0;b--)

      for(a=130;a>0;a--);

}


void initT0()

{

  TMOD = 0x01;

  TH0 = 0xD8;

  TL0 = 0xF0;

  EA = 1;

  ET0 = 1;

  TR0 = 1;

}

關鍵字:51單片機  定時器中斷  微處理器 引用地址:51單片機入門教程(5)——定時器中斷

上一篇:51單片機流水燈電路以及C代碼
下一篇:51單片機入門教程(4)——按鍵控制

推薦閱讀

一聽到機器人替你賺錢,小伙伴幻想的美夢終于要實現了,瞬間讓登上了人生巔峰,當上了CEO,即將迎娶白富美。這不,是不是要感謝為你創造帶你賺錢的凌鳥智能呢?下面開始閱讀如何使用機器人賺錢的說明書。隨著工業4.0時代的到來,工廠智能化已成為不可逆的發展趨勢,人力成本的上漲、企業對于各種能源資源的巨大需求,也掀起了工業自動化設備產業的發展大潮...
在工業富聯近日組織的一次投資者關系活動中,對于公司2019年上半年的經營狀況進行了介紹。除此之外,還對近段時間外界環境及中美貿易摩擦問題給公司造成的影響進行解答。本次活動中,工業富聯總經理鄭弘孟表示,結合公司2018年年報及2019年第一季季報數據,工業富聯目前經營狀況良好,將延續 2018 年第四季度、2019 年第一季度的強勁發展勢頭。以下是關...
1、源碼包Kernel:linux-2.6.18.2Uboot:u-boot-1.1.4Gcc:arm-linux-gcc-3.4.1.tar.bz2 開發流程及詳細步驟1、休眠部分1.電源管理守護進程省略 2.內核接口文件(arch/arm/kernel/apm.c)電源守護進程通過apm.c的ioctl函數來使內核開始進入sleep模式。case APM_IOC_SUSPEND: as->suspend_result = -EINTR; if (as->suspend_state ==...
6 月 14 日消息 根據外媒 theregister 消息,新加坡南洋理工大學教授 Rachid Yazami(拉奇德 雅扎米)近日研發了一種新型快充技術,可以實現 10 分鐘內為鋰電池充滿電。這位教授最知名的成就便是在 1983 年左右發明了具有實用性的鋰電池石墨陽極,成為現代鋰電池的基礎。近日雅扎米教授聲稱,他的公司實現了世界上最快的鋰電池快充技術,是特...

史海拾趣

問答坊 | AI 解惑

《電磁兼容使用手冊》

關于EMC方面的經典書籍。作者:陳偉華 必須2部分下載后,再解壓…

查看全部問答∨

《基本電路分析(全美經典學習指導系列)》

簡介: 內容簡介:   本書涵蓋了電路分析的基本內容,包括各種直流和交流電路,特別是運算放大器電路的分析方法,并介紹了計算機電路分析程序PSpice。書中對精選的700道習題,詳細介紹了解題步驟;另外提供了幾百道補充練習題,并附有答案。 ...…

查看全部問答∨

采用FPGA的可編程電壓源系統原理及設計2

程序中,duty為控制占空比的參數;count為控制分頻的參數。通過改變duty和count兩個參數,得到占空比及分頻數可調的時鐘信號,極為方便。 2.2 其他模塊的實現     其他控制模塊包括地址發生器、DAC控制電路、并/串轉換電路。存儲數據 ...…

查看全部問答∨

請大家幫忙想個方案,謝謝

本人最近要申請國家的一個大學生創新項目,但是現在還沒有好一點的想法,難就難在要有創新點,做別人之前沒做的或是在別人的基礎上改進,偏硬件方面的,比如ARM嵌入式,FPGA之類的,便要涉及一些算法,大家有沒有好的想法可以提供一下啊,我是計信 ...…

查看全部問答∨

cpu怎么訪問硬盤的

各位大俠,小弟有點不明白,32位地址總線的CPU,最大可以讀到2@32,也就是4G的地址,那么160G的硬盤,它怎么讀到的呢?直接訪問好像訪問不到吧?謝謝了…

查看全部問答∨

msgQreceive返回error,表示什么?

是代表隊列沒數據,還是什么錯誤啊?一般都是什么引起的?多謝啊…

查看全部問答∨

【TI建議】讓更多的壇友參與

毫無疑問,【最愛TI M3 - Stellaris!】板塊是論壇最火、活動也最多的板塊,這里面體現了論壇管理層的重視、TI的大力支持和壇友的熱情參與。當前板塊成員結構大致是:資深電子工程師和在校學生,這當中在校學生占比重更大,他們對嵌入式應用的編程 ...…

查看全部問答∨

大家討論一下這個條件用什么測距方法比較好

是這樣的一個結構我先給大家簡單的說下,在地表打一個20多米深的孔,孔口直徑在110毫米以上的,在這個孔的下面有可能有一些積水,我想問問大家有什么方法殼儀在孔口位置可以透過水面測到孔底。雖然這個用笨方法很簡單,用繩子側就行了,但是我想知 ...…

查看全部問答∨

誰能推薦一個ST7538電力線載波仿真板

     在做電力線載波通信的部分,想自己配一套ST7538的FSK調制解調模塊,最好主控芯片是ATmega系列,最好能有較全的外圍接口和較多的功能,如撥碼按鍵、+-12V電源輸出、RS232/485接口等。     等待用過的或有了解的 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 博客| 大新县| 文昌市| 鲁山县| 开原市| 山阳县| 建平县| 武强县| 六安市| 老河口市| 民勤县| 瑞丽市| 屯门区| 调兵山市| 芜湖市| 山东省| 枣庄市| 天门市| 望城县| 大庆市| 六安市| 尼勒克县| 红原县| 连平县| 道孚县| 潮安县| 新巴尔虎右旗| 大渡口区| 云浮市| 五寨县| 舟山市| 扎鲁特旗| 保定市| 两当县| 高邮市| 三河市| 类乌齐县| 白玉县| 额尔古纳市| 南郑县| 资兴市|