Teknologian jakaminen

Puzhong 51 -mikrokontrolleri: ajastimien ja laskurien yksityiskohtainen selitys ja sovellus (7)

2024-07-12

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

Lisää kuvan kuvaus tähän

esittely

Ajastimet ja laskurit ovat laitteistomoduuleja, joita käytetään mittaamaan aikavälejä tai laskemaan tapahtumia. Niitä voidaan käyttää monissa sovelluksissa, kuten tarkkojen aikaviiveiden luomiseen, taajuuksien mittaamiseen, ulkoisten tapahtumien laskemiseen jne. 51-mikrokontrollerin ajastin kuuluu mikro-ohjaimen sisäisiin resursseihin ja sen piirin kytkeminen ja toiminta on suoritettu mikro-ohjaimen sisällä. Tässä artikkelissa esitellään yksityiskohtaisesti toimintaperiaate, konfigurointimenetelmä ja ajastimien ja laskurien käyttö 51-mikrokontrollerissa.

Tässä luvussa käsitellään keskeytykseen liittyvää tietoa.Keskeytä järjestelmän selitys

Huomautus: Ajastinresurssit liittyvät mikro-ohjaimen malliin. Eri mikro-ohjainmalleissa voi olla eri määrä ajastimia ja toimintatapoja, mutta yleisesti ottaen T0:n ja T1:n toimintatavat ovat yhteisiä kaikille 51:lle mikro-ohjaimelle.

Kuinka ajastin toimii

Ajastin on kuin pieni herätyskello mikrokontrollerin sisällä Kellon lähtösignaalin mukaan laskentayksikön arvo kasvaa yhdellä joka "sekunti". Kun laskentayksikön arvo nousee "asetettuun hälytysmuistutusaikaan", laskentayksikkö lähettää keskeytyspyynnön keskeytysjärjestelmälle, muodostaa "soittomuistutuksen" ja saa ohjelman hyppäämään keskeytyspalvelutoimintoon suorittamista varten. .

Ajastimen/laskurin toimintaperiaate perustuu kellopulsseihin. Ajastintilassa ne käyttävät sisäistä kellolähdettä laskemiseen, laskuritilassa ulkoista pulssilähdettä. Jokaisella ajastimella/laskimella on rekisteri, joka tallentaa nykyisen laskenta-arvon.

TMOD-ajastin/laskuri toimintatilarekisteri

Ajoitus- ja laskentatoimintoja ohjataan erikoistoimintorekisterin TMOD ohjausbiteillä. CT Csqrt{T}CT Valinnan tekemiseksi TMOD-rekisterin tiedot on lueteltu seuraavassa taulukossa. Voidaan nähdä, että kahdella ajastimella/laskimella on neljä toimintatilaa, jotka valitaan TMOD:n M1:n ja M0:n kautta. Kahden ajastimen/laskurin tilat 0, 1 ja 2 ovat samat, mutta tila 3 on erilainen. Jokaisen tilan toiminnot ovat seuraavat:
Lisää kuvan kuvaus tähän

Ajastin työtila

Asettamalla M1 ja M0 rekisterissä TMOD, ajastimella/laskimella 0 ja 1 on neljä erilaista toimintatilaa.

Tila 0 (13-bittinen ajastin/laskuri)

Lisää kuvan kuvaus tähän
Toimintatilakaavio on seuraava:
Lisää kuvan kuvaus tähän

Tila 1 (16-bittinen ajastin/laskuri)

Tila 1 on täsmälleen sama kuin tila 0 paitsi, että TH0:n ja TL0:n kaikki 16 bittiä ovat käytössä. Tässä tilassa TL0:n 8-bittinen ylivuoto kulkee TH0:aan ja TH0:n ylivuoto asettaa ylivuotolipun TF0 TCON:ssa.

Kun GATE=0(TMOD.3), jos TR0=1, ajastin laskee. Kun GATE=1, ulkoinen tulo INTO saa ohjata ajastinta 0, jotta pulssinleveyden mittaus voidaan saavuttaa. TRO on TCON-rekisterin ohjausbitti. Katso TCON-rekisterin kunkin bitin toimintokuvaus edellisestä kappaleesta.

Huomautus: STC89C51RC/RD+-sarjan mikro-ohjaimessa on kaksi laskentanopeutta: yksi on 12T-tila, joka lisää 1 joka 12 kelloa, sama kuin perinteinen 8051-mikro-ohjain, toinen on 6T-tila, joka lisää 1 joka 6. nopeus T0-nopeus, joka on kaksinkertainen perinteiseen 8051-mikrokontrolleriin verrattuna, asetetaan STC-ISP-ohjelmoijassa käyttäjäohjelmaa poltettaessa.

Tila 2 (8-bittinen automaattinen uudelleenlataustila)

Tässä tilassa ajastin/laskuri voi ladata automaattisesti uudelleen 8-bittisen laskurin. TL0:n ylivuoto ei ainoastaan ​​aseta TF0:aa, vaan myös lataa TH0:n sisällön uudelleen TL0:aan. (TH0 voidaan asettaa ensin, ja TH0:n sisältö pysyy muuttumattomana uudelleenasennuksen aikana)
Lisää kuvan kuvaus tähän

Tila 3 (kaksi 8-bittistä laskuria)

Ajastimelle 0 tässä tilassa ajastin 1 lopettaa laskemisen, ja vaikutus on sama kuin asettamalla TR1 arvoon 0.


