1、定時器和計(jì)數(shù)器
時鐘周期:單片機(jī)時序中的最小單位,集體計(jì)算的放法就是時鐘源分之一
機(jī)器周期:單片機(jī)完成一個操作的最短時間,=12個時鐘周期
定時器:打開定時器后,定時器“存儲寄存器”的值經(jīng)過一個機(jī)器周期自動加1,也就是說,機(jī)器周期是定時器的計(jì)數(shù)周期。
2、定時器的寄存器
TMOD —— 工作模式選擇寄存器——常用模式1和模式2.
TCON —— 控制寄存器(TRn定時器開關(guān))
TH/TL —— 定時計(jì)數(shù)器
3、定時器應(yīng)用
第一步:設(shè)置特殊功能寄存器TMOD,配置好工作模式。
第二步:設(shè)置計(jì)數(shù)寄存器TH0和TL0的初值。
第三步:設(shè)置TCON,通過TR0置1來讓定時器開始計(jì)數(shù)。
第四步:判斷TCON寄存器的TF0位,監(jiān)測定時器溢出情況。
寫程序之前,我們要先來學(xué)會計(jì)算如何用定時器定時時間。我們的晶振是 11.0592M,時鐘周期就是 1/11059200,機(jī)器周期是12/11059200,時器定時值最大也就是 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;//定義一個計(jì)數(shù)變量,記錄T0溢出次數(shù)
TMOD=0x01;//設(shè)置T0為模式1
TH0=0xFC;//為T0賦初值0xB800
TL0=0x67;
TR0=1;//啟動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ù)碼管
共陰與共陽數(shù)碼管 ——8個LED燈
位選——控制選擇多個數(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)過的秒數(shù)
TMOD=0x01;//設(shè)置T0為模式1
TH0=0xFC;//為T0賦初值0xB800
TL0=0670;
TR0=1;//啟動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ù)對應(yīng)的真值表中的值送到P0口
sec++;//秒數(shù)記錄自加1
if(sec>=16)//當(dāng)秒數(shù)超過0x0F(15)后,重新從0開始
{
sec=0;
}
}
}
}
return0;
}