利用单片机和8 个LED 发光二极管等器件,制作一个单片机控制的流水灯系统: 单片机的P2.0~P2 .7 接有8个发光二极管, 运行程序,单片机控制8个发光二极管进行流水灯操作,流水灯从上到下依次点亮,反复循环。c)对本实验进行改进,增加一个按键接到P3.0,要求按一下即可实现流水灯的停止,再按一下又可实现流水灯的重新显示,原理图与代码应如何修改。
时间: 2023-05-31 09:06:27 浏览: 234
原理图修改:
在P3.0口接一个按键,按键一个端子接到P3.0,另一个端子接到GND。
代码修改:
在原来的流水灯程序基础上,加入按键检测和流水灯停止/重新显示的功能。具体代码如下:
#include<reg52.h>
#define LED P2
sbit KEY = P3^0;
void delay(unsigned int x)
{
unsigned int i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main()
{
unsigned char i = 0;
unsigned char flag = 1; //初始化为1,表示流水灯正常运行
while (1)
{
if (flag) //流水灯正常运行
{
LED = 0xff; //全灭
for (i = 0; i < 8; i++)
{
LED = ~(1 << i); //依次点亮
delay(500);
}
}
else //流水灯停止
{
LED = 0xff; //全灭
while (!flag) //等待按键按下
{
if (!KEY) //按键按下
{
delay(10); //防抖
if (!KEY) //确认按键按下
{
flag = 1; //流水灯重新显示
break;
}
}
}
}
if (!KEY) //按键按下
{
delay(10); //防抖
if (!KEY) //确认按键按下
{
flag = !flag; //流水灯停止/重新显示的切换
}
}
}
}
注释:
1. 定义一个flag变量表示流水灯是否正常运行,初始化为1。
2. 在while(1)循环中,首先判断flag变量的值,如果为1,表示流水灯正常运行,执行流水灯程序;如果为0,表示流水灯停止,执行停止程序。
3. 停止程序中,先全灭LED,然后进入一个while循环,等待按键按下。
4. 如果按键按下,先进行防抖处理,确认按键按下后,将flag变量置为1,表示流水灯重新显示,跳出while循环。
5. 流水灯程序中,依次点亮LED,每个LED点亮后延时500ms。
6. 在while(1)循环中,检测按键是否按下,如果按下,先进行防抖处理,确认按键按下后,将flag变量取反,实现流水灯停止/重新显示的切换。
阅读全文