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微控制器中,通常使用特定的中斷向量號來標識不同的中斷源,並透過編寫對應的中斷服務函式來處理中斷。中斷服務程式通常包括儲存現場、處理中斷事件、恢復現場和返回指令等部分。
處理中斷事件:在中斷服務程式中,需要根據實際需求處理中斷事件。例如,可以更新計數器、控制外設或執行其他任務。