您现在的位置是:首页 >其他 >51单片机定时/计数器网站首页其他
51单片机定时/计数器
定时/计数器的介绍框架图如下:
一、基本结构
1.1、工作原理:
1.当S1闭合,计数器开始计数,当计数计到最大值时(此时计数器肯定是加法计数),计数器溢出,溢出标志TF置1,计数器溢出即计数器反转,如果S2闭合还可以向CPU申请中断
查询方式:
/************************************/
void delay1s()
{
unsigned char i;
for(i=0;i<20;i++)//循环20次,定时1s
{
TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;
TR1=1;//启动T
while(!TF1);//查询计数是否溢出
TF1=0;//清零溢出标志位
}
}
/*****************************************/
中断方式:
/***********************************/
void timer_1 interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)//计时1s
{
count=0;
miao++;
if(miao==60) miao=0;//秒计数计到60,则从0开始计数
}
}
/***********************************/
1.2、内部组成
1. 51单片机内部有两个16位可编程定时/计数器,称为T0和T1,51单片机的定时/计数器由T0、T1、工作方式寄存器TMOD和控制寄存器TCON四部分组成
2. 工作过程:(1)设置定时/计数器的工作方式
(2)设置计数初值
(3)启动定时/计数器
(4)计数溢出
1.3、定时/计数器工作方式寄存器TMOD
(1)M1和M0:工作方式选择位
(2)C/T_:功能选择位。当为1时为计数器,为0时为定时器
(3)GATE:门控位。当为1时,硬软件共同启动,软件控制位TR0/TR1需置1,INT0(P3.2)或INT1(P3.3)为高电平才能启动相应的定时器,即允许外部中断INT0、INT1启动定时器。当为0时,软件启动,TR0/TR1置1即可启动定时器
1.4、定时/计数器控制寄存器TCON
其作用是控制定时器的启动、停止,标识定时器的溢出和中断情况
低四位用于控制外部中断,与定时/计数无关
二、工作方式
1.工作方式0:13位定时/计数器,TH1/TH0高8位,TL1/TL0低5位
2.工作方式1:16位定时/计数器,TH1/TH0高8位,TL1/TL1低8位
3.工作方式2:8位定时/计数器,TL1/TL0
4.工作方式3:只有T0可以设置为工作方式3,T1设置为工作方式3后不工作,T0在工作方式3时,T0被分解成两个独立的8位计数器TL0和TH0
定时器T0和 T1都可以设置为工作方式0、1和2,可以用做定时/计数功能
下面是一个控制LED灯1s亮灭的一个例程,主要是了解定时器的使用,接线方式只需将LED灯与P1.0连线即可看到现象,程序只是了解一下定时器的用法
(1)查询方式
#include <reg51.h>
sbit LED=P1^0;
/************************************/
void delay1s()
{
unsigned char i;
for(i=0;i<20;i++)//循环20次,定时1s
{
TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;
TR1=1;//启动T
while(!TF1);//查询计数是否溢出
TF1=0;//清零溢出标志位
}
}
/*****************************************/
void main()
{
TMOD=0x10;//T1设置为定时器
TH1=(65536-50000)/256;//设定初值
TL1=(65536-50000)%256;
TR1=1;//启动TR1
while(1)
{
LED=~LED;
delay1s();
}
}
(2)中断方式
#include <reg51.h>
sbit LED=P1^0;
int count;
/***********************************/
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)//计时1s
{
count=0;
LED=~LED;
}
}
/***********************************/
void main()
{
TMOD=0x10;//T1设置为定时器
TH1=(65536-50000)/256;//设定初值
TL1=(65536-50000)%256;
ET1=1;
EA=1;
TR1=1;//启动TR
while(1);
}