前言
前幾天一直在忙挑戰杯的決賽,好幾天沒能睡上安穩覺,今天下午答辯結束,終于有空能夠繼續總結筆記寫博客了,(在此先感謝下帶隊的張總與帶隊老師),
正文
定時器介紹:51單片機的定時器屬于單片機的內部資源,其電路的連接和運轉均在單片機內部完成,可以取代掉占用cpu資源的delay函式,

如上圖示,我的51單片機外接了一個11.0592MHZ的外部晶振,我們算一下:
按照時鐘周期的計算公式
1個時鐘周期 =1/晶振周期 = 1/Fosc
本機時鐘周期=1/(11.05926M) (s)= 1/11.05926/1000000 (s) = 1/1105926 s
所以我的單片機每隔12*(1/1105926)s就加1一次,所以從0到65535所需時間一共
12*(1/1105926)*65535=0.07110964s=71.10964ms
如果需要定義1個10ms,則設初值為x
(65535-x)*機器周期=0.01s
則x=56319,
分類
51單片機定時器0內部的具有兩個一位元組的暫存器TH0(高位暫存器)和TL0(低位暫存器),最大能存65535,
當單片機每一個機器周期產生一個脈沖時,計數器就加一,當計數達到溢位值65535后,就會產生一個中斷信號,系統捕捉到信號,這個時間段就是周期,
定時器由兩個暫存器控制,分別是作業模式暫存器TMOD和控制暫存器TCON,
作業模式暫存器TMOD
作業模式暫存器TMOD是用于控制定時器0/1的作業模式(模式1:TH0和TL0兩個暫存器都使用),而設定初始值只需要對TMOD的M0、M1進行設定就行了,其他均設0即可,定時器1的不用配置,定時器0配置如下
GATE=0
C/T=0:0代表用作定時器,1代表用作計數器
TMOD=0x01

| M1M0 | 作業模式 | 說明 |
|---|---|---|
| 00 | 模式1 | 當TMOD的D5位置0,D4位置1時,即為定時器T1的模式一,該模式對應的是一個16位的定時器,暫存器TH1和TL1即為T1初值的高8位和低8位,定時時間為:(65536-T1的初值)振蕩周期12 |
| 01 | 模式2 | 當TMOD的D5位置1,D4位置0時,即為定時器T1的模式二,該模式對應的是一個可以自動裝載的8位定時器,當定時器計數滿了(計數溢位時),會自動把TH1中的內容重新裝載到TL1中,那么模式二計數的最長時間即為(257-T1的初值)振蕩周期12 |
TH0和TL0
由于TH0是高八位,TL0是低八位(2^8=256),所以計算得出
TH0=56319/256;
TL0=56319%256;
利用isp計算定時器

需要注意的是:本版本單片機并沒有AUXR這個暫存器,所以需要刪去這行,而且要加上ET0與EA的賦值,整體代碼如下:
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //設定定時器模式
TMOD |= 0x01; //設定定時器模式
TL0 = 0x18; //設定定時初值
TH0 = 0xFC; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
}
控制暫存器TCON
TF0 = 0; //清除TF0溢位中斷標志,加到65536后TF0會被置為1
TR0 = 1; //允許定時器0計時
示例代碼(定時器點燈)
#include "reg52.h" //此檔案中定義了單片機的一些特殊功能暫存器
typedef unsigned int u16; //對資料型別進行宣告定義
typedef unsigned char u8;
sbit led=P2^0; //定義P20口是led
/*******************************************************************************
* 函 數 名 : Timer0Init
* 函式功能 : 定時器0初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //設定定時器模式
TMOD |= 0x01; //設定定時器模式
TL0 = 0x18; //設定定時初值
TH0 = 0xFC; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
}
/*******************************************************************************
* 函 數 名 : main
* 函式功能 : 主函式
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1);
}
/*******************************************************************************
* 函 數 名 : void Timer0() interrupt 1
* 函式功能 : 定時器0中斷函式
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289393.html
標籤:其他
