STM32单片机流水灯仿真与程序设计

摘要

本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和熄灭;通过配置8位流水灯程序设计,实现灯的流水实现。

关键字:Proteus、keil、STM32F103、GPIO

一、工程介绍

1.1、实现要求

用STM32一个端口接8个发光二极管,编写程序,实现从左到右轮流点亮8个二极管(即流水灯)

二、仿真电路设计

2.1、环境介绍

仿真采用Proteus 8.9 SP2安装链接

2.2、电路设计

第一步:在Proteus中的[P]选择所需要的零件有电阻RES、LED灯LED-GREEN最后还有单片机STM32F103R6

第二步:放置STM32F103R6单片机并设置VDDA、VSSA管脚以及NRST、VBAT和BOOT0

Design->Configure Power Rails ->Power Rails

第三步:放置八个LED

为什么LED接1K的电阻,这个可以参考链接2.2.2

三、STM32单片机GPIO口介绍

3.1、GPIO框图

GPIO总体分为7个部分:

  1. 保护二极管及上、下拉电阻:保护二级管可以防止引脚外部过高或过低的电压输入
  2. P-MOS 管和N-MOS 管:控制推挽输出和开漏输出
  3. 输出数据寄存器:由输出数据寄存器GPIOX_ODR
  4. 复用功能输出:STM32 的其它片上外设对GPIO 引脚进行控制
  5. 输入数据寄存器:存储输入数据寄存器GPIOx_IDR
  6. 复用功能输入:GPIO 引脚的信号传输到STM32 其它片上外设
  7. 模拟输入输出:用于ADC 采集电压的输入通道

3.2、GPIO工作模式

GPIO 总共有8 种细分的工作模式

 typedef enum{GPIO_Mode_AIN = 0x0,              // 模拟输入GPIO_Mode_IN_FLOATING = 0x04,     // 浮空输入GPIO_Mode_IPD = 0x28,             // 下拉输入GPIO_Mode_IPU = 0x48,             // 上拉输入GPIO_Mode_Out_OD = 0x14,          // 开漏输出GPIO_Mode_Out_PP = 0x10,          // 推挽输出GPIO_Mode_AF_OD = 0x1C,           // 复用开漏输出GPIO_Mode_AF_PP = 0x18            // 复用推挽输出} GPIOMode_TypeDef;

稍加整理可以大致归类为以下三类:

  1. 输入模式(模拟/浮空/上拉/下拉)

在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR
读取I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉
输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外
部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于ADC 采集。

  1. 输出模式(推挽/开漏)

在输出模式中,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器GPIOx_ODR
可控制I/O 输出高低电平。开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O
输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz 的选项。此处的输出速
度即I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求
不严格,把速度设置成最大即可。
在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR
可读取I/O 的实际状态。

  1. 复用功能(推挽/开漏)

复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出
信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器
可获取I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
通过对GPIO 寄存器写入不同的参数,就可以改变GPIO 的工作模式,再强调一下,
要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。
在GPIO 外设中,控制端口高低控制寄存器CRH 和CRL 可以配置每个GPIO 的工作模式和
工作的速度,每4 个位控制一个IO,CRH 控制端口的高八位,CRL 控制端口的低8 位,
具体的看CRH 和CRL 的寄存器描述。

四、程序设计

4.1、环境介绍

程序设计采用MDK 5.22安装链接

4.2、移位程序设计

/******************************************************************************* @brief  Water_LED:流水灯实现******************************************************************************/
void Water_LED(void)
{unsigned  long int time = 0xFFFF;     //设置软件延时时间unsigned char Count = 0x00;           //设置流水起始地址unsigned char Stars = 0xFE;             //设置流水灯初始状态unsigned char Move = 0x01;            //设置移动补偿while((!((Count++)&0x08)))            //循环实现8位流水灯{GPIOC->ODR = Stars;                //改变输出寄存器,改变端口状态while(time--);                     //软件延时高电平持续实现time = 0xFFFF;  GPIOC->ODR = 0xFF;                 //消抖实现Stars = (Stars<<1)|(Move);         //补偿实现 // Stars = 0xFE (1111 1110B)左移一位为(1111 1100B)为了补偿最后一个0 //Stars| Move =(1111 1100B)| 0000 0001B)=(1111 1101B)Move = Move*2;                    //Move = (0000 0010B)Move ++ ;                         //Move = (0000 0011B)while(time--);                    //软件延时低电平持续时间time = 0xFFFF;}
}

4.3、GPIO口设置

/******************************************************************************* @brief  Water_GPIO_Init:流水灯GPIO口初始化******************************************************************************/
void Water_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_OUT_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIO口时钟   GPIO_OUT_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//选择指定管脚GPIO_OUT_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;  //设置开漏输出GPIO_OUT_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //设置输出频率GPIO_Init(GPIOC,&GPIO_OUT_InitStructure);GPIOC->ODR = 0xFF;                                  //初始化后LED全熄灭
}

