单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)
目錄
- 一、實驗要求
- 二、知識要點
- (一)單片機定時器/計數器
- (二)相關的特殊功能寄存器
- 1、工作方式寄存器TMOD
- 2、定時器/計數器控制寄存器TCON
- (三)定時器/計數器的工作方式
- 1、工作方式0
- 2、工作方式1
- 3、工作方式2
- 4、工作方式3
- (四)預置定時器/計數器的初值
- 1、預置計數器初值
- 2、預置定時器初值
- (五)四類定時/計數方法
- (六)定時器/計數器的初始化過程
- 三、Proteus仿真軟件畫原理圖
- 四、Keil編程軟件編寫程序
- 五、實驗結果
- (一)仿真結果
- (二)連接電路
- (三)燒錄并觀察實驗現象
- 結語
一、實驗要求
【實驗目的】
1、掌握定時器控制寄存器的設置方法;掌握定時器初始化流程;
2、掌握定時器中斷服務程序的編寫方法。
【實驗內容】
數碼管上顯示定時器中斷計數(定時時間1s)。
【硬件要求】
連接方法:P2.0-P2.7連接一只共陽型7段LED數碼管,P1.0連接至單片機P3.5(T1)引腳。
【軟件實現】
編程實現實現數碼管上顯示定時器中斷計數(定時時間1s)。
二、知識要點
(一)單片機定時器/計數器
單片機有兩個16位的可編程的定時器/計數器T0和T1,可用作定時或延時,它們具有兩種工作模式(計數模式和定時模式)和四種工作方式(工作方式0、工作方式1、工作方式2、工作方式3),定時器/計數器的核心部件是二進制加1計數器(TH0、TL0或TH1、TL1)。
定時器/計數器的兩種工作模式都是對脈沖信號進行計數的,只是計數信號的來源不同,定時模式來自內部,而計數模式來自外部。與T0和T1相關的寄存器有:兩個8位的控制寄存器TMOD和TCON、兩個16位的計數器TH0、TL0或TH1、TL1。
(二)相關的特殊功能寄存器
1、工作方式寄存器TMOD
8位特殊功能寄存器TMOD用于選擇定時器/計數器T0、T1的工作方式,它分為兩組,高4位決定T1的工作方式,低4位決定T0的工作方式,以下是TMOD的格式:
(1)GATE為門控位,當GATE=0時,使TCON的TR0或TR1為1就可以啟動定時器/計數器工作,而當GATE=1時,除了需要使TCON以外,同時還需要使外部中斷引腳為高電平時才能啟動定時器/計數器工作,即T0、T1的是否計數受到外部引腳輸入電平的控制,其中INT0引腳控制T0,INT1引腳控制T1,可用于測量在INT0和INT1引腳出現的正脈沖寬度。
(2)C/T為定時/計數模式選擇位,通過該位選擇工作模式,當C/T=0時,工作模式為定時模式,即此時脈沖周期等于機器周期,計數器對機器周期計數,通過計數值就可以得到計數的時間;而當C/T=1時,工作模式為計數模式,計數器輸入信號外部引腳,即計數器對外部輸入引腳T0(P3.4)或T1(P3.5)的外部脈沖(負跳變)計數,允許的最高計數頻率位晶振頻率的1/24。
(3)M1、M0為工作方式選擇位,通過該位選擇工作方式,如下表,當M1、M0為不同值時對應相應的四種工作方式:
| 0 | 0 | 工作方式0 | 13位計數器(TH的8位和TL的低5位) |
| 0 | 1 | 工作方式1 | 16位計數器 |
| 1 | 0 | 工作方式2 | 自動重裝8位計數器 |
| 1 | 1 | 工作方式3 | T0分成兩個8位;T1停止計數 |
不能對TMOD采用位尋址方法,只能采用字節尋址(例TMOD=0xXX)設置定時器的工作方式。
2、定時器/計數器控制寄存器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)。
(三)定時器/計數器的工作方式
定時器/計數器T0和T1的工作原理相同,唯一區別在于在工作方式3時,定時器/計數器T1停止計數。前面講過通過TMOD的M1、M0工作方式選擇位可選擇工作方式。
1、工作方式0
當M1、M0為0時是工作方式0,工作方式0的計數位數為13位,由THx(x=0,1)的8位和TLx(x=0,1)的低5位(高3位未用)組成13位加1計數器,TLx(x=0,1)低5位溢出時向THx(x=0,1)進位,THx(x=0,1)計數溢出則TCON中的溢出標志位TFx(x=0,1)置1。
工作方式0的最大計數值(計數外部脈沖個數)為213=8192,即方式0的計數范圍為1?213。
2、工作方式1
當M1、M0分別為0、1時是工作方式1,工作方式1的計數位數為16位,由THx高8位和TLx低8位構成16位加1計數器,其控制方式與操作方式與方式0相同。
工作方式1的最大計數值(計數外部脈沖個數)為216=65536,即方式1的計數范圍為1?216。
3、工作方式2
當M1、M0分別為1、0時是工作方式2,它是自動重裝初值的8位計數方式,當TLx計數溢出時,除了使TCON中的溢出標志位TFx置1,還自動打開TLx與THx之間的三態門,使THx內的內容重新轉入TLx中,并繼續進行計數操作,通過這個操作可以省去用戶重新裝入計數初值的程序從而簡化定時初值的計算方法,精確地確定定時時間。
工作方式2的最大計數值(計數外部脈沖個數)為28=256,即方式2的計數范圍為1?28。
4、工作方式3
方式3只適用于定時器/計數器T0,定時器T1工作于方式3相當于TR1=0,停止計數(可用于串行口波特率產生器),當M1、M0分別為1、1時是工作方式3,工作方式3的計數位數為8位,將T0分為兩個獨立的8位計數器TL0和TH0,TL0使用T0的狀態控制位C/T、GATE、TR0、TF0,其既可以當計數使用也可以當定時使用,即T0的各控制位和引腳信號歸TL0使用,而TH0由于只能對機器周期計數,不能作為外部計數模式,所以則只能作為定時器使用。
工作方式3的最大計數值(計數外部脈沖個數)為28=256,即方式3的計數范圍為1?28。
一般情況下,當T1用作串行口的波特率發生器時,T0才工作在方式3。T0處于工作方式3時,T1可定為方式0、方式1和方式2,用來作為串行口的波特率發生器,或不需要中斷的場合。
(四)預置定時器/計數器的初值
1、預置計數器初值
根據不同工作方式下的其最大計數值,可得到最大計數值M分別是:方式0:8192;方式1:65536;方式2:256;方式3:256。
計數脈沖由外部T0或T1引入,對外部脈沖進行計數,則初值X=M-要求的計數值=[要求的計數值]求補。
2、預置定時器初值
定時器模式下,計數器由系統時鐘頻率fosc經12分頻后計數,則初值X=M-要求的定時值/(fosc/12)。
例、設單片機的晶振頻率為fosc=12MHz,在定時器模式下:
(1)一個機器周期是多少微秒?
(2)定時器處于不同工作方式時,最大定時時間是分別是多少?
(1)因為fosc=12MHz,所以一個機器周期為1μs
(2)處于方式0時,最大定時時間為8192×1μs=8192μs
處于方式1時,最大定時時間為65536×1μs=65536μs
處于方式2時,最大定時時間為
256×1μs=256μs
處于方式3時,最大定時時間為
256×1μs=256μs。
例、設單片機的晶振頻率f=12MHz,應用T0定時器的方式0,定時時間為2ms,求定時器T0的初值以及TH0、TL0的值。
X=213-2×10-3×12×106/12=8192-2000=6192=1830H=1100000110000B,
將T0的初值低5位送至TL0,則TL0=10000B=10H;
高8位送至TH0,則TH0=11000001B=0C1H。
(五)四類定時/計數方法
定時/計數方法分為四類:
1、軟件延時;
2、硬件定時;
3、硬件定時+軟件計數;
4、硬件定時+硬件計數;
(六)定時器/計數器的初始化過程
1、第一步
選擇定時器/計數器的工作方式,即通過TMOD中的工作方式選擇位M1和M0賦值實現選擇。
2、第二步
預置定時/計數初值,根據定時時間/計數次數將所計算的初值寫入TH0、TL0或TH1、TL1中。
3、第三步
開放定時器/計數器的中斷,設置中斷優先級,通過給IE寄存器中相關位賦值實現。
4、第四步
啟動定時器/計數器,通過TCON中的TR1=1或TR0=1實現。
三、Proteus仿真軟件畫原理圖
原理圖如下:
四、Keil編程軟件編寫程序
首先和之前的外部中斷實驗一樣,定義數組變量,將數組Tab定義為unsigned char code Tab[],定義一個無符號字符型(自動變量)數組Tab[],且該變量位于ROM中,根據共陽極數碼管段碼,即unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};。
然后延時函數沒必要說,這里簡單略過,依然是延時1s:
選擇定時器/計數器的工作方式,通過TMOD中的工作方式選擇位M1和M0賦值實現選擇,這里使用定時器T0,工作方式1,即TMOD=0x01=0000 0001,然后啟動定時器0,即TR0=1。
設置一個無限循環,while(1){},首先預置計數初值,因為采用定時器工作方式且晶振為12MHz,即fosc=12MHz,所以一個機器周期為12/fosc=1μs,若要計數1ms,則需計數1000次。
算出初值65536-1000,由于選擇的是定時器T0且工作方式1,列出計算TH0和TL0的式子:
這里初值/256是取其商高8位寫入TH0中,%256取其余數低8位寫入TL0中,寫入后T0從65536-1000=64536開始加1,加了1000次,就會溢出產生中斷。然后設置一個do……while循環等待定時時間完成,即do{}while(!TF0),循環體內為空,括號里的!TF0相當于為0,即直到TF0等于0時定時時間結束。
之前還要定義一個變量n來記錄顯示數字的個數,即unsigned char n=0;,另外還有一個if……else語句來判斷0-9共十個數字是否都顯示完,如下:
以下是整個程序代碼:
#include<reg51.h> unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽極數碼管段碼,定義一個無符號字符型(自動變量)數組Tab[],且該變量位于ROM中 void delay(unsigned int x)//延時函數 {unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++); } void main() {unsigned char n=0; //記錄顯示數字的個數P2=Tab[0];TMOD=0x01; //TMOD=0x01=0000 0001,即對應定時器T0,工作方式1TR0=1; //啟動定時器T0while(1) //無限循環{TH0=(65536-1000)/256; //預置計數初值,65536-1000是初始值,/256取其高8位寫入TH0中,%256取其低8位寫入TL0中//寫入后,T0從64536開始加1,加了1000次,就會溢出產生中斷TL0=(65536-1000)%256; do{}while(!TF0); //等待定時時間完成if(n>=9) //判斷0-9十個數字是否都顯示完n=0;elsen++;P2=Tab[n]; //依次取數組Tab內的元素,即取數組中數字對應的段碼delay(1000); //調用延時函數,參數為1000,即1s} }五、實驗結果
(一)仿真結果
仿真結果如下,數碼管依次顯示0-9無限循環:
……,依次到數字9:
(二)連接電路
P1.0和P3.5連接,P2.0-P2.7排線與數碼管連接,如下圖:
(三)燒錄并觀察實驗現象
燒錄可執行文件,觀察現象,數碼管依次顯示0-9無限循環:
……,依次到數字9:
結語
感謝您的閱讀和支持,若程序代碼和其它方面有不當之處,當指出!您的指出和建議能給作者帶來很大的動力!!!
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机原理及其应用——单片机外部中断实验
- 下一篇: (*长期更新)软考网络工程师学习笔记——