C51教程 第五个C51程序:内部资源之定时计数器

内部资源之定时器

16位计数器:T0 分为 TH0(高八位) 和 TL0(低八位)
              T1 分为TH1(高八位) 和 TL1(低八位)
(1)相关口线:T0:P3.4,定时计数器0外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.4作IO口使用
T1:P3.5,定时计数器1外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.5作IO口使用
输入信号下降沿有效,前一个机期周期为高电平 ,后一个机期周期为低电平表示有脉冲,信号周期: T>=2Tfr=2*12*Tosc,即信号的频率f
(1/f)>=(24/fosc)   >>   f<=fosc/24   
           
 (2)相关控制字:TMOD  TCON  IE  IP 
                TH0    TL0  TH1 TL1
TH0:定时计数器0的高8位   65536 取高八位则X/2^8(256)
    TL0:定时计数器0的低8位         取低八位则X%2^8(256)
    TH1:定时计数器1的高8位         
    TL1:定时计数器1的低8位
         用于存计数值,若TR0(TR1)=1,如果有脉冲信号    则自动加1
    IE:EA ET0 ET1
    IP:PT0 PT1
    TCON:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
        TR0:定时计数器0的启动控制位
             当TR0=1,允许计数,TR0=0时,停止计数
        TR1:定时计数器1的启动控制位
             当TR1=1,允许计数,TR1=0时,停止计数              65535
        TF0:定时计数器0的溢出标志位                0000 0000 0000 0000     
                                                      1111 1111 1111 1111
             当TH0与TL0计数计满溢出时自动置1;
 若EA&ET0=1时,即定时中断0处于开启状态,则TF0等效为定时中断0的中断请求标志位,CPU响应中断后自动清零;如果EA&ET0=0,则必须软件清零(TF0=0)。

        TF1:定时计数器1的溢出标志位
             当TH1与TL1计数计满溢出时自动置1;
若EA&ET1=1时,即定时中断0处于开启状态,则TF1等效为定时中断1的中断请求标志位,CPU响应中断后自动清零;如果EA&ET1=0,则必须软件清零(TF1=0)。

    TMOD: 定时计数器的工作方式选择控制寄存器
           GATE C/T M1 M0  GATE C/T M1 M0
                  T1              T0
        GATE:门控位
           当GATE=0,T0(T1)与外部中断脚INT0(INT1)无关;
           当GATE=1时,必须INT0(INT1)=1时定时计数器T0(T1)才能工作
        C/T: 定时方式与计数方式选择位
          C/T=0时,定时方式,计数器的工作脉冲来自内部时钟信号,为Fosc/12(即十二个振荡脉冲向定时提供一个工作脉冲,即每个机器周期自动加1)
          C/T=1时,计数方式,计数器的工作脉冲来自外部时钟信号(P3.4或是P3.5),有脉冲时自动加1)
        M1M0 定时计数器的工作方式选择位
         0 0  方式0,TH0(TH1)+TL0(TL1)的低五位 13位计数器
         0 1  方式1,TH0(TH1)+TL0(TL1)16位计数器
         1 0  方式2,8位自动重装方式,TL0(TL1)计数,TH0(TH1)存放初值(重装值)
         1 1  方式3,T0具有,TH0与TL0为两个独立的八位计数器,th0占用原有T1的资源TL0即可定时亦可计数(P3.4),TH0只能定时
TR0  TL0  TF0  EA ET0  进中断1
                   TR1  TH0  TF1  EA ET1  进中断3
                   T1为波特率发生器,不能用于定时或是计数
t=P(2^n-x)Tfr   t:为定时时间,x:为TH0与TL0中的初值,Tfr:机期周期
             n:为计数器的长度,与工作方式有关。
机器周期:Tfr=12*1s/Fosc    FOSC=24M   Tfr=12*1s/(12*10)=0.5*10s=1us=10^-6s  
定时时间:t=pluse*Tfr       t=5ms   
脉冲数:pluse=t/Tfr    pluse=1ms/1us=1000    
定时数初值:x=2-pluse  n:表示定时计数器的长度,由工作方式决定 x=2-1000=64536 

T=0.707(R1+R2)C+0.707*R2*C  
F=1/T     483=1/(0.707(R1+R2)C+0.707*R2*C)>>C=1000 000 /(zi*0.707*3) nf

t=(2^n-初值)Tfr   1000=2^n-x  x=2^13-1000=8192-1000=7192
f=38k  T=1s/f t=T/2   13us=(2^n-x)Tfr 13=2^n-x x=2^n-13=2^8-13

定时器是什么?定时器顾名思义是用来计时的,比如led闪烁的频率可以用定时器来控制,它比延时函数更加精确,而且最重要的是它可以不占用CPU的资源单独运行。

定时器在程序中的含义就是:每隔一段时间就执行定时器中断服务函数一次,隔多久可以自行编程

接下来我们通过一个最简单的定时器实验来具体学习

定时器之一个发光二极管闪烁

首先创建一个名为定时器的一个文件夹,
在这里插入图片描述然后,打开仿真,布置电路图,所需元件:AT89C51、LED-YELLOW、RES在这里插入图片描述
点击保存到刚刚创建的文件夹下,在这里插入图片描述
打开keil4,新建一个定时器工程,写下代码


#include <reg51.h>

void main(void)
{
//相关控制字
	TMOD = 0x01;	//定时方式,计数器的工作脉冲来自内部时钟信号
	TCON = 0x30;   //定时计数器启动
	ET0 = 1;		   //打开定时器0中断
	EA = 1;			   //打开总中断
 	TH0 = (65535-5000)/256;	   //设置定时器时间为50ms
	TL0 = (65535-5000)%256;
	while(1);
}

timer0(void) interrupt 1
{
	static char n = 0;	  //记录中断响应次数n
	n++;
	TH0 = (65535-50000)/256;   //响应中断后会清零,要从新赋值
	TL0	= (65535-50000)%256;
	if(n == 20)			  //记录到响应了20次 也就是1秒,执行下程序
	{
		n = 0;	//录记响应次数清零
		P1 = ~P1;	
	}
} 

编译,烧录
在这里插入图片描述
在这里插入图片描述

代码以及仿真文件包:定时器.rar

猜你喜欢

转载自blog.csdn.net/mbs520/article/details/104491463
C51