4.4、主程序设计

int main(void)
{ SysClock_Configuration(RCC_PLLSource_HSI_Div2,RCC_CFGR_PLLMULL3);//设置系统时钟Water_GPIO_Init();                                               //流水灯GPIO口初始化while(1)Water_LED();                                                     //流水灯实现
}

五、结果分析与改进

1、流水程序设计是没有考虑GPIO8~15的状态,所以GPIOC高位以上的管脚要是用到其他功能,,可能会出问题

参考文献

  1. STM32+Proteus中仿真串口的经验
  2. Proteus8.6 仿真STM32F103的例子
  3. Proteus8.8仿真stm32f401实现串口通信
  4. Proteus 8.6如何仿真STM32
  5. Proteus Pro 8.8 SP1 免费安装版
  6. 安装 proteus 8.9 SP2

基于STM32单片机流水灯仿真与程序设计相关推荐

  1. 基于stm32的流水灯实现

    一.开发环境介绍 主控芯片:  正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看 ...

  2. 【原创】基于ARM的流水灯仿真示例

    本设计使用的仿真工具是Proteus 7.4,IDE是ADS 1.2,芯片是LPC2134 在Proteus中的电路图如下图所示: 本设计使用的是周立功的LPC2131的工程模板.LPC2131的RA ...

  3. 单片机流水灯仿真实验

    一.首先先下载proteus8 (其他的版本也可以) 然后打开proteus: 然后点击funish即可出现一下图片内容: 二.拖出元器件 并且将元器件摆放完整 然后打开keil软件 将一下代码生成H ...

  4. 基于STM32单片机的电子秤仿真设计

    硬件设计 (末尾附文件) 代码设计 HX711: #include "bsp_hx711.h" #include "bsp_delay.h"#define CL ...

  5. 基于STM32单片机的密码锁(Proteus仿真、程序)

    基于STM32单片机的密码锁 功能描述: 由STM32F103单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块 1.采用STM32F103为主控芯片 2.通过4*4矩阵键盘 ...

  6. 基于STM32单片机的密码锁(Proteus仿真+程序+报告)

    3-基于STM32单片机的密码锁 功能描述如下: 由STM32F103单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块: 1.采用STM32F103为主控芯片. 2.通过4 ...

  7. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

  8. 基于STM32单片机的水质监测系统(Proteus仿真+程序)

    编号:14 基于STM32单片机的水质监测系统 功能描述: 14.基于STM32单片机的水质监测系统 本设计由STM32F103单片机最小系统+AMPIRE12864液晶显示模块+两路A/D转换模块组 ...

  9. 基于STM32单片机的智能手环设计(OLED显示)(Proteus仿真+程序+报告)

    编号8 基于STM32单片机的智能手环设计(OLED显示) 功能描述: 由 STM32单片机+按键模拟计步+RTC时钟模块+DS18B20温度传感器模块+心率采集模块+串口模块+OLED显示模块+键盘 ...

最新文章

  1. 6个让比特币现金保持匿名性的最佳方法
  2. 【Tools】Windows安装CMake工具
  3. 代码chaid_[转载]经典决策树之SAS实现--CHAID
  4. 异常信息_一个针对异常信息通知的springboot starter
  5. 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
  6. vscode eslint 格式化完之后,一个标签多行,看的头疼
  7. vmware ubuntu 16.04 guest 修复不能桌面大小自动调整和从宿主机复制粘贴的问题
  8. 编程之美(The beauty of programming)
  9. 换IP软件用户如何选择?
  10. 2021高考厦门科技中学成绩查询,2021年厦门重点高中名单及排名,厦门高中高考成绩排名榜...
  11. 在线有道词典,又添新特色了!
  12. java电池soc算法实现,电池SOC高精度估算算法
  13. platform驱动和pci驱动的区别
  14. TesterHome创始人思寒:如何从手工测试进阶自动化测试?十余年经验分享
  15. 11种QQ技术 ,让你成为QQ高手
  16. Linux的文件特殊权限
  17. 如画的水乡,如画的同里16
  18. 听着熟悉的《东风破》,好想你~
  19. EL表达式写三目运算
  20. 国内终端安全防护市场报告发布 360网神排行第一

热门文章

  1. C++中的结构体与类
  2. Halcon实战记录之三《模板制作--两点定位》
  3. Android显示系统分析
  4. 电脑远程控制,win7远程控制电脑_Win7系统怎么远程控制别人的电脑
  5. iOS 填坑之 WKWebView字体自适应
  6. 1bit和1byte_bit与字节Byte的区别和联系
  7. 论文查重后会不会被泄露?
  8. nginx 正反向代理
  9. Intel汇编-内联汇编使用处理跳转
  10. 【Docker】使用docker安装部署NextCloud私人网盘