以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。
程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下按键时,通过判断状态值来切换不同的灯亮灭模式。定时器中断函数用来实现灯的闪烁,可根据需求自行调整闪烁频率。
编程不易,忘采纳
#include#define uint unsigned int
sbit LED = P1^0
sbit KEY1 = P1^2
void delay(uint)
void main(void)
{
LED = 1 //初始化LED熄灭
KEY1 = 1 //赋值KEY1高电平
while(1)
{
if(!KEY1) //检测到按键按下
{
LED = ~LED/*LED取反,此时LED = 0,灯亮。当松手时,KEY1 = 1,不满足if语句不
进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入循
环,LED取反得到LED = 0,灯亮。*/
delay(500) /*此处延迟,保证连续两次按键动作处在程序的延时过程中,不进行其他程序从而不会影响小灯。*/
}
}
}
void delay(uint z) //延时函数
{
uint x, y
for(x=85x>0x--)
for(y=zy>0y--)
}
可下载到单片机验证。
这个程序是AVR单片机的,看下可能对你有用#include
<ioavr.h>
#include
<intrinsics.h>
#define
duanseg
PORTC
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
table[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0}
uchar
table1[]={0x08,0xce,0x12,0x82,0xc4,0x81,0x01,0xca,0x00,0x80}
void
display(uint
num)
//数码管显示
{
PORTA=0x7f
duanseg=table1[num/1000]
delay_nms(2)
PORTA=0xf0
PORTA=0xbf
duanseg=table[num%1000/100]
delay_nms(2)
PORTA=0xf0
PORTA=0xdf
duanseg=table[num%100/10]
delay_nms(2)
PORTA=0xf0
PORTA=0xef
duanseg=table[num%10]
delay_nms(2)
PORTA=0xf0
}
void
keyscan()//键盘扫描
{
if((PINB&0x40)==0)
{
delay_nms(5)
if((PINB&0x40)==0)
{
while((PINB&0x40)==0)
//按键释放
flag++
}
}
if(flag==6)
flag=0
if(flag==3)
{
if((PINB&0x80)==0)
//切换通道
{
delay_nms(5)
if((PINB&0x80)==0)
{
while((PINB&0x80)==0)
//按键释放
flag1++
}
}
if(flag1==4)
flag1=0
}
}
void
set()
//设置上下限
{
if(flag==0)
display(ADHandler())
if(flag==1)
//设置上限
只能加
没有设置减
{
display(high)
if((PINB&0x20)==0)
{
delay_nms(5)
if((PINB&0x20)==0)
{
while((PINB&0x20)==0)
{
display(high)
}
high=high+100
if(high>4900)
high=2000
display(high)
}
EEPROM_write(1,
high/100)
}
}
if(flag==2)
//设置下限
只能加
没有设置减
{
display(low)
if((PINB&0x20)==0)
{
delay_nms(5)
if((PINB&0x20)==0)
{
while((PINB&0x20)==0)
{
display(low)
}
low=low+10
if(low>1000)
low=50
display(low)
}
EEPROM_write(2,
low/10)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)