利用51单片机二、实验内容 1.P1 口做输出口,去驱动发光二极管。 2.P3 口作输入口,为按键的输入。 3.采用中断方式实现以下功能: (1)程序启动时,8 只发光二极管闪烁。按一次按键 K1,发光二极管流水显示(循环 3 次),然后发光二极管回到闪烁状态。按一次按键 K2,发光二极管流水全亮(保 持 10 秒),然后发光二极管回到闪烁状态; (2)按键 K2 不能打断按键 K1 的功能; (3)按键 K2 可以打断按键 K1 的功能。
时间: 2024-03-20 19:44:21 浏览: 192
基于51单片机的四按键控制流水灯和数码管实验
5星 · 资源好评率100%
这是一个基于51单片机的实验,主要实现了按键输入和发光二极管的输出控制,以及利用中断方式实现了以下功能:
1. 启动时,8只发光二极管闪烁,按下 K1 按钮后,发光二极管流水显示(循环 3 次),然后回到闪烁状态;按下 K2 按钮后,发光二极管流水全亮(持续 10 秒),然后回到闪烁状态。
2. 按下 K2 按钮不能打断 K1 的功能。
3. 按下 K2 按钮可以打断 K1 的功能。
下面是实现该功能的代码:
```c
#include <reg51.h>
#define LED P1
#define KEY P3
unsigned char count = 0; //计数器
unsigned char flag = 0; //标志位
//延时函数
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
//闪烁函数
void blink() {
unsigned char i;
for (i = 0; i < 8; i++) {
LED = ~(1 << i); //点亮一个发光二极管
delay(50); //延时
LED = 0xFF; //熄灭所有发光二极管
}
}
//流水函数
void flow() {
unsigned char i, j;
for (j = 0; j < 3; j++) { //循环 3 次
for (i = 0; i < 8; i++) {
LED = ~(1 << i); //点亮一个发光二极管
delay(50); //延时
}
for (i = 7; i > 0; i--) {
LED = ~(1 << i); //点亮一个发光二极管
delay(50); //延时
}
}
}
//流水全亮函数
void fullOn() {
unsigned char i, j;
for (i = 0; i < 8; i++) {
LED = ~(1 << i); //点亮一个发光二极管
delay(50); //延时
}
for (j = 0; j < 200; j++) { //持续 10 秒
LED = 0x00; //所有发光二极管全亮
delay(50); //延时
LED = 0xFF; //所有发光二极管全灭
delay(50); //延时
}
}
//中断服务程序
void interrupt_key() interrupt 0 {
if (KEY == 0) { //判断是否按下按键
flag = 1; //设置标志位为 1
}
}
//主函数
void main() {
IE = 0x81; //开启中断
IT0 = 1; //设置中断触发方式为下降沿触发
while (1) {
blink(); //闪烁
if (flag == 1) { //判断是否按下按键
flag = 0; //清除标志位
count = 0; //清除计数器
flow(); //流水显示
blink(); //闪烁
}
if (KEY == 0) { //判断是否按下按键
delay(10); //延时去抖动
if (KEY == 0) { //再次判断是否按下按键
fullOn(); //流水全亮
flag = 0; //清除标志位
count = 0; //清除计数器
blink(); //闪烁
}
}
count++; //计数器加 1
if (count == 150) { //延时 7.5 秒
count = 0; //清除计数器
flag = 0; //清除标志位
blink(); //闪烁
}
}
}
```
在该代码中,我们使用了一个计数器 count 和一个标志位 flag,计数器 count 用于计算时间,标志位 flag 用于记录是否按下了按键。在主循环中,我们先闪烁 8 只发光二极管,然后判断标志位 flag 是否为 1,如果是,则执行流水显示函数 flow(),然后再闪烁 8 只发光二极管;如果标志位 flag 为 0,则等待时间计数器 count 到达一定值后,再次闪烁 8 只发光二极管。当按下按键 K2 时,先进行去抖动延时,然后再次判断是否按下按键,如果是,则执行流水全亮函数 fullOn(),然后再闪烁 8 只发光二极管。按下按键 K1 时,不会立即执行流水全亮函数 fullOn(),而是等待流水显示函数 flow() 执行完毕后再执行。
阅读全文