0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >LED应用 > 基于stm32的流水灯程序设计方案

基于stm32的流水灯程序设计方案

来源: 21ic
2021-11-25
类别:LED应用
eye 21
文章创建人 拍明

原标题:基于stm32的流水灯程序设计方案

  首先,必须明白流水灯的硬件原理,以下是原理图:

  

stm32流水灯程序


  它由8个管脚控制,因此首先必须进行初始化8个引脚。

  //初始化PE8...PE15为输出口.并使能这八个口的时钟

  //LED IO初始化

  void LED_Init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //LED1-->PE.8 ... LED8-->PE.15 端口配置

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

  GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOE

  GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PE.8 输出低

  }

  这样就实现了流水灯管脚初始化的操作,剩下的操作只需要在主函数中进行相应的调用操作即可完成。

  为了使程序更加完美,加入了蜂鸣器的初始化,流水灯亮的同时蜂鸣器响。

  //初始化PB5为输出口.并使能这个口的时钟

  //蜂鸣器初始化

  void BEEP_Init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //BEEP-->PB.5 端口配置

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHz

  GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化GPIOB.5

  GPIO_ResetBits(GPIOB,GPIO_Pin_5); //输出0,关闭蜂鸣器输出

  }

  在流水灯操作中还有一个很关键的步骤,要想实现精确的延时,哪就要自己编写延时函数。延时有微妙、毫秒延时,可分别按自己的需求进行编写。

  //初始化延迟函数

  //SYSTICK的时钟固定为HCLK时钟的1/8

  //SYSCLK:系统时钟

  void delay_init()

  {

  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8

  fac_us=SystemCoreClock/8000000; //为系统时钟的1/8

  fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数

  }

  毫秒函数初始化

  //延时nms

  //注意nms的范围

  //SysTick->LOAD为24位寄存器,所以,最大延时为:

  //nms<=0xffffff*8*1000/SYSCLK

  //SYSCLK单位为Hz,nms单位为ms

  //对72M条件下,nms<=1864

  void delay_ms(u16 nms)

  {

  u32 temp;

  SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

  SysTick->VAL =0x00; //清空计数器

  SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数

  do

  {

  temp=SysTick->CTRL;

  }

  while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

  SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器

  SysTick->VAL =0X00; //清空计数器

  }

  在主函数中进行调用和初始化操作

  主函数的调用

  #include "stm32f10x.h"

  #include "led.h"

  #include "beep.h"

  #include "delay.h"

  #include "sys.h"

  int main(void)

  {

  delay_init(); //延时函数初始化

  LED_Init(); //LED端口初始化

  BEEP_Init(); //初始化蜂鸣器端口

  while(1)

  {

  LED1 = LEDON;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  BEEP = 1;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDON;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  BEEP = BEEPOFF;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDON;

  LED4 = LEDOFF;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDON;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  LED5 = LEDON;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  LED5 = LEDOFF;

  LED6 = LEDON;

  LED7 = LEDOFF;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDON;

  LED8 = LEDOFF;

  delay_ms(100);

  LED1 = LEDOFF;

  LED2 = LEDOFF;

  LED3 = LEDOFF;

  LED4 = LEDOFF;

  LED5 = LEDOFF;

  LED6 = LEDOFF;

  LED7 = LEDOFF;

  LED8 = LEDON;

  delay_ms(100);

  }

  }

  主函数中写的其实是最简单理解的程序,也是很多初学者很容易编写出的程序。原理是依次让每个灯亮,每个灯之间添加延时函数,以实现流水的效果,具体延时多少看自己的个人爱好,想让它变化多快在延时函数里面实现。

  一下是实验的最终结果。其实还很好看。(在以后做东西的时候可以将流水灯加上去,效果很好看的,比如加在小车上,或者四轴飞行器上,这样的话看起来挺酷的!)

  一切都得从最基础开始,小的实验室为了以后做更大项目。

  

stm32流水灯程序


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: stm32 流水灯

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案