Condivisione della tecnologia

04: Temporizzatore

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Quando viene utilizzato il timer, si basa sul circuito oscillatore interno per contare. Quando configurato per l'uso del timer, il valore della memoria del contatore viene incrementato di 1 ad ogni ciclo macchina.

1. Come impostare il timer

1. L'oscillatore a cristallo (oscillatore a cristallo) emette impulsi e registra il numero di impulsi per la temporizzazione.
2. La frequenza dell'impulso è la frequenza dell'orologio e il reciproco di questa frequenza è il periodo di oscillazione (ciclo dell'orologio), che è anche la più piccola unità di tempo nel computer.
Inserisci qui la descrizione dell'immagine

Come mostrato nella figura: la frequenza dell'oscillatore al cristallo è 11,0592 MHz, quindi il suo ciclo di clock è 1/11,0592 MHz (secondo), ovvero un ciclo di impulsi dura tanti secondi.

3. Il ciclo macchina è il ciclo della CPU e il tempo richiesto per un'operazione di base è chiamato ciclo macchina. Generalmente un ciclo macchina è composto da più cicli di clock. Normalmente è 12 volte/6 volte.
Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

  • Quanto tempo è passato dall'aggiunta di 1?
    Quando la frequenza dell'oscillatore a cristallo è 11,0592 MHz, è pari a 11059,2 KHz = 11059200 Hz
    Cicli macchina = 12 x cicli di clock = 12 x (1/frequenza di clock) secondi = 12 / frequenza di clock secondi = 12 / 11059200 secondi = 12 000 000 / 11059200 microsecondi = 1.085 (us)
    Cioè: quando si utilizza un multiplo di 12, il contatore farà +1 ogni 1.085us

2. Come implementare il conteggio?

Configurando i relativi registri: La figura seguente mostra i relativi registri del timer.
Inserisci qui la descrizione dell'immagine

  • Come mostrato in figura, ci sono 2 registri: il primo è TCON e il secondo è TCOM, entrambi da 8 bit ciascuno.
  • Come mostrato nella figura, esistono due tipi di timer: il primo è il bit timer T0 e il secondo è il timer T1. Sono entrambi a 16 bit ciascuno.

2.1 Registro di controllo TCON

Inserisci qui la descrizione dell'immagine

TF0:定时器T0溢出中断标志,当定时器0开始计数时,计数到规定的时间时,定时器产生了溢出。TF0自动由0变位1(由硬件置1)。
如果不用中断,需要手动清零。

TR0:定时器T0的控制位,当为1时,定时器T0才能计数,相当于T0的开关(由软件控制)。
  • 1
  • 2
  • 3
  • 4

2.2. Modalità di lavoro registro TCOM

Inserisci qui la descrizione dell'immagine

GATE:门控制位,当GATE=0时:计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数)。
			   当GATE=1时:是否计数不仅取决于TR1还取决于INT1引脚
C/T :时钟输入选择为,为1时,时钟从外部引脚P3.5口输入;为0时,时钟从内部输入
M1      M0
0        0        :13位定时器,使用高8位和低5位
0        1        :16位定时器,全用
1        0        :8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1.
1        1        :定时器无效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.3.Temporizzatore T0

Inserisci qui la descrizione dell'immagine

Il timer T0 ha un totale di 16 bit, divisi negli 8 bit alti TH0 e negli 8 bit bassi TL0. Pertanto, è possibile contare un totale di 2 ^ 16 numeri (65536) e il ciclo di conteggio di 1 numero è 1,085us, quindi l'impostazione predefinita è iniziare a contare da 0 e il tempo cumulativo è di circa 71 ms.

3. Custodia: utilizzare il timer T0 per controllare l'accensione e lo spegnimento del LED a intervalli di 1 s.

Codice ①:

#include <REGX52.H>

sbit LED1 = P3^7;
void main(void)
{
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	
/*1、选择定时器T0,并配置为16位定时器*/
	TMOD =0x01;							// 0000 0001
	
/*
	2、定一个10ms的时间,数1下需要1.085us
	10ms需要数则需要数9216下,那从65536-9126=56320
	从56320这里开始数,数9216下就到了65536。当超过了
	65536时就报表了,控制寄存器TCON的TF0由0变为1	
*/
	TL0 = 0x00; //0000 0000
	TH0 = 0xDC;//1101 1100
	
/*3、打开定时器T0*/
	TR0 = 1;
	
	TF0 = 0;//先个溢出标志清零
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

【Nota】

  • Dopo ogni rapporto, al timer deve essere assegnato un nuovo valore iniziale.
  • cnt aumenta di 1 ogni 10 millisecondi Quando cnt aumenta a 100, significa che è trascorso 1 secondo.

Ottimizzazione del codice②:

#include <REGX52.H>

sbit LED1 = P3^7;

void Timer0_Init_10ms(void)//定时器初始化10ms
{
	TMOD =0x01;							
	
	TL0 = 0x00; //0000 0000
	TH0 = 0xDC;//1101 1100
	
	TR0 = 1;
	TF0 = 0;
}

void main(void)
{ 
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();
	
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
			
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Incapsula l'inizializzazione del timer T0 in una funzione e chiamala direttamente quando necessario.
Ma anche l'uso di TMOD = 0x01 presenta dei difetti:

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001)
而我们使用定时器T0时TMOD初始为0x01,则TMOD的高4位为0x0(0000),则把定时器T1变为一个13位定时器了。所以还需要改进
  • 1
  • 2

Ottimizzazione del codice ③:

#include <REGX52.H>

sbit LED1 = P3^7;

void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void main(void)
{ 
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();
	
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
			
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Troviamo che l'inizializzazione di TMOD è:

TMOD &= 0xF0;		//设置定时器模式
TMOD |= 0x01;		//设置定时器模式
  • 1
  • 2

Quali sono i vantaggi di un'inizializzazione in questo modo?

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001),而要使用定时器T0,且也为16位定时器,则TMOD =  0x11;
TMOD &= 0xF0;表示TMOD = TMOD & 0xf0,则与出来的TMOD = 0x10,由此可见,这一步就是让TMOD的高4位不变,低4位清零。
TMOD |= 0x01;表示TMOD = TMOD | 0x01,则或出来的TMOD = 0x11,由此可见,这一步就是让TMOD的高4位不变,低4位初始化。
通过这样初始化,既保证了TMOD的高4位不变(不改变定时器T1的初始化),由对低4位进行了改变(对定时器T0初始化)。
当然:也可以直让TMOD = 0x11;
  • 1
  • 2
  • 3
  • 4
  • 5