stm32流水灯程序代码扩展(stm32f407流水灯程序)

http://www.itjxue.com  2023-03-04 04:16  来源:未知  点击次数: 

想用STM32开发板做个流水灯,从左到右共8个灯,要求是在第二个灯未亮前第一个灯不能灭,依次类推

题目不清楚,假设8个灯,整体循环一次的时间是80s,后一个灯亮了3s后前一个灯才允许熄灭。那么可以用定时器,定时器中采用一个变量aaa进行计数累加,比如设定一个1s的定时器,每次进入定时器变量aaa加1,aaa加到80就清零重新累加。

定时器中点亮程序:if(aaa10){把1号灯点亮};else if(aaa20){把2号灯点亮};else if(aaa30){把3号灯点亮};else if(aaa40){把4号灯点亮};else if(aaa50){把5号灯点亮};else if(aaa60){把6号灯点亮};else if(aaa70){把7号灯点亮};else if(aaa80){把8号灯点亮};

定时器中熄灭程序:if(aaa73){把7号灯熄灭};else if(aaa63){把6号灯熄灭};else if(aaa53){把5号灯熄灭};else if(aaa43){把4号灯熄灭};else if(aaa33){把3号灯熄灭};else if(aaa23){把2号灯熄灭};else if(aaa13){把1号灯熄灭};else if(aaa3){把8号灯熄灭};

这样就可以实现。方法有很多,这只是举个简单例子。

求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程

只有一个任务为什么还要使用操作系统呢!我没有流水灯的程序。我给你提供一个LED闪烁的程序。

程序里面建立三个任务,开始任务,LED0任务和LED1任务。LED0每秒钟亮80毫秒,LED1亮300毫秒,灭300毫秒,以此循环。

#include stm32f10x.h

#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "led.h"

#include "includes.h"

#define START_TASK_PRIO 10

#define START_STK_SIZE 64

OS_STK START_TASK_STK[START_STK_SIZE];

void start_task(void *pdata);

//LED0è???

#define LED0_TASK_PRIO 7

#define LED0_STK_SIZE 64

OS_STK LED0_TASK_STK[LED0_STK_SIZE];

void led0_task(void *pdata);

#define LED1_TASK_PRIO 6

#define LED1_STK_SIZE 64

OS_STK LED1_TASK_STK[LED1_STK_SIZE];

void led1_task(void *pdata);

int main(void)

{

Stm32_Clock_Init(9);

delay_init(72);

LED_Init();

LED_Init();

OSInit();

OSTaskCreate(start_task,(void *)0,(OS_STK *)START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );

OSStart();

}

void start_task(void *pdata)

{

OS_CPU_SR cpu_sr=0;

pdata = pdata;

OS_ENTER_CRITICAL();

OSTaskCreate(led0_task,(void *)0,(OS_STK*)LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);

OSTaskCreate(led1_task,(void *)0,(OS_STK*)LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);

OSTaskSuspend(START_TASK_PRIO);

OS_EXIT_CRITICAL();

}

void led0_task(void *pdata)

{

while(1)

{

LED0=0;

delay_ms(80);

LED0=1;

delay_ms(920);

};

}

void led1_task(void *pdata)

{

while(1)

{

LED1=0;

delay_ms(300);

LED1=1;

delay_ms(300);

};

}

具体详解请参考开源电子网。

STM32对GPIO操作一般用库函数,我想知道怎样用位操作实现流水灯?谢谢了!

GPIO功能文件相关操作:

使用GPIO功能前,首先要初始化系统,最简单的方法为:添加stm32f10x_rcc.c,打开stm32f10x_conf.h 在第41行将/* #include "stm32f10x_rcc.h""*/两边注释符去掉,在main函数中添加代码SystemInit();

添加stm32f10x_gpio.c

打开stm32f10x_conf.h 在37行将/*#include "stm32f10x_gpio.h"*/两边注释符去掉

GPIO口使能:

1.定义一个初始化类型结构体变量,我们为这个结构体里的各个变量赋值,

GPIO_InitTypeDef GPIO_InitStructure;

2. 开启GPIO时钟,只有开启了GPIO时钟,对应端口才可以正常工作,GPIO口对应时钟APB2

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

3. 为结构体赋值

设置GPIO口为输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //设置引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出,其它选项

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出最大频率,其它选项

设置GPIO口为输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //设置引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//悬空输

附:

GPIO_Mode值

GPIO_Mode_AIN 模拟输入

GPIO_Mode_IN_FLOATING 浮空输入

GPIO_Mode_IPD 下拉输入

GPIO_Mode_IPU 上拉输入

GPIO_Mode_Out_OD 开漏输出

GPIO_Mode_Out_PP 推挽输出

GPIO_Mode_AF_OD 复用开漏输出

GPIO_Mode_AF_PP 复用推挽输出

GPIO_Speed值

GPIO_Speed_10MHz 最高输出速率 10MHz

GPIO_Speed_2MHz 最高输出速率 2MHz

GPIO_Speed_50MHz 最高输出速率 50MHz

4. 使能GPIO口

GPIO_Init(GPIOA, GPIO_InitStructure);

例:

void GPIOA0_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, GPIO_InitStructure);

}

GPIO使用:

输出状态:

GPIO口置高:GPIO_SetBits(GPIOA,GPIO_Pin_0| GPIO_Pin_1);

GPIO口置底:GPIO_ResetBits(GPIOA,GPIO_Pin_0);

写数据到GPIO的某个引脚:GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);

写数据到GPIO:GPIO_Write(GPIOA, 0x1101);

得到GPIO口状态:GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);

u16 ReadValue;

ReadValue = GPIO_ReadOutputData(GPIOC);

例:

#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_0)

#define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_0)

#define LED0 GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)

int main(void)

{

while(1)

{

delay();

if(LED1)

LED0_OFF;

else LED0_ON;

}

}

输入状态:

得到GPIO口状态:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)

u16 ReadValue;

ReadValue = GPIO_ReadInputData(GPIOC);

这是GPIO的基本配置方法

实现走马灯 按照你自己的板子上小灯连接的对应引脚将里面的引脚换下就好了。

stm32 流水灯代码问题

初始化就不说了,main函数中的While是一个死循环,LED0,1,2,3低电平有效,

LED0=0;

LED1=1;

LED2=1;

LED3=1;

这几行表示点亮LED0.而熄灭LED1,2,3,

所以进入while循环后,首先点亮LED0,然后系统等待0.5s,然后再依次点亮LED1,LED2,LED3,间隔都是0.5s,依次点亮以后进入下一次while循环。

在一个 STM32 点亮 LED 的程序中,部分代码如下?

①配置所需的GPIO管脚,也就是PA2和PA3。

②从程序来看,高电平点亮,低电平熄灭。

(责任编辑:IT教学网)

更多

推荐Flash动画制作教程文章