一、采用定时计数器控制LED灯每隔1s周期性亮灭
电路图:
代码:
#include<reg51.h>
char i=100;
void main ()
{
TMOD=0x01; //定时器T0为方式1
TH0=0xee; //设置定时器初值
TL0=0x00;
P1=0x00; //P1口8个LED点亮
EA=1; //总中断开
ET0=1; //开T0中断
TR0=1; //启动T0
while(1); //循环等待
{
;
}
}
void timer0() interrupt 1 //T0中断程序
{
TH0=0xee; //重新赋初值
TL0=0x00;
i--; //循环次数减1
if(i<=0)
{
P1=~P1; //P1口按位取反
i=100; //重置循环次数
}
}
程序通过定时器 T0 的中断,每次中断触发时切换 LED 灯的状态,从而实现 LED 灯的闪烁效果
二、计数器中断,实现按4次按钮开关后,P1口的8只LED闪烁不停
电路图:
代码:
#include <reg51.h>
void Delay(unsigned int i) //定义延时函数Delay( ),i是形 //式参数,不能赋初值
{
unsigned int j;
for(;i>0;i--) //变量i由实际参数传入一个值 //因此i不能赋初值
for(j=0;j<125;j++)
{;} //空函数
}
void main( ) //主函数
{
TMOD=0x50; //设置定时器T1为方式1计数
TH1=0xff; //向TH1写入初值的高8位
TL1=0xfc; //向TL1写入初值的低8位
EA=1; //总中断允许
ET1=1; //定时器T1中断允许
TR1=1; //启动定时器T1
while(1) ; //无穷循环,等待计数中断
}
void T1_int(void) interrupt 3 //T1中断函数
{
for(;;) //无限循环
{
P1=0xff; //8位LED全灭
Delay(500) ; //延时500ms
P1=0; //8位LED全亮
Delay(500); //延时500ms
}
}