2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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.
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:
Asettamalla M1 ja M0 rekisterissä TMOD, ajastimella/laskimella 0 ja 1 on neljä erilaista toimintatilaa.
Toimintatilakaavio on seuraava:
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.
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)
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.
Huomautus: STC-ISP-ohjelmointityökalun mukana tulee laskettavan ajan alkuarvo. Voit kopioida koodin valitsemasi tilan mukaan.
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)
{
}
}
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.
#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;
}
}
}
}
}
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);
}
}