Ajastimelle 0 tässä tilassa ajastimen 0 TL0 ja TH0 toimivat kahtena itsenäisenä 8-bittisenä laskurina. Alla oleva kuva näyttää logiikkakaavion ajastimesta 0 tilassa 3. TL0 käyttää ajastimen 0 ohjausbittiä: CT Csqrt{T}CT , GATE, TRO, INTO ja TFO. THO on rajoitettu ajastintoimintoon (laskurijakso) ja se on ajastimen 1 TR1 ja TF1. Tällä hetkellä TH0 ohjaa ajastimen 1 keskeytystä.

Tila 3 on lisätty 8-bittisen ylimääräisen ajastimen/laskurin lisäämiseksi, mikä antaa mikro-ohjaimelle kolme ajastinta/laskuria. Tila 3 koskee vain ajastinta/laskuria 0. Kun ajastin T1 on tilassa 3, se vastaa TR1-0:aa ja lopettaa laskemisen, ja T0:ta voidaan käyttää kahtena ajastimena.
Lisää kuvan kuvaus tähän

Ajastimen määritysprosessi

  1. Määritä arvot TMOD:lle määrittääksesi, kuinka T0 ja T1 toimivat.
  2. Laske aloitusarvo ajastettavan ajan mukaan ja kirjoita se kohtaan TH0, TL0 tai TH1, TL1.
  3. Jos keskeytyksiä käytetään, anna arvo EA:lle ja avaa ajastimen kokonaiskeskeytys.
  4. Aseta TR0 tai TR1 käynnistääksesi ajastimen/laskurin ajoituksen tai laskennan.

Huomautus: STC-ISP-ohjelmointityökalun mukana tulee laskettavan ajan alkuarvo. Voit kopioida koodin valitsemasi tilan mukaan.
Lisää kuvan kuvaus tähän

Koodiesittely - LED1 vilkkuu 1 sekunnin välein

LED1-merkkivaloa ohjataan vilkkumaan 1 sekunnin välein ajastimen 0-keskeytyksen kautta. Fyysinen kaavio on kytketty P2_0-napaan. 12.000MHz:n kelloa käytetään joka kerta keskeytysliipaisutoimintoa käytetään laskentaan. Kun se on 1000, se on yksi sekunti.

#include <REGX52.H>

sbit LED1 = P2^0;

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		LED1 = !LED1;
	}
	count++;
}


void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}


void main()
{
	Timer0_Init();
	while(1)
	{
		
	}	
}
  • 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

Koodiesittely - painike 1 ohjaa LED-ajovalon tilaa

Tässä esittelyssä käytetään INTRINS.H-kirjaston _crol_left shift- ja _cror_right shift -toimintoja Kun KEY1-painiketta painetaan, LED-ajovalo vaihtaa suuntatilaa ja vilkkuu. Fyysinen kuvaliitäntä: K1 on kytketty P0_0-nastaan ​​ja kahdeksan LED-valoa asetetaan P2-nastan sisään.

  • cror(signed char val, unsigned char n): Kierrä merkkejä oikealle ja kierrä val oikealle n bittiä.
  • crol(signed char val, unsigned char n): Kierrä merkkejä vasemmalle, kierrä val vasemmalle n bittiä
#include <REGX52.H>
#include <INTRINS.H>

sbit KEY1 = P0^0;
sbit KEY2 = P0^1;
unsigned char LEDMode;

void DelayXms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		if(LEDMode == 0)
			P2 = _crol_(P2,1);
		if(LEDMode == 1)
			P2 = _cror_(P2,1);

	}
	count++;
}

unsigned char Getkey()
{
	unsigned char keyNumber = 0;
	if(KEY1 == 0)
	{
		DelayXms(5);
		while(KEY1 == 0);
		DelayXms(5);
		keyNumber = 1;
	}
	if(KEY2 == 0)
	{
		DelayXms(5);
		while(KEY2 == 0);
		DelayXms(5);
		keyNumber = 2;
	}
	return keyNumber;
}


void main()
{
	unsigned char keyNum = 0;
	P2 = 0xfe;
	Timer0_Init();
	while(1)
	{
		keyNum = Getkey();
		if(keyNum)
		{
			if(keyNum == 1)
			{
				LEDMode++;
				if(LEDMode>=2)
				{
					LEDMode = 0;	
				}
			}
		}
	}
}
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

Koodiesittely - LCD1602 ajastinkellon näyttö

Tämä esittelykoodi käyttää LCD1602-moduulia näyttönä LCD1602-moduulia ei selitetä yksityiskohtaisesti, ja erityiset ohjeet annetaan myöhemmin. Jos tarvitset LCD1602-kirjastoa, voit laittaa minulle yksityisviestiä. Fyysinen kuvaliitäntä: Liitä vain LCD1602-moduuli piirilevyyn.

#include <REGX52.H>
#include "LCD1602.h"

unsigned char Sec=55,Min=59,Hour;//秒分时

void DelayXms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		Sec++;
		if(Sec == 60)
		{
			Sec = 0;
			Min++;
			if(Min == 60)
			{
				Min = 0;
				Hour++;
				if(Hour == 24)
				{
					Hour = 0;
				}
			}

		}
	}
	count++;
}

void main()
{
	Timer0_Init();
	LCD_Init();
	LCD_ShowString(1,1,"Time:");
	LCD_ShowString(2,1,"00:00:00");
	while(1)
	{
		LCD_ShowNum(2,1,Hour,2);
		LCD_ShowNum(2,4,Min,2);
		LCD_ShowNum(2,7,Sec,2);
	}	
}
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75