51单片机实现双流水灯
时间: 2023-11-07 11:05:02 浏览: 44
以下是51单片机实现双流水灯的代码:
```
#include <reg51.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
void delay(unsigned int t) //延时函数
{
unsigned int i, j;
for(i=0;i<t;i++)
{
for(j=0;j<125;j++);
}
}
void main()
{
while(1)
{
LED1 = 1;
LED2 = 0;
delay(500); //延时500ms
LED1 = 0;
LED2 = 1;
delay(500); //延时500ms
}
}
```
注:该代码中,LED1和LED2分别对应P1口的第0位和第1位,可以根据需要修改。delay函数中的延时时间可以根据实际情况调整。
相关问题
基于C251单片机的水位测量程序,有水灯亮
好的,针对您的问题,以下是一份基于C251单片机的水位测量程序,当水位高于一定程度时,会点亮水灯。
```c
#include <STC12C5A60S2.h>
sbit trig = P1^0; //定义触发引脚
sbit echo = P1^1; //定义回响引脚
sbit led = P1^2; //定义水灯引脚
unsigned int distance; //定义距离变量
void delay(unsigned int us) //延时函数
{
unsigned int i, j;
for(i = us; i > 0; i--)
for(j = 112; j > 0; j--);
}
void main()
{
TMOD = 0x01; //定时器T0工作方式1
TH0 = 0; //定时器T0初始值
TL0 = 0;
TR0 = 1; //启动定时器T0
ET0 = 1; //打开定时器T0中断
EA = 1; //打开总中断
while(1)
{
trig = 1; //触发超声波发送脉冲
delay(10); //延时10us
trig = 0;
while(!echo); //等待回响引脚跳变
TH0 = 0; //清零定时器T0计数器
TL0 = 0;
while(echo); //等待回响引脚跳变
distance = (TH0 << 8) + TL0; //计算距离
if(distance < 20) //如果距离小于20cm,则点亮水灯
led = 1;
else
led = 0;
}
}
void timer0_isr() interrupt 1 //定时器T0中断服务函数
{
TH0 = 0; //重新赋初值
TL0 = 0;
}
```
该程序通过超声波测距模块测量距离,当距离小于20cm时,点亮水灯。其中,trig和echo分别为超声波模块的触发引脚和回响引脚,led为水灯引脚,delay函数用于延时,timer0_isr为定时器T0中断服务函数,用于定时器计时。
编写一段c语言代码,实现按键一流水灯(按一下动一下),实现按键二反向流水灯(按一下动一下)
以下是实现按键一流水灯和按键二反向流水灯的示例代码:
```
#include <reg52.h>
sbit KEY1 = P1^0; // 定义按键1
sbit KEY2 = P1^1; // 定义按键2
sbit LED = P2^0; // 定义LED灯
void delay(unsigned int time);
void main()
{
unsigned char flag = 0; // 定义标志位,用于控制流水灯方向
unsigned char state1 = 1; // 定义按键1状态,用于检测按键按下
unsigned char state2 = 1; // 定义按键2状态,用于检测按键按下
while (1)
{
// 检测按键1是否按下
if (KEY1 == 0 && state1 == 1)
{
state1 = 0; // 更新按键1状态
flag = 0; // 设置流水灯方向为正向
}
// 检测按键1是否释放
else if (KEY1 == 1 && state1 == 0)
{
state1 = 1; // 更新按键1状态
}
// 检测按键2是否按下
if (KEY2 == 0 && state2 == 1)
{
state2 = 0; // 更新按键2状态
flag = 1; // 设置流水灯方向为反向
}
// 检测按键2是否释放
else if (KEY2 == 1 && state2 == 0)
{
state2 = 1; // 更新按键2状态
}
// 根据标志位控制流水灯方向
if (flag == 0)
{
LED = 0x01;
delay(1000);
LED = 0x02;
delay(1000);
LED = 0x04;
delay(1000);
LED = 0x08;
delay(1000);
}
else
{
LED = 0x08;
delay(1000);
LED = 0x04;
delay(1000);
LED = 0x02;
delay(1000);
LED = 0x01;
delay(1000);
}
}
}
void delay(unsigned int time)
{
unsigned int i, j;
for (i = 0; i < time; i++)
{
for (j = 0; j < 125; j++);
}
}
```
该代码中,使用了两个按键来控制流水灯的方向,按键一用于控制正向流水灯,按键二用于控制反向流水灯。在每次循环中,先检测按键的状态,如果按键被按下,则更新标志位来控制流水灯的方向。然后根据标志位控制流水灯的顺序,以实现正向或反向流水灯的效果。同时,为了让流水灯的效果更为明显,使用了一个简单的延时函数来控制每个LED灯的亮灭时间。