版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiaoermeng/article/details/88135688
定时器中断o,利用中断控制LED闪烁每隔1s闪烁一次(精确的1s)
notes:
(1)工作方式寄存器TMOD ,低四位用于To,高四位用于T1,(GATE,C/T- ,M1,M0)
一般让GATE =0,C/T=0是定时器,C/T=1是计数器;
MiM0: 工作方式设置位,一 般用01 (16位定时计数器)或者10 (8位自动重装定时计数器)
(2)定时器中断的步骤:
一,对TMOD赋值,确定T0或T1的工作方式:
二,计算初值,并写入TH0, TL0或者TH1 ,TL1
三,开放定时器中断ETx=1以及总中断EA=1;
四,打开定时器:
(3)M1M0:01 (16位定时计数器)和10(8位自动重装定时计数器)的区别在于前者需要在中断里面重新设置THx以及TLx初值,后者则不需要。
/*********************************
*********************************/
#include"reg52.h"
#include"intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P0^0;
sbit K3=P3^2;
u16 i=0;
void delay(unsigned int);
void delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<124;j++)
{}
}
void main()
{
TMOD|=0x01;//选择为定时器0模式,工作方式1,具体上面讲的详细
TH0=0XFC;//2^16-1000+1再取16进制(1000=1ms/1us)
TL0=0X18;//给定时器赋初值,定时1ms
ET0=1;//打开定时器0中断允许
EA=1;//开总中断
TR0=1;//´打开定时器T0
while(1)
{
}
}
void time0()interrupt 1
{
TH0=0XFC;
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
此篇文章可以对比外部中断,对比着看。