51單片機(jī)——定時(shí)器
1、定時(shí)器和計(jì)數(shù)器
時(shí)鐘周期:?jiǎn)纹瑱C(jī)時(shí)序中的最小單位,集體計(jì)算的放法就是時(shí)鐘源分之一
機(jī)器周期:?jiǎn)纹瑱C(jī)完成一個(gè)操作的最短時(shí)間,=12個(gè)時(shí)鐘周期
定時(shí)器:打開(kāi)定時(shí)器后,定時(shí)器“存儲(chǔ)寄存器”的值經(jīng)過(guò)一個(gè)機(jī)器周期自動(dòng)加1,也就是說(shuō),機(jī)器周期是定時(shí)器的計(jì)數(shù)周期。
2、定時(shí)器的寄存器
TMOD —— 工作模式選擇寄存器——常用模式1和模式2.
TCON —— 控制寄存器(TRn定時(shí)器開(kāi)關(guān))
TH/TL —— 定時(shí)計(jì)數(shù)器
3、定時(shí)器應(yīng)用
第一步:設(shè)置特殊功能寄存器TMOD,配置好工作模式。
第二步:設(shè)置計(jì)數(shù)寄存器TH0和TL0的初值。
第三步:設(shè)置TCON,通過(guò)TR0置1來(lái)讓定時(shí)器開(kāi)始計(jì)數(shù)。
第四步:判斷TCON寄存器的TF0位,監(jiān)測(cè)定時(shí)器溢出情況。
寫(xiě)程序之前,我們要先來(lái)學(xué)會(huì)計(jì)算如何用定時(shí)器定時(shí)時(shí)間。我們的晶振是 11.0592M,時(shí)鐘周期就是 1/11059200,機(jī)器周期是12/11059200,時(shí)器定時(shí)值最大也就是 71ms 左右。
(65536-N)*12/11.0592M = time ---計(jì)算出N轉(zhuǎn)換成十六進(jìn)制
1ms的例子:
TMOD = 0X01;
TH0 = 0XFC;
TL0 = 0X67;
TR0 = 1;
#include
typedefunsignedcharuchar;
sbitLED=P0^0;
intmain(void)
{
ucharcnt=0;//定義一個(gè)計(jì)數(shù)變量,記錄T0溢出次數(shù)
TMOD=0x01;//設(shè)置T0為模式1
TH0=0xFC;//為T(mén)0賦初值0xB800
TL0=0x67;
TR0=1;//啟動(dòng)T0
while(1)
{
if(1==TF0)//判斷T0是否溢出
{
TF0=0;//T0溢出后,清零中斷標(biāo)志
TH0=0xFC;//并重新賦初值
TL0=0x67;
cnt++;//計(jì)數(shù)值自加1
if(cnt>=1000)//判斷T0溢出是否達(dá)到50次
{
cnt=0;//達(dá)到50次后計(jì)數(shù)值清零
LED=~LED;//LED取反:0-->1、1-->0
}
}
}
return0;
}
4、數(shù)碼管
共陰與共陽(yáng)數(shù)碼管 ——8個(gè)LED燈
位選——控制選擇多個(gè)數(shù)碼管中的哪一個(gè)
段選——選擇數(shù)碼管顯示的值
//秒定時(shí)器:
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
ucharcodecount[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
intmain(void)
{
ucharcnt=0;//記錄T0中斷次數(shù)
ucharsec=0;//記錄經(jīng)過(guò)的秒數(shù)
TMOD=0x01;//設(shè)置T0為模式1
TH0=0xFC;//為T(mén)0賦初值0xB800
TL0=0670;
TR0=1;//啟動(dòng)T0
while(1)
{
if(TF0==1)//判斷T0是否溢出
{
TF0=0;//T0溢出后,清零中斷標(biāo)志
TH0=0xFC;//并重新賦初值
TL0=0x67;
cnt++;//計(jì)數(shù)值自加1
if(cnt>=1000)//判斷T0溢出是否達(dá)到1000次
{
cnt=0;//達(dá)到1000次后計(jì)數(shù)值清零
P0=count[sec];//當(dāng)前秒數(shù)對(duì)應(yīng)的真值表中的值送到P0口
sec++;//秒數(shù)記錄自加1
if(sec>=16)//當(dāng)秒數(shù)超過(guò)0x0F(15)后,重新從0開(kāi)始
{
sec=0;
}
}
}
}
return0;
}