单片机定时器中断应用:LED闪烁程序及波形分析 (方式0, 方式1, 方式2)
了解定时器中断概念,分别通过方式0,方式1,方式2,设置LED灯闪烁1s程序,用示波器测波形
方式0:
#include <reg52.h>
sbit LED = P1^0; //LED连接的IO口
void Timer0_Init()
{
TMOD |= 0x01; //设置为定时器0工作在方式0
TH0 = 0x3C; //设置定时器初值
TL0 = 0xAF;
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
}
void main()
{
Timer0_Init();
while(1);
}
void Timer0_ISR() interrupt 1
{
TH0 = 0x3C; //重新设置定时器初值
TL0 = 0xAF;
LED = ~LED; //LED翻转状态
}
方式1:
#include <reg52.h>
sbit LED = P1^0; //LED连接的IO口
void Timer1_Init()
{
TMOD |= 0x10; //设置为定时器1工作在方式1
TH1 = 0xFC; //设置定时器初值
TL1 = 0x66;
ET1 = 1; //开启定时器1中断
EA = 1; //开启总中断
TR1 = 1; //启动定时器1
}
void main()
{
Timer1_Init();
while(1);
}
void Timer1_ISR() interrupt 3
{
TH1 = 0xFC; //重新设置定时器初值
TL1 = 0x66;
LED = ~LED; //LED翻转状态
}
方式2:
#include <reg52.h>
sbit LED = P1^0; //LED连接的IO口
void Timer0_Init()
{
TMOD |= 0x02; //设置为定时器0工作在方式2
TH0 = 0x3C; //设置定时器初值
TL0 = 0xAF;
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
}
void main()
{
Timer0_Init();
while(1);
}
void Timer0_ISR() interrupt 1
{
static unsigned char cnt = 0;
cnt++;
if(cnt == 50) //50个中断为1s
{
cnt = 0;
LED = ~LED; //LED翻转状态
}
}
注意:以上三种方式的波形不同,需要使用示波器分别测量。
原文地址: https://www.cveoy.top/t/topic/jxTm 著作权归作者所有。请勿转载和采集!