1、功能描述
采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停
2、实验原理
定时器原理:8051的定时器可以用于计数外部事件或执行内部定时操作。在本程序中,定时器1被设置为模式2,即8位自动重装载定时器模式。
中断机制:8051微控制器支持中断,可以响应外部或内部事件。定时器溢出可以触发中断,中断服务程序可以执行特定的任务。
端口控制:P2端口用于输出信号,程序通过改变P2端口的状态来实现LED灯的闪烁。
3、编程思路
初始化设置:首先,通过timer1_init()函数初始化定时器1,设置定时器模式、重装载值,并启动定时器。
主循环:在main()函数的无限循环中,P2端口初始设置为高电平(P2=0xff;),然后检查count变量的值。如果count为1,P2端口输出低电平(P2=0x00;),延时500毫秒,再输出高电平,再延时500毫秒,模拟LED灯的闪烁。
中断触发:定时器1的中断服务程序timer1()会在定时器溢出时被调用,将count设置为1,触发P2端口状态的改变。
延时实现:delay()函数通过双重循环实现延时,延时时间由传入的毫秒数决定。
通过这种方式,程序实现了一个简单的LED闪烁效果,展示了定时器中断和端口控制的基本应用。
4、代码
cpp
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar count=0;
void delay(unsigned int xms)
{
unsigned char i,j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
xms--;
}
}
void timer1_init(void)
{
TMOD = 0x50;
TH1 = (65536-4)/256;
TL1 = (65536-4)%256;
ET1 = 1;
EA = 1;
TR1 = 1;
}
void main()
{
timer1_init();
while (1)
{
P2=0xff;
if(count==1)
{
P2=0x00;
delay(500);
P2=0xff;
delay(500);
}
}
}
void timer1() interrupt 3
{
count=1;
}