(一)中斷



(二)定時器,計數器中斷





TL0低八位先進行存盤,達到0XF,向上進一,直到高低八位都滿時就可以產生中斷或者控制TF0口,

(1).
TMOD低四位控制T0,高四位控制T1,

GATE:(門控位)



(2)控制暫存器TCON:(低四位控制外部中斷,高四位控制計數器啟動和中斷申請)

(3)定時器的四種作業方式:


定時器開啟作業原理:

四種作業方式:(機器周期(脈沖)和T0引腳來絕定電路觸發)
區別在于TH0和TL0的位數和輸出)
常用1和2
1.

2.用于比較精確的脈沖信號發射器:

3.

程式化步奏:

計算:初值==2^n-N(公式要根據你使用那種方式0.1.2.3四個方式),例如(65535-1000+1),N=1000就是1ms/1us=1000,要想溢位要達到65536,所以定時一毫秒就是初值64536=FC18H(十六進制)

(三)定時器中斷:

定時器操作代碼:
#include"reg52.h"
typedef signed char int8;
typedef signed int int16;
typedef signed long int32;
typedef unsigned char uint8; //字符型
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit led=P2^0; //D1
//***《此函式需要對應以上筆記進行熟悉識別》***//
void Time0Init ()
{ //或運算相當于TMOD=TMOD||0X01,只要有一個為一就為一
TMOD |=0X01; //定時計數選擇,作業方式選擇,門控位條件
TH0=0XFC; //定時器初值FC18H,定時一毫秒
TL0=0X18;
ET0 =1; //定時器控制中斷允許位
EA =1; //總開關
TR0 =1; //啟動定時計數器
}
//無需定時器函式,因為我們需要用定時器進行計時
//void delay(uint16 x_ms) //延時毫秒
//{
// uint16 i, j;
// for (i = x_ms; i > 0; i--)
// for (j = 114; j > 0; j--);
//}
void Time0() interrupt 0
{
static uint16 i; //1秒=1000毫秒
TH0=0XFC; //TH和TL每執行一次,耗時1毫秒
TL0=0X18;
i++;
if(i==1000) //所以i要累計到1000
{
led=~led;
}
}
void main()
{
Time0Init();
while(1);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279250.html
標籤:其他
