51单片机的定时器与中断


一、中断及定时器工作原理
1、中断概念:
1>CPU处理事件A发生事件B进行处理(中断产生)
2>CPU暂时中断当前工作,转去处理事件B(中断响应与中断服务)
3>待CPU处理完B,再回来处理事件A(中断返回)
4>51不支持中断嵌套

图释:

注意:中断服务不超过20行,尽量简短,不要进行复杂的比较,延时运算!可以进行简单比较,标志位,赋值的处理

保存主程序服务状态(保护现场):push:入栈   保存工作状态
恢复工作状态 pop:出栈

89C51:5个中断源    89C52:8个中断源

2、


可以看出,003H——00BH中有8个字节,显然是不够程序存放的,着八个字节中存放跳转指令

在ARM中,此表叫做中断向量表,在ARM中可更改,在51中固定

二、定时器使用方法

void timer_init()
{
    EA = 1;  //打开总中断
      TMOD = 0x01;  //设置定时器工作模式
      TH0 = (65536 - 5000) / 256;  //为定时器填初值5ms
      TL0 = (65536 - 5000) % 256;
      ET0 = 1;  //打开定时器0
      TR0 = 1;¡  //启动定时器0
}

(一)、打开总中断:


在reg52中:
/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

EA被定义为A8H的第七位

标志位(只有0/1的)可以用bit定义

(二)、设定定时器工作方式

C/T:0定时,1计数(默认为0)
GATE:门电压位

(三)、给定时器赋初值:
1、晶振频率:12M,那么震荡周期为1/12us
2、机器周期:12个震荡周期=一个机器周期,即1us
3、51单片机为加法定时器

假如需要定时2ms,即加2000次,则定时器中填入65535-2000,即加2000溢出

TL0与TH0为两个寄存器,合成16位,为Timer0,高八位等于65535-2000对256取整(相当于右移8位),放入TH0,低八位等于65535-2000对256取余,放入TL0

(四)、打开定时器中断
(五)、启动定时器

(六)、写中断服务函数
1、中断服务函数无参数,无返回值
2、例:
void timer_isr() interrupt 1   //中断服务号
{
      TH0 = (65536 - 5000) / 256;    //重新填初值
      TL0 = (65536 - 5000) % 256;

      i++;

      if(200 == i)        //一秒到(200次,一次5ms)
        {
        i = 0;
              led = ~led;
    }
}

三、蜂鸣器
(一)、分类
1、有源蜂鸣器
2、无源蜂鸣器(大都为无源蜂鸣器,可以变音调)
(二)、有源蜂鸣器原理图:

其中蜂鸣器部分需要方波,一般为1K的频率,此频率可调音调
(三)、例:
sbit beep = P0^5;

void main()
{
        while(1)
        {
                beep = ~beep;
                delay_ms(1);            //时间越短,声音越尖锐
        }
}

(四)、技巧:
1、用两个定时器时候设定工作方式:
TOMD |= 0x01;
TOMD |= 0x01;
2、关定时器:
TR1 = 0;













  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值