写51单片机按键控制程序有4个独立按键,其中包括led灯的亮和灭和流水灯的三种形态,每按一下执行一种和数码管显示0到999和蜂鸣器
时间: 2024-03-26 08:38:38 浏览: 124
好的,我可以帮你编写一份基于51单片机的按键控制程序。下面是代码实现:
```c
#include <reg51.h>
// 定义按键引脚和LED引脚
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit led = P2^0;
// 定义数码管引脚和蜂鸣器引脚
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P2^3;
// 数码管显示的数字
unsigned int num = 0;
// Led灯亮和灭函数
void led_on()
{
led = 1;
}
void led_off()
{
led = 0;
}
// 流水灯函数
void flow_light()
{
unsigned int i = 0;
for(i = 0; i < 8; i++)
{
P2 = ~(0x01 << i);
delay(200);
}
}
// 数码管显示函数
void display()
{
unsigned int i = 0;
for(i = 0; i < 4; i++)
{
wela = 1;
P0 = 0xff;
wela = 0;
dula = 1;
P0 = ~(0x01 << i);
dula = 0;
wela = 1;
P0 = num / (unsigned int)(pow(10, 3 - i)) % 10;
wela = 0;
}
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j = 0;
for(; i > 0; i--)
for(j = 0; j < 125; j++);
}
// 主函数
void main()
{
unsigned char key = 0; // 记录按键次数
while(1)
{
// 判断按键是否按下
if(!key1)
{
delay(10);
if(!key1)
{
key++;
switch(key)
{
case 1:
led_on(); // LED灯亮
break;
case 2:
led_off(); // LED灯灭
break;
case 3:
flow_light(); // 流水灯
break;
case 4:
num++; // 数码管显示加1
break;
}
while(!key1);
}
}
else if(!key2) // 按键2
{
delay(10);
if(!key2)
{
key++;
switch(key)
{
case 1:
led_on();
break;
case 2:
led_off();
break;
case 3:
flow_light();
break;
case 4:
num--; // 数码管显示减1
break;
}
while(!key2);
}
}
else if(!key3) // 按键3
{
delay(10);
if(!key3)
{
key++;
switch(key)
{
case 1:
led_on();
break;
case 2:
led_off();
break;
case 3:
flow_light();
break;
case 4:
num = 0; // 数码管清零
break;
}
while(!key3);
}
}
else if(!key4) // 按键4
{
delay(10);
if(!key4)
{
key++;
switch(key)
{
case 1:
led_on();
break;
case 2:
led_off();
break;
case 3:
flow_light();
break;
case 4:
beep = 1; // 蜂鸣器响
delay(500);
beep = 0; // 蜂鸣器停止
break;
}
while(!key4);
}
}
else
{
key = 0;
}
display(); // 数码管显示
}
}
```
这份代码实现了四个独立按键控制LED灯的亮和灭、流水灯的三种形态、数码管显示0到999和蜂鸣器。其中,按键使用了轮询方式,数码管的显示采用了多路复用的方法。需要注意的是,由于51单片机的输出端口是准双向的,需要在程序中设置上拉电阻。
阅读全文