一、中断及定时器工作原理
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;
sbit beep = P0^5;
void main()
{
while(1)
{
beep = ~beep;
delay_ms(1); //时间越短,声音越尖锐
}
}
(四)、技巧:
1、用两个定时器时候设定工作方式:
TOMD |= 0x01;
1、用两个定时器时候设定工作方式:
TOMD |= 0x01;
TOMD |= 0x01;
2、关定时器:
TR1 = 0;