定時(shí)器計(jì)數(shù)器的應(yīng)用提高
定時(shí)器0的應(yīng)用提高
方式0的使用:
示例代碼:使用方式0使得led燈一秒鐘閃爍
//這個(gè)程序比較簡(jiǎn)單,需要明白的是定時(shí)器0方式0是一個(gè)1
//13位的計(jì)數(shù)器,所以最大的數(shù)為2的13次方,8192,并且TL0中的高三位沒(méi)有用
//因此除以的也不是256,而是32,定時(shí)器0方式00需要注意的是,最大數(shù)字因?yàn)槭?192
//因此定時(shí)5000為定時(shí)5ms,定時(shí)一秒要進(jìn)入中斷200次
#include
#define uint unsigned int
#define uchar unsigned char
uchar num;
sbit led = P1^0;
void main()
{
TMOD = 0x0;
TH0 = (8192-5000)/32;
TL0 =(8192-5000)%32;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}
void t0()interrupt 1
{
TH0= (8192-5000)/32;
TL0= (8192-5000)%32;
num++;
if(num==200)
{
num=0;
led = ~led;
}
}
方式2的使用:(8位自動(dòng)重裝的8位定時(shí)器)
使用方式2的優(yōu)點(diǎn):方式2適合用來(lái)做特別精確的脈沖信號(hào)發(fā)生器,因?yàn)槠渲兄挥幸粋€(gè)8位計(jì)數(shù)器,THX高八位常數(shù)緩沖器,當(dāng)TLX八位溢出的適合,THX將自動(dòng)的填充到TLX中,從而避免了反復(fù)重裝初值帶來(lái)的精度誤差,由于使用方式2要求高精度,所以晶振也必須是12M的晶振,這樣才能精確的計(jì)時(shí);
示例代碼:使用方式2使得led燈一秒鐘閃爍
//因?yàn)槎〞r(shí)器0方式2是一個(gè)8位自動(dòng)重裝的定時(shí)器,所以初值一般是6
//這是因?yàn)檠b入6的話,THX=250,TLX=250,這樣一次定時(shí)的時(shí)間是2.5毫秒
//由于是自動(dòng)重裝,所以,定時(shí)器0方式-不用重裝初值
//這里的num是uint的類(lèi)型,這里要注意
#include
#define uint unsigned int
#define uchar unsigned char
uint num;
sbit led = P1^0;
void main()
{
TMOD = 0x02;
TH0 = 6;
TL0 =6;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
if(num==4000)
{
num=0;
led = ~led;
}
}
}
void t0()interrupt 1
{
num++;
}
方式3的使用:
方式3只適用于定時(shí)器T0,當(dāng)T1設(shè)置位方式3時(shí),定時(shí)器T1不計(jì)數(shù),方式3將T0分成兩個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0,這里注意的是,由于定時(shí)器方式3相當(dāng)于是兩個(gè)計(jì)數(shù)器,所以,這時(shí)候TH0這個(gè)計(jì)數(shù)器將占用T1的中斷請(qǐng)求位,所以方式3使用的時(shí)候,T1不要使用中斷,在這種情況下,T1通常是用來(lái)當(dāng)作是串行口的波特率發(fā)生器
示例代碼:使用方式3中的低8位使得led燈一秒鐘閃爍,高八位使得led燈0.5秒閃爍
/*方式3只適用于定時(shí)器T0,當(dāng)T1設(shè)置位方式3時(shí),
定時(shí)器T1不計(jì)數(shù),方式3將T0分成兩個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0o注意的是,?
哨定時(shí)器方式3相當(dāng)于是兩個(gè)計(jì)數(shù)器,所以,這時(shí)候TH0這個(gè)計(jì)數(shù)器將占用T1的中斷請(qǐng)求位,所
苑絞?使用的時(shí)候,T1不要使用中斷,在這種情況下,T1通常是用來(lái)當(dāng)作是串行口的波特率發(fā)生器*/
#include
#define uint unsigned int
#define uchar unsigned char
uint num1,num2;
sbit led1 = P1^0;
sbit led2 = P1^1;
void main()
{
TMOD = 0x03;
TH0 = 6;
TL0 =6;
EA = 1;
ET0 = 1;
ET1 =1;
TR0 = 1;
TR1 = 1;
while(1)
{
if(num1>=4000)
{
num1=0;
led1 = ~led1;
}
if(num2 >= 2000)
{
num2=0;
led2 = ~led2;
}
}
}
void TL0_timer()interrupt 1
{
TL0 = 6;
num1++;
}
void TH0_timer() interrupt 3
{
TH0 = 6;
num2++;
}
綜合程序:
//利用計(jì)數(shù)器0工作方式1,用一根導(dǎo)線,連接GND引腳,用另外的一根導(dǎo)線
//去接觸T0(P3^4),沒(méi)接觸一下,計(jì)數(shù)器技術(shù)一次,然后將說(shuō)記錄的數(shù)值顯示在
//數(shù)碼管的前兩位,然后計(jì)數(shù)滿100清零
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[] ={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void display(uchar shi,uchar ge)
{
dula =1;
P0 = table[shi];
dula =0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delayms(5);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i = xms;i>0;i--)
for(j=110;j>0;j--);
}
uint read()
{
uchar t1,th1,th2;
uint val;
while(1)
{
th1 = TH0 ;
t1 = TL0;
th2 = TH0 ;
if(th1 == th2)
break;
}
val = th1*256+t1;
return val;
}
void main()
{
uchar a,b;
uint num;
TMOD = 0x05;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(1)
{
num = read();
if(num>100)
{
num = 0;
TH0 = 0;
TL0 = 0;
}
a = num/10;
b = num%10;
display(a,b);
}
}