51单片机流水灯三种实现方法

流水灯可以用三种方法实现

一.通过移位函数  _crol_()  和  _cror_()

二.位移实现流水灯

三.数组流水灯实现

首先说一下流水灯的原理

让0从左往右位移或者从右往左位移

从而实现流水灯依次点亮

电路图如下,使用软件是project


一.通过移位函数  _crol_()  和  _cror_()
_crol_()是左移函数
_cror_()是右移函数
使用移位函数需要包含头文件#include<intrins.h>

使用左移函数代码如下

 ///运行结果是LED灯从上到下依次点亮

 右移函数代码如下

 ///运行结果是LED灯从下到上依次点亮

二.位移实现流水灯

左移 “<<” 流水灯代码

///运行结果是LED灯从上到下依次点亮

左移 “>>” 流水灯也是同理

三.数组流水灯实现

原理是新建一维数组,利用循环依次赋值11111110(0xFE),11111101(0xFD)........

代码如下

///运行结果是LED灯从上到下依次点亮

补充,如果要从上到下依次点亮,再从下到上点亮,再加一个for(),就可以实现了

比如运用位移实现流水灯从上到下闪烁,再从下到上闪烁

代码如下

#include<reg51.h>      //51头文件
void delay(int t)      //定义延时函数
{
    int j;
    while(t--)
    {
    for(j=0;j<500;j++);
    }
}

void main()
{
    int i;
    while(1)
    {
        for(i=0;i<7;i++)    //循环点亮LED,到第7个LED延时一会就结束循环
        {

//P1对应的是P1端口,对端口赋值
        P1=~(0x01<<i);    //根据原理,0x01转换2进制是00000001,所以取反变成11111110,依次位移i位,就形成了流水灯
        delay(100);       //调用延时函数
        }
        
        for(i=0;i<7;i++)
        {
         P1=~(0x80>>i);       //0x80取反对应的是第8个led灯亮,LED从下到上依次点亮
         delay(100);
        }
    }
}

小白51单片机笔记,有不足之处欢迎指出,谢谢啦

在Keil(一款常用的嵌入式开发工具)中,要让LED灯依次点亮,通常需要使用定时器配合中断驱动的方式。这里是一个基本步骤: 1. **设置硬件连接**:将LED接到微控制器的GPIO口,并配置为输出模式。 2. **初始化定时器**:例如,你可以选择使用定时器0,配置好定时周期,比如设为每个周期改变LED状态。 3. **编写中断服务函数(ISR)**:当定时器溢出时,会触发相应的中断,此时在ISR中改变LED的状态(例如点亮下一个LED或熄灭当前点亮的LED)。 4. **主循环和状态控制**:在主程序的循环里,不断启动定时器并处理中断事件。可以维护一个状态变量,表示当前点亮的LED的位置,每次定时器中断后,根据这个位置递增或递减来切换LED。 5. **考虑延时**:为了保证LED有足够的时间亮起来,你需要在改变LED状态后加入适当的延时。 示例代码片段(以C语言为例): ```c #include "Keil.h" //假设这是Keil的标准头文件 // LED数组和状态变量 volatile uint8_t ledState = 0; const GPIO_TypeDef* ledPorts[] = {PORTA, PORTB, ...}; // LED所在的GPIO端口 void Timer0_IRQHandler(void) { if (/* timer overflow condition */) { ledState = (ledState + 1) % LED_COUNT; // LED_COUNT是LED的数量 GPIO_SetPinOutput(ledPorts[ledState], true); // 点亮LED GPIO_ResetPin(ledPorts[ledState - 1], false); // 关闭前一个LED } } void main(void) { // 初始化定时器0和LED端口 TIM_TimeBaseInit(&TIM0, &TIM_TimeBaseStructure); for (uint8_t i = 0; i < LED_COUNT; ++i) { GPIO_Init(ledPorts[i], &GPIO_InitStructure); GPIO_PinModeConfig(ledPorts[i], GPIO_Mode_Out_PP, GPIO_Speed_50MHz); } // 开启定时器0和中断 TIM_Cmd(&TIM0, ENABLE); NVIC_EnableIRQ(TIM0_IRQn); while (1) {} // 无限循环等待中断 } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值