用51单片机写一段程序,利用八个发光二极管制作一个从上往下的流水灯(利用移位函数),并用按键控制,点一下开始开始运行流水灯程序,再点一下,流水灯停止工作
时间: 2023-12-13 16:03:27 浏览: 80
基于51单片机在工程中包含intrins.h头文件,使用循环右移函数_cror_(a,b)实现流水灯。
5星 · 资源好评率100%
好的,以下是用51单片机写的程序:
```c
#include <reg51.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
sbit KEY = P3^2;
void delay(unsigned int t) //延时函数
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
void main()
{
unsigned char led = 0x01;
unsigned char flag = 0;
while(1)
{
if(KEY == 0) //按键检测
{
delay(10); //去抖动
if(KEY == 0)
{
flag = ~flag; //取反
while(!KEY); //等待按键释放
}
}
if(flag) //流水灯运行
{
P1 = led;
delay(500); //延时500ms
led <<= 1;
if(led == 0) led = 0x01; //循环移位
}
else //流水灯停止
{
P1 = 0xff;
}
}
}
```
在上面的程序中,我们使用了一个延时函数和一个按键检测函数来实现按键控制流水灯的开关。当按下按键时,程序会检测到按键状态为0,然后取反标志位flag,再等待按键释放。当flag为1时,流水灯运行,当flag为0时,流水灯停止。
流水灯的实现是通过移位函数来实现的,我们定义了一个led变量,初始值为0x01,然后在循环中不断左移,每次左移一个位置,再判断是否移位到了最后一位,如果是,则将led重新赋值为0x01,从头开始循环移位。在移位的过程中,我们使用P1寄存器来控制8个发光二极管的亮灭。这里我们使用了P1^0到P1^7来控制8个发光二极管,当P1的某一位为0时,对应的发光二极管会亮起来,否则灭掉。
希望这个程序对你有帮助!
阅读全文