基於51微控制器定時,數碼管顯示時間

2020-10-28 15:01:00

基於51微控制器定時,數碼管顯示時間

要想讓數碼管顯示時間,就得讓數碼管顯示,然後需要讓顯示的數位按秒、分、時進位。數碼管顯示可以看我前面文章:
基於51微控制器數碼管顯示

微控制器的定時器中斷
51微控制器內部有兩個16位元可以程式設計的定時器T0/計數器T1,52微控制器內多了一個T2定時器/計數器;

定時器/計數器的實質是加1計數器(16位元),由高8位元和低8位元2個暫存器組成。TMOD 是定時器/計數器的工作方式暫存器,確定工作方式和功能: TCON 是控制暫存器,控制TO、TI的啟動和停止及設定溢位標誌。
加1計數器輸入的計數脈衝有兩個來源,一個是由系統的時鐘振盪器輸出脈衝經12分 頻後送來;另一個是T0或T1引腳輸入的外部脈衝源,每來一個脈衝計數器加 1,當加到計數器為全I時,再輸入一個脈衝就使計數器回零,且計數器的溢位使TCON暫存器中TFO或TF1置1,向CPU發出中斷請求(定時器/計數器中斷允許時)。如果定時器/計數器工作於定時模式,則表示定時時間已到:如果工作於計數模式,則表示計數值已滿。
由上可知,由溢位的計數器的值減去計數初值才是計數器的計數值。
設定為定時器模式時,加1計數器是對內部機器週期計數(1個機器週期等於12個振盪週期,即計數頻率為晶振頻率的1/12)。計數值N乘以機器週期Tey就是定時時間t。
定時器初值計算

定時時間T=(2的N次方-X)12/微控制器晶振頻率(方式0時,N=13 方式1時,N=16 方式2時,N=8)

打個比方計時2ms,當晶振為12M。
方法一
定時時間2ms=(2的16次方-時間常數X)12/f 即晶振為12M f=121000000
2ms=(2的16次方-時間常數X)12/(12
1000000)
方法二
12MHz除12為1MHz,也就是說一秒=1000000次機器週期。2ms=50000次 機器週期。

時間常數X=2000
TH0=(65536-2000)/256; 就是轉換成十六進位制 再除以256 取整數 即高8位元送時間常數暫存器的高8位元計數器
TL0=(65536-2000)%256; 就是轉換成十六進位制 再除以256 取餘數 即低8位元送時間常數暫存器的低8位元計數器

微控制器在使用定時器或計數器功能時,通常需要設定2個與定時器有關的暫存器:定時器/計數器工作方式暫存器TMOD與定時器/計數器控制暫存器TCON。
定時器/計數器工作方式暫存器TMOD
TMOD各位定義如下表:

位序號D7D6D5D4D3D2D1D0
位符號GATEC/TM1M0GATEC/TM1M0

D7–D4是定時器1 D3–D0是定時器0
TMOD的高4位元用於設定定時器1,低4位元用於設定定時器0,對應4位元含義如下:
GATE一門控制位。GATE=0,定時器/計數器啟動與停止僅受TCON暫存器中的TRX(X=0, 1)來控制; GATE=1,定時器/計數器啟動與停止由TCON暫存器中的TRX (X=0, 1)和外部中斷引腳(INTO或INT1)上的電平狀態來共同控制.
C/T一定時器模式和計數器模式選擇位。C/T=1, 為計數器模式: C/T=0 為定時器模式。M1 M0是工作方式選擇位。每個定時器計數器都有4種工作方式,它們由MIMO設定,如下表所示

M1M0工作方式
00方式0 是13位定時器/計數器
01方式1 是16位元定時器/計數器
10方式2 是8位元初值自動重灌的8位元定時器/計數器
11方式3 是僅僅適用與T0分為兩個8位元計數器,T1停止計數

定時器/計數器控制暫存器TCON

定時器/計數器控制暫存器TCON在特殊功能暫存器中,位元組地址為88H, 位地址(由低位到高位)分別是88H~8FH,可進行位定址。TCON暫存器用來控制定時器的啟、停,以及標誌定時器溢位和中斷情況。微控制器復位時,TCON 全部被清0.
其各位定義如下表所示.其中TFI、 TRI、TFO和TRO位用於定時器/計數器; 1IEI、 ITI、 IEO和ITO位用於外部中斷。

位序號D7D6D5D4D3D2D1D0
位符號TF1TR1TF0TR0IE1IT1IE0IT0
位地址8FH8EH8DH8CH8BH8AH89H88H

TF1 定時器1溢位標誌位。當定時器1計滿溢位時,由硬體使TF1置1,並且申請中斷。進入中斷服務程式後,由硬體自動清0.注意,如果使用定時器的中斷,那麼該位完全不用人為去操作;如果使用軟體查詢方式的話,當查詢到該位置1後,就需要用軟體清0.
TR1 定時器1執行控制位。由軟體清0關閉定時器1.當GATE=I且INT1為高電平時, TR1置1,啟動定時器1;當GATE=0時, TRI置1, 啟動定時器1.
TF0 定時器0溢位標誌,其功能及操作方法同TF1.
TR0 定時器0執行控制位,其功能及操作方法同TR1.
IE1 外部中斷1請求標誌.

要讓數碼管顯示時間要使用暫存器TMOD定時器0,工作方式1;
程式碼如下

void T0_init(){                    
 TMOD = 0x01; //設定定時器0為工作方式1(M1 M0為01)
 TH0 = (65536-50000)/256;//裝初值12Mhz晶振定時50ms  
 TL0 = (65536-50000)%256;  
 EA = 1;//開總開關     
 ET0 = 1;//開定時器0中斷     
 TR0 = 1;//啟動定時器0    
}
void timer0_int() interrupt 1{
 TH0 = (65536-50000)/256; //重灌初值
 TL0 = (65536-50000)%256;
 i++;//每加一次就判斷一次看是否到達1s
   if(i == 20){
   i = 0;  
   miao++//每加一次就判斷一次看是否到達1分
     if(miao == 60){
     miao = 0;
     fen++;//每加一次就判斷一次看是否到達1小時
       if(fen == 60){
        fen = 0;  
        shi++;
    	  if(shi == 24){
     	  shi = 0;  
     	  fen = 0;
     	  miao = 0;
     }
   }
 }
 miao_g = miao%10;//求餘得到秒的個位   
 miao_s = miao/10;//取十得到十位 這就是送到數碼管元素的下標與陣列相對應 下同
 fen_g = fen%10;  
 fen_s = fen/10;
 shi_g = shi%10;  
 shi_s = shi/10;
  }
}

數碼管顯示函數如多段數碼管動態顯示相似可以看上文
程式碼與原理圖已經上傳資源,感興趣可以看看,也請各位大佬糾正;