stm32设计流水灯及仿真结果 您所在的位置:网站首页 循环的程序流程图怎么做 stm32设计流水灯及仿真结果

stm32设计流水灯及仿真结果

#stm32设计流水灯及仿真结果| 来源: 网络整理| 查看: 265

想用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号灯熄灭};

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

单片机原理流水灯实验报告

单片机原理流水灯实验报告:

本实验的目的是通过使用单片机,来实现流水灯的功能。实验中,使用了AT89C51单片机,通过设置定时器,实现了不同的流水灯灯序,并使用外部中断按键,来控制流水灯的开关。实验的结果表明,单片机通过定时器和外部中断按键,可以实现流水灯的功能。

拓展:本实验的

拓展可以包括,使用其他单片机,如STC89C52、STM8S103等,来实现流水灯的功能;另外,可以在实验中增加按键,实现不同的灯序变化;可以添加LCD显示屏,显示当前灯序;还可以通过设置定时器,实现时间控制,实现定时开启和关闭流水灯。

[img]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流水灯流程图

用STM32点灯?好吧!

你的问题没理解,流水灯流程图,这需要流程图吗?直接:芯片 --》初始化-》赋值,完了。

还有,模块流程图指什么,得说清楚点吧?

新手求助各位师傅,关于STM32通过按键控制流水灯

主要应用到的外设有定时器,GPIO就能够实现流水灯的效果。用定时器做1s的定时中断,在中断程序中进行GPIO 输出高低电平的切换就可以了。

stm32开发板怎么用按键控制流水灯

开发板上4个LED是接到STM32的4个IO口上的,要点亮LED,只要在这4个IO上输出对应的高电平

那如何让STM32在PF6~PF9这4个IO上输出高点平呢

首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8章 通用和复用功能I/O(GPIO和AFIO)

百为STM3210E-EVAL开发板上的CPU是STM32F103ZET6,有GPIOA~GPIOG七组IO,每组IO有16个引脚GPIO_Pin_0~GPIO_Pin_15,如板上的PF0~PF15

其中每个IO端口有2个32位的寄存器(GPIOx_CRL和GPIOx_CRH)配置,每个引脚由其中4位进行配置,

4位字段是由一个两位的配置字段和一个两位的模式字段组成

要设置这4位,要看下GPIOx_CRL,GPIOx_CRH的寄存器定义

由上图可以看出GPIOF_CRL的31~28位是设置PF7的,GPIOF_CRL的27~24位是设置PF6的

GPIOF_CRH的3~0位是设置PF8的,GPIOF_CRH的7~4位是设置PF6的

这里我们把每个引脚设置为

CNF[1:0] = 00:通用推挽输出模式

MODE[1:0] = 11 : 输出模式,最大速度50MH

GPIOF_CRL,GPIOF_CRH的寄存器地址分别是0x40011C00,0x40011C04

这个寄存器是怎么得来的,STM32数据手册里并没有直接给出,在《一个内幕者对STM32的介绍》4.1.1 寄存器地址查阅 这里有介绍怎么通过上面的偏移地址算出。

配置好,我们就可以直接在端口输出数据寄存器GPIOF_ODR输出高电平控制LED了,GPIOF_ODR有16位,每个位对应GPF的一个引脚,PF0~PF15

下面就可以编写LED流水灯程序了,激动啊,等了好久终于等到今天

/* main.c */

#define GPIOF_CRL (*(volatile unsigned int *)0x40011C00) //端口配置低寄存器

#define GPIOF_CRH (*(volatile unsigned int *)0x40011C04) //端口配置高寄存器

#define GPIOF_ODR (*(volatile unsigned int *)0x40011C0C) //端口输出数据寄存器

#define RCC_APB2ENR (*(volatile unsigned int *)0x40021018) //

void delay(void)

{

unsigned int i;

for(i=0;i500000;i++);

}

int main()

{

int i;

RCC_APB2ENR |= 17; //打开GPIOF的时钟

GPIOF_CRL = ( GPIOF_CRL 0x00ffffff ) | 0x33000000; //配置PF6,PF7为通用推挽输出模式,最大速度50MH

GPIOF_CRH = ( GPIOF_CRH 0xffffff00 ) | 0x00000033; //配置PF8,PF9为通用推挽输出模式,最大速度50MH

while(1)

{

for(i=6;i=9;i++)

{

GPIOF_ODR = ( GPIOF_ODR 0xfffffc3f ) | ( 1i ); //在PF6~PF9引脚轮流输出高电平

delay();

}

}

}



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有