定时器中断方式控制
中断寄存器
CPU能响应定时器0中断的条件:需要配置IE寄存器的bit1: ET0 bit7:EA
- ET0中断允许要置1 ET0 = 1
-
EA总中断要置1 EA = 1
硬件内部设计逻辑如下图:
/*******************************************************
*********定时器中断控制LED每隔1秒亮灭一次********************
*****main中控制另外一个灯每个300ms亮灭一次,有点多线程的意思了***
*******************************************************/
#include "reg52.h"
#include<intrins.h>
sbit led = P3^6;
sbit led1 = P3^7;
int cnt = 0;
void Time0Init()
{
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个10ms出来
TL0=0x00;
TH0=0xDC;
//3. 开始计时,定时器"数数"
TR0 = 1;
TF0 = 0;
//4. 打开定时器0中断
ET0 = 1;
//5. 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz 软件延时,CPU“数数”
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
led = 1;
Time0Init();
while(1){
led1 = 0;
Delay300ms();
led1 = 1;
Delay300ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){//爆表100次,经过了1s
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
led = !led;//每经过1s,翻转led的状态
}
}
外部中断
外部中断的I/O口在P3.2
打开外部中断
EX0 = 1
,打开总中断
EA=1
,低电平触发
IT0=0
把开发板的P3.2用杜邦线接到GND上,就会触发中断,发现LED亮起来了。(为什么是P3.2?因为由最上面的原理图可知道INT0的引脚是P3.2)
#include<reg52.h>
sbit LED=P3^2;
void main()
{
IT0=0; //中断触发方式为低电平触发,IT0=1则为下边沿触发
EX0=1; //打开外部中断0
EA=1; //打开中断总开关
while(1)
{
LED=1; //在没有中断发生时,LED关闭
}
}
void INTERR(void) interrupt 0
{
LED=0;//有中断发生时,LED亮起
}
版权声明:本文为weixin_48856218原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。