基于51单片机的按键控制LED实验
当KEY1被按下时,LED1每隔0.5s切换一次亮灭状态作为左转向灯,且当LED1点亮的同时蜂鸣器鸣叫,再次按下KEY1后左转向灯关闭
#include <REGX52.H>
sbit BEEP=P1^0;
#define BEEP_ON BEEP=0;
#define BEEP_OFF BEEP=1;
sbit KEY1=P3^2;
sbit LED1=P2^4;
bit left_turn = 0; //开关变量,表示左转向灯是否打开
bit led_state = 0; //状态变量,表示LED的亮灭状态
void DelayNms(int nms) //延时函数
{
static unsigned int i,j;
for(i=0;i<nms;i++)
for(j=0;j<123;j++);
}
void main()
{
BEEP_OFF;
LED1=1;
TMOD = 0x01; //定时器0工作在模式1
TH0 = (65536-60536)/256; //定时器0初值,定时500ms
TL0 = (65536-60536)%256;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while(1)
{
if(KEY1==0) //检测按键是否按下
{
DelayNms(50); //消抖
if(KEY1==0)
{
left_turn = ~left_turn; //反转开关变量
while(KEY1==0); //等待按键松开
}
}
}
}
void timer0() interrupt 1 //定时器0中断服务函数
{
TH0 = (65536-60536)/256; //重新加载初值
TL0 = (65536-60536)%256;
if(left_turn) //如果左转向灯打开
{
led_state = ~led_state; //反转状态变量
LED1 = led_state; //控制LED亮灭
BEEP = led_state; //控制蜂鸣器鸣叫
}
else //如果左转向灯关闭
{
LED1 = 1; //关闭LED
BEEP = 1; //关闭蜂鸣器
}
}