#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1//8个发光二级管
sbit key1=P3^5
sbit key2=P3^6
#define LED_ON() LED=0x00 //所宽庆族有灯亮
#define LED_OFF() LED=0xff //灭
#define LED_PWM_MAX 99
#define LED_PWM_MIN 0
uchar LED_Direction=0 //LED方向控制 0:变亮 1:差源变暗
uchar LED_PWM_Counter=0 //LED占空比
uchar count=0 //中断计数
bit flag=0//按键扫描标志位
void main()
{
P3=0xff //做输入口先写1
TMOD=0x01
TH0=0xff
TL0=0x47
EA=1
ET0=1
TR0=1
while(1)
{
if(flag)
{
if(key1==0)
{
if((LED_PWM_Count<=LED_PWM_MAX)&&(LED_Direction==0))
{
LED_PWM_Count++
if(LED_PWM_Count>LED_PWM_MAX)
{
LED_PWM_Count=LED_PWM_MAX
LED_Direction=1
}
}
}
if(key2==0)
{
if((LED_PWM_Count>=LED_PWM_MIN)&&(LED_Direction==1))
{
LED_PWM_Count--
if(LED_PWM_count<LED_PWM_MIN)
{
LED_PWM_Count=LED_PWM_MIN
LED_Direction=0
}
}
}
if(LED_PWM_Count>0)
{
LED_ON()
LED_PWM_Count--
}
else
{
LED_OFF()
}
}
}
}
void timer0() interrupt 1
{
TH0=0xff
TL0=0x47
if(++count>慎弊=10)//2ms扫描一次按键(不行可以把时间改小)
{
count=0
flag=1
}
}
大概就这个思路,如果不行你自己改改吧!
sbit KEY = P0^1sbit LED = P0^2
int keyscan(void)
{
bit keyval=0
if(KEY)
{
delay(30)//延时消抖
if(KEY)
{
keyval = ~keyval//返隐值取反
if(keyval )
{
LED = 1/此埋/led亮漏扒厅
}
else
{
LED = 0//led灭
}
}
}
}
以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。
程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下按键时,通过判断状态值悄拦悉来切换不同的灯亮灭模式衡首。定启乎时器中断函数用来实现灯的闪烁,可根据需求自行调整闪烁频率。
编程不易,忘采纳
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)