51微控制器定時器數碼管顯示

少年执笔發表於2024-11-17

51微控制器定時器數碼管顯示

本次的實現效果方式採用模擬進行,晶片為AT89C51,開發軟體為keil5,proteus
透過定時器實現數碼管0-99秒錶計數

@

目錄
  • 上程式碼
  • 效果展示
  • 介紹

上程式碼

程式碼如下:

#include  "reg51.h"  //包含標頭檔案reg51.h,定義了51微控制器的專用暫存器

unsigned char count=0,miao=0;      //對50ms定時時間進行計數

void timer_1() interrupt 3 //定時器T1z中斷,T1的中斷型別號為3
 {  
   TH1=(65536-50000)/256;   //重新設定T1計數初值高8位
   TL1=(65536-50000)%256;   //重新設定T1計數初值低8位
   if(count==20)              //50ms*20,1s時間到
   {
      count=0;                 //50ms計數器清0
      if(miao==100){miao=0;}else{miao++;}  //miao計數到100,則從0開始計數
   }else
   {
	count++;//如果count等於1s時為0,否則count加一
   }
}
void disp(unsigned char i)//將i的值顯示在兩個靜態連線的數碼管上
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
//定義0~9顯示碼,共陽極數碼管
P1=led[i/10];   //顯示i高位
P2=led[i%10];   //顯示i低位
 }
void main()					//主函式
{
   TMOD=0x10;         	   	//設定T1為工作方式1
   TH1=(65536-50000)/256;   //設定T1計數初值高8位,定時時間50ms
   TL1=(65536-50000)%256;   //設定T1計數初值低8位
   ET1=1;                      //開放T1中斷允許
   EA=1;                       //開放總中斷允許
   TR1=1;                      //啟動T1開始計數  
 while(1){
    disp(miao);               //顯示秒計數器值
      }
}

效果展示

keil5開發介面
在這裡插入圖片描述

proteus介面:
在這裡插入圖片描述

介紹

使用定時器的好處是無論它們工作於計數方式或計時方式,計數時都不佔用CPU時間,因此定時器、計數器的工作並不影響CPU其他工作的執行,這就是採用定時、計數器的優點。

中斷意思:

當程式在執行時,定時器同時執行,當開始中斷時,執行中斷程式,其他程式暫停執行

51核心微控制器中,T1和T0都是增量計數器,因此不能直接將要計數的值作為初值放入暫存器中,而是將計數的最大值減去實際要計數的值的差存入暫存器中。可採用如下定時器/計數器初值計算公式:計數初值=2n-計數值 式中,n為由工作方式決定的計數器位數。
例如,當 T0工作於方式1時,n=16,最大計數值為65536,若要計數10000次,需將初 值設定為65536-10000=55536。如果微控制器採用的晶振為11.0592MHz,則計數一次需要的時間為12分頻後的一個脈衝週期

中斷函式

interrupt 後面的數字用於指定該中斷函式是為哪一個中斷源編寫的。不同的數字代表不同的中斷源。例如:

  • 0:通常表示外部中斷0。這是微控制器的一個外部引腳上的中斷,當該引腳上的電平發生變化(如從高到低或從低到高)時,會觸發此中斷。
  • 1:通常表示定時器/計數器T0的中斷。當定時器/計數器T0溢位(即計數達到其最大值後)時,會觸發此中斷。
  • 2:通常表示外部中斷1。這與外部中斷0類似,但它是另一個外部引腳上的中斷。
  • 3:通常表示定時器/計數器T1的中斷。這與T0的中斷類似,但它是另一個定時器/計數器的中斷。
  • 4:在某些微控制器中,可能表示串列埠中斷。當串列埠接收到資料或傳送資料時,會觸發此中斷。

在寫定時器程式時,以下時對程式碼解釋

EA=1;//開啟總開關

ET0=1;//開啟T0開關

TMOD=0x01; //將TMOD暫存器的低4位設定為0x01,表示定時器T0工作在方式1(16位定時器/計數器模式)

TH0=(65536-50000)/256; //設定定時器初值,定時時間50ms,12MHZ/12,50*1000,高八位

TL0=(65536-50000)%256;//低八位

定時器溢位時應進行重新賦值

定時器中斷是由定時器計數器溢位而引發的中斷。在51微控制器中,定時器是一個內部計數器,它在時鐘訊號的作用下進行計數。每當一個時鐘週期到來時,計數器就會加1。當計數器的值達到預設的最大值(即溢位值)時,會產生一個溢位訊號,該訊號會觸發中斷系統,使CPU跳轉到中斷服務程式去執行。中斷服務程式執行完畢後,CPU會返回到原來被中斷的地方,繼續執行原來的程式。

二、51微控制器定時器的配置
選擇定時器:51微控制器通常包含兩個可程式設計的定時器/計數器T0和T1。這兩個定時器都可以配置為定時器模式或計數器模式。
設定工作模式:定時器有多種工作模式可選,如13位定時器/計數器、16位定時器/計數器、8位自動重灌模式等。透過配置TMOD暫存器來選擇合適的工作模式。
計算並設定初值:定時器的初值決定了定時器從哪個數開始計數,從而決定了定時時間的長短。初值的計算需要根據定時器的位數、時脈頻率和所需的定時時間來確定。一旦設定了初值,定時器就會在時鐘訊號的作用下從初值開始計數。
啟動定時器:透過設定TR0或TR1暫存器來啟動定時器。當TR0或TR1為1時,定時器開始計數;當TR0或TR1為0時,定時器停止計數。
三、定時器中斷的實現
開啟中斷:要使定時器中斷能夠發生,首先需要開啟全域性中斷和定時器中斷。這透過設定EA(全域性中斷允許位)和ET0/ET1(定時器0/1中斷允許位)來實現。
編寫中斷服務程式:中斷服務程式是當定時器溢位時CPU要執行的程式碼。在51微控制器中,通常使用特定的中斷向量號來標識不同的中斷源,並透過編寫對應的中斷服務函式來處理中斷。中斷服務程式通常包括儲存現場、處理中斷事件、恢復現場和返回指令等部分。
處理中斷事件:在中斷服務程式中,需要根據實際需求處理中斷事件。例如,可以更新計數器、控制外設或執行其他任務。

相關文章