51单片机学习笔记——第十三天:中断和定时器(三)

大家好!今天是学习51单片机的第十三天,今天继续学习中断与定时。学习笔记如下:

上篇文章我们介绍了中断的编程与硬件设计,今天我们学习定时器的硬件设计与编程;

需要用到之前没介绍的寄存器:

工作方式寄存器TMOD:

 

 第一:7-4位是用来置定时器1的工作方式,3-0位是用来设置定时器0的工作方式。

第二:GATE为门控位,GATE=0,定时/计数器的启动和禁止仅由TRx(x=0/1)决
定;GATE=1,定时/计数器的启动和禁止由TRx(x= 0/1)和外部中断引脚(INT0/
INT1).上的电平(必须是高电平)共同决定。
第三:C/T为计数器模式还是定时器模式选择位。C/T= 1,设置为计数器模式;
C/T=0,设置为定时器模式。

第四:M1与M0为工作方式选择位。如图所示:

 我们通常设置为方式1,即M1=0,M0=1。

在总结一下定时中断需要用到的三个寄存器:

1.IE寄存器:EA为总中断,EA=1,为总中断开启,

2.IE寄存器:ET0/ET1为定时器0/1的中断允许开关,,需要设值为ET1=1。

3.TCON寄存器:TF1为定时器/计数器溢出标志位,T1被允许计数以后,从初值开始加一计数。当最高位产生溢出时由硬件置1。此位可以不用设置。

4.TCON寄存器:TR1为定时器1 运行控制位。有两种条件:
➢当GATE(TMOD.7)=0时,TR1=1,就允许T1开始计数,TR1=0,禁止T1计数;
➢当GATE(TMOD.7)=1时,TR1=1且外部中断引脚INT1为高电平时.才允许T1计数。
TF0/TR0同上,只是用来设置T0。通常设置为:TR0=1;

5.TMOD寄存器(定时/计数器工作方式寄存器):如上

定时器原理介绍:

之前不是介绍过单片机的定时器可以理解成一个杯子,假如一个杯子装满需要花费十秒的时间,但是我只需要5秒钟的定时,那么我们就可以先给已经有杯水的杯子加水加满,那么我们就实现5秒钟的定时。假如我们需要20秒的定时,那我们可以准备两个空杯子。

现在这个杯子就是THx(x=1/0),TLx(x=1/0)。

单片机给定时器分配了16位计数,其中高八位TH,低八位TL。 

每过一个指令周期(1us),寄存器的值+1,当加到溢出后发出一个溢出中断,我们程序可以捕获到这个中断,就可以知道此时经历了(65535+1)us。

这里只介绍方式一与方式二:

方式一:

方式二:

 

 

初值的计算 

 实验板上搭载的是11.059 2 MHz的晶振,且单片机为12T的STC89C52,那么机器周T=1/F=1/(11.059 2 MHz/12)=12/11.059 2 μs。现若要定时10 ms(10 000 μs) ,那需要记多少次数了?设为x次,则xX(12/11.0592)=10 000,则x=9 216,这个数是要在初值基础上累加的值,初值=65 536-9 216= 56320(0xDC00),这样TH0= 0xDC,TL0=0x00或者TH0=(65 536-9 216)/256,TL0=(65 536-9 216)% 256。以后读者要注意着两种版本的写法。因此有初值寄存器里装各种版本的初值,则会有各种版本的定时基准(范围0~71 ms)。可见,初值的计算公式:xX(12/晶振频率)=定时时间数μs(这就是我们要找的时间基准)。当然,也可以用STC_ISPV6.51软件自带的定时器初值计算器很方便地算出需要定时的时间基准。

中断号:

 与外部中断相似,需要写两个函数

1.定时器中断配置函数

void time0_init(void)
{
    TMOD|=0X01;//选择为定时器0模式,工作方式1
    TH0=0XFC;    //给定时器赋初值,定时1ms
    TL0=0X18;    
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器        
}
定时器中断服务函数

void 函数名 (void)interrupt  <中断号>

{

        中断服务内容

}

并且注意中断配置函数一般写在主函数之前,中断服务函数写在主函数之后。

代码如下:

实验现象:下载程序后,D1指示灯间隔1s闪烁

#include "reg52.h"

typedef unsigned int u16;    //对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义LED1管脚
sbit LED1=P2^0;

void delay_10us(u16 ten_us)
{
    while(ten_us--);    
}
void time0_init(void)
{
    TMOD|=0X01;//选择为定时器0模式,工作方式1
    TH0=0XFC;    //给定时器赋初值,定时1ms
    TL0=0X18;    
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器        
}

void main()
{    
    time0_init();//定时器0中断配置

    while(1)
    {            
                            
    }        
}

void time0() interrupt 1 //定时器0中断函数
{
    static u16 i;//定义静态变量i
    TH0=0XFC;    //给定时器赋初值,定时1ms
    TL0=0X18;
    i++;
    if(i==1000)
    {
        i=0;
        LED1=!LED1;    
    }                        
}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值