当前位置: 代码迷 >> 单片机 >> 51单片机学习笔记【4】——定时器和中断系统
  详细解决方案

51单片机学习笔记【4】——定时器和中断系统

热度:500   发布时间:2016-04-28 14:42:03.0
51单片机学习笔记【四】——定时器和中断系统

一.定时器

1.基础介绍

(1).时钟周期

  • 时钟周期T是单片机时序中的最小单位,具体计算的方法就是时钟源分之一。

(2).机器周期

  • 单片机完成一个操作的最短时间,51单片机的一个机器周期是12个时钟周期。

(3).定时器应用

  • 定时器是用来计时的,内部有一个寄存器,开始计时后,寄存器的值每经过一个机器周期就会自动加一,可以把机器周期理解为定时器的计数周期。16位的定时器,加到65535,再加1就算溢出,溢出后值变为0。

2.定时器的寄存器

  • 标准51单片机内部有T0和T1两个定时器,TH0/TH1用于T0,TH1/TH0用于T1.复位值都为0x00.
名称 描述 SFR地址
TH0 定时器0高子节 0x8C
TL0 定时器0低子节 0x8A
TH1 定时器1高子节 0x8D
TL1 定时器1低子节 0x8B

- TCON定时器控制寄存器共有8位,这里主要介绍定时器1,当程序中写TR1=1,定时器每经过一个机器周期自动加一,当程序中写TR1=0,定时器停止加一。TF1是一个标志位,作用是表明定时器溢满了。
- TMOD定时器模式寄存器,控制定时器的工作模式,模式1是THn和TLn组成一个16位的定时器,计数范围是0~65535,溢出后从0开始计数。模式1的电路示意
模式1
OSC表示时钟频率,d等于12,下边GATE右边分别是一个非门电路,或门,与门。

3.定时器使用步骤:

(1).设置特殊功能寄存器TMOD,配置工作模式;

(2).设置计数寄存器TH0和TL0的初始值;

(3).设置TCPN,通过TR0置1来让计时器开始计数;

(4).判断TCON寄存器的TF0位,监测定时器溢出情况。

4.实验例程

(1).说明:实验通过定时器控制八个LED流水灯没1s左移轮流闪烁。接线为JP11接JP12.

(2).程序源代码

/**************************************  > File Name: 定时器实验  > Author: pengshp  > Mail: [email protected]  > Date: 2015年 7 月 19 日***************************************/#include<reg51.h>#include<intrins.h>#define GPIO_LED P2unsigned char Time;void main(){    Time=0;    GPIO_LED=0x01;   //最左边一个灯亮    TMOD = 0x01;     //选择工作模式1    TH0 = 0x3C;      //设置初始值,定时50ms    TL0 = 0xB0;     TR0 = 1;         //启动定时器0    while(1)    {        if(TF0==1)                          //判断T0是否溢出        {            TF0=0;                           //T0溢出后,清零中断标志            TH0 = 0x3C;            TL0 = 0xB0;             Time++;                         //计数值自加1            if(Time==20)                    //20*50ms=1s            {                GPIO_LED=_crol_(GPIO_LED,1);//左移一位                Time=0;                     //重新置0            }         }     } }

二.中断系统

1.中断基础

(1).中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。

(2)中断允许寄存器IE

D7 D6 D5 D4 D3 D2 D1 D0
功能 EA ES ET1 EX1 ET0 EX0
  • EA:总中断允许位。
    0时:CPU屏蔽所有的中断请求。
    1是:CPU开放所有中断。
  • ES:串行口中断允许位。
    0时:禁止串行中断。
    1时:允许串行中断。
  • ET1和ET0:分别是定时器1和定时器0中断允许位
    0时:禁止相应的定时器中断
    1时:允许相应的定时器中断
  • EX1和EX0:分别是外部中断1和外部中断0的中断允许位
    0时:禁止相应的外部中断
    1时:允许相应的外部中断

(3).中断优先寄存器IP

D7 D6 D5 D4 D3 D2 D1 D0
功能 PS PT1 PX1 PT0 PX0
  • PS:串行口中断优先级
    1时:串行口中断定义为高优先级
    0时:串行口中断定义为低优先级
  • PT1和PT0:分别是定时器1和定时器0的中断优先级
    1时:相应的定时器中断为高优先级
    0时:相应的定时器中断为低优先级
  • PX1和PX0:分别是外部中断1和外部中断0的中断优先级
    1时:相应的外部中断为高优先级
    0时:相应的外部中断为低优先级

(4).中断函数

void 函数名() interrupt 中断编号

语句;

2.实验例程

(1).说明:本实验通过K1控制流水的左移,K2控制流水灯右移,接线为JP11接JP12,P3.2接K1,P3.3接K2。

(2).程序源代码

/**************************************  > File Name: 外部中断实验  > Author: pengshp  > Mail: [email protected]  > Date: 2015年 7 月 19 日***************************************/#include<reg51.h>#include<intrins.h>#define GPIO_LED    P2sbit K1=P3^2;                        //外部中断的IOsbit K2=P3^3;void IntConfiguration();void Delay(unsigned int n);unsigned char KeyValue=0;void main(){    GPIO_LED=0x01;    IntConfiguration();    while(1)    {        if(KeyValue)            GPIO_LED=_crol_(GPIO_LED,1);//左移        else            GPIO_LED=_cror_(GPIO_LED,1);//右移        Delay(2000);            }   }void IntConfiguration(){    EA=1;                    //打开总中断    //设置INT0    IT0=1;                   //跳变沿出发方式(下降沿)    EX0=1;                   //打开INT0的中断允许。    //设置INT1    IT1=1;     EX1=1;      }void Delay(unsigned int n)   //延时50us误差 0us{    unsigned char a,b;    for(;n>0;n--)    {        for(b=1;b>0;b--)        for(a=22;a>0;a--);    }}void Int0() interrupt 0     //外部中断0的中断函数{    Delay(1);               //延时消抖    if(K1==0)        KeyValue=1;}void Int1() interrupt 2     //外部中断1的中断函数{    Delay(1);               //延时消抖    if(K2==0)        KeyValue=0; }

备注:定时器和中断系统的控制是学习单片机的重点也是难点,此部分要重点学习理解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案