51单片机定时/计数器的功能实现

来源:互联网 发布:淘宝美工怎么自学 编辑:程序博客网 时间:2024/05/27 20:50

8051单片机内部有两个16位的定时/计数器:T0和T1

定时器用途:延时和脉宽测量
读取方式:软件读取和中断

公式:
T(初值)=2^N-定时时间/机器周期时间
机器周期时间=12/fosc
N:代表几位定时器,有13 16 8位定时器
定时时间:希望设定时间,例如希望设定时间是65.535,初值就是0
fosc:晶振频率,一般用的多的晶振频率是12

四种工作方式,在TMOD中设置:
M1 M0=0X00,方式0,13位计数器
M1 M0=0X01,方式1,16位计数器,用的最多
M1 M0=0X10,方式2,8位计数器
M1 M0=0X11,方式3,8位计数器

例如:
如果我们希望定时0.2ms,定时单位用的us
65536-200/1=65336=FF38H;
初值放在TH0 TL0中,分别是高八位和低八位
TH0=0XFF;TL0=0X38;

当我们写程序的时候也可以不用计算,直接使用公式代入,例如:
TH0= -设置的定时时间/256;
TL0= -设置的定时时间%256;

定时器的实现过程:
1.给定时器设置初值(TH0 TL0的初始化)
2.打开定时器中断:ET0 =1 或 ET1=1;
3.启动定时器:TR0 =1 或 TR1=1;
4.打开全局中断:EA=1;
5.配置定时器工作方式:TMOD=0x01;
如果定时器到了TF0=1 或 TF1=1;

一旦定时器到了就会触发中断,进入中断函数中执行函数中语句。
注:一旦进入中断,定时器的初值又会从0开始,所以在中断函数中必须重新将TH0和TL0赋初值。
简单的定时器中断的实现:
#include <reg51.h>sbit LED= P0^0;void main(){P0 = 0xff;EA = 1;//允许所有中断ET0 = 1;//定时器中断0TMOD |= 0x01;//设置初值TH0 = 0x3c;//设置了初值就会不断的加1,加到溢出TL0 = 0xb0;//TH0 = 65536-50000/256;//TL0 = 65536-50000%256TR0 = 1;//定时器0开始工作while(1);//不让程序结束出去,一旦发生中断就会跳到中断}void intersrv1(void) interrupt 1 //定时器中断,遇到定时器溢出//了就会触发中断{TH0 = 0x3c;//又要重新赋初值TL0 = 0xb0;LED = !LED;//和原来的状态相反,定时精确到0.001ms}



0 0
原创粉丝点击