一,什么是定时/计数器以及用处
1.就像名字一样,既有定时的功能又有计数的功能
2.
二,如何使用单片机的定时/计数器
1.会计算定时的时间
2.启动定时计数器(通过TCON控制器(可位寻址))
在这里只需要看计数器/定时器部分。若启动定时器T1就将TR1置1就开始计数,
若启动定时器T0就将TR0置1就开始计数.
3.设置定时/计数器工作模式(通过TMOD控制器(不可位寻址))
通过选择GATE选择是定时器1还是二,选择C/T选择是定时器还是计数器功能,在选择M1和M2选择功能(注意是不可位寻址)
4查询定时/计数器是否溢出(通过读TCON中的TF位)
硬件会将TR0/TR1自动置0和置1,不用管。
三,定时/计数器相关的知识补充
TH0,TH1,TL0,TL1是单片机的八位定时器(H是high表示高八位,L是low表示低八位)
定时器:定时时间
计数器:记录次数
四,编程部分
下面第一个是定时器
#include <REGX52.H>
sbit DU=P2^6;
sbit WE=P2^7;
unsigned int tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(unsigned char i)
{
unsigned int bai,shi,ge;
bai=i/100;
shi=i%100/10;
ge=i%10;
//第一位数码管
P0=0xff;
WE=1;
P0=0xfe;
WE=0;
DU=1;
P0=tabel[bai];
DU=0;
delay(5);
//二
P0=0xff;
WE=1;
P0=0xfd;
WE=0;
DU=1;
P0=tabel[shi];
DU=0;
delay(5);
//三
P0=0xff;
WE=1;
P0=0xfb;
WE=0;
DU=1;
P0=tabel[ge];
DU=0;
delay(5);
}
void timer0init()//定时器0初始化
{
TR0=1;//启动定时器0
TMOD=0x01;//定时器工作模式1,16位定时计数器
TH0=0x4b;//1.085us,65535
TL0=0xfd;//定时50ms
}
int main()
{
unsigned char mSec,Sec;
timer0init();
while(1)
{
if(TF0==1)
{
TF0=0;//软件清零溢出标志位
mSec++;//50ms到
if(mSec==20)
{
mSec=0;
Sec++;
}
}
display(Sec);
}
}
第二个是计数器
#include <REGX52.H>
sbit DU=P2^6;
sbit WE=P2^7;
sbit LED1=P1^0;
unsigned int tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(unsigned char i)
{
unsigned int bai,shi,ge;
bai=i/100;
shi=i%100/10;
ge=i%10;
//第一位数码管
P0=0xff;
WE=1;
P0=0xfe;
WE=0;
DU=1;
P0=tabel[bai];
DU=0;
delay(5);
//二
P0=0xff;
WE=1;
P0=0xfd;
WE=0;
DU=1;
P0=tabel[shi];
DU=0;
delay(5);
//三
P0=0xff;
WE=1;
P0=0xfb;
WE=0;
DU=1;
P0=tabel[ge];
DU=0;
delay(5);
}
void timer0init()//定时器0初始化
{
TR0=1;//启动定时器0
TMOD=0x05;//定时器工作模式1,16位定时计数器
TH0=0;//1.085us,65535
TL0=0;//定时50ms
}
void timer1init()//定时器1初始化
{
TR1=1;//启动定时器0
TMOD|=0x10;//定时器工作模式1,16位定时计数器
TH1=0X4B;//1.085us,65535
TL1=0XFD;//定时50ms
}
int main()
{
unsigned char mSec,Sec;
timer0init();
timer0init();
while(1)
{
if(TF0==1)
{
TF0=0;//软件清零溢出标志位THO
TH0=0X4B;
TL0=0XFD;
mSec++;//50ms到
if(mSec==10)
{
mSec=0;
LED1=~LED1;
}
}
display(TL0);
// if(Sec>10)
// Sec=0;
}
}