51单片机电平检测程序怎么写
不过你的问题中要求3秒,时间太长了,不是很理想
我设计的是,8个LED,一个按键,按键的间隔不超过半秒即可,半秒后进行处理
每次按下按键,都重新开始计时,不论按几次按键,经过硬件实测
半秒的时间刚刚好,基本上没有空等待的时间,就是按完按键后,等待程序输出效果的时间
按键以及LED的端口你可以随意修改,如果感觉不错,记得采纳哦!
/***************************************************************************/
#include <reg51.h> //51单片机通用头文件
sbit k=P3^7;//定义按键
int t,n,s,fe=0;
/***************************************************************************/
void YS(int hs){int hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数
/***************************************************************************/
void main(void)//主函数
{
TMOD=0x01; EA=1; ET0=1;//定时器初始化
TH0=(65536-921)/256; TL0=(65536-921)%256;//定时器初值
while(1)
{
if(k==0)//如果按键被按下
{
YS(10);//延时去抖动
if(k==0)//如果是有效按键
{
TR0=1;//启动定时器,开始计时
n=0;//每次按键都清空定时计数
t++;//按键值累加一次
while(!k);//等待按键松开
}
}
if(fe==1)//如果没按键输入
{
switch(t)//则对已有的按键值进行处理
{
case 1:P2=0xfe;break; case 2:P2=0xfd;break;
case 3:P2=0xfb;break; case 4:P2=0xf7;break;
case 5:P2=0xef;break; case 6:P2=0xdf;break;
case 7:P2=0xbf;break; case 8:P2=0x7f;break;
default:P2=0xff;break;//如果不在范围内,则关闭所有LED
}
YS(500);fe=0;t=0;P2=0xff;//延时点亮一会,并清空按键计数值和设置标识符
}
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>500){TR0=0;n=0;fe=1;}//如果达到指定时间,则关闭定时器,并设置标识符
}
/***************************************************************************/
群沃电子
2025-08-01 广告