基于STM32单片机流水灯仿真与程序设计
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个部分:
- 保护二极管及上、下拉电阻:保护二级管可以防止引脚外部过高或过低的电压输入
- P-MOS 管和N-MOS 管:控制推挽输出和开漏输出
- 输出数据寄存器:由输出数据寄存器GPIOX_ODR
- 复用功能输出:STM32 的其它片上外设对GPIO 引脚进行控制
- 输入数据寄存器:存储输入数据寄存器GPIOx_IDR
- 复用功能输入:GPIO 引脚的信号传输到STM32 其它片上外设
- 模拟输入输出:用于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;
稍加整理可以大致归类为以下三类:
- 输入模式(模拟/浮空/上拉/下拉)
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR
读取I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉
输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外
部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于ADC 采集。
- 输出模式(推挽/开漏)
在输出模式中,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器GPIOx_ODR
可控制I/O 输出高低电平。开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O
输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz 的选项。此处的输出速
度即I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求
不严格,把速度设置成最大即可。
在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR
可读取I/O 的实际状态。
- 复用功能(推挽/开漏)
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出
信号源于其它外设,输出数据寄存器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高位以上的管脚要是用到其他功能,,可能会出问题
参考文献
- STM32+Proteus中仿真串口的经验
- Proteus8.6 仿真STM32F103的例子
- Proteus8.8仿真stm32f401实现串口通信
- Proteus 8.6如何仿真STM32
- Proteus Pro 8.8 SP1 免费安装版
- 安装 proteus 8.9 SP2
基于STM32单片机流水灯仿真与程序设计相关推荐
- 基于stm32的流水灯实现
一.开发环境介绍 主控芯片: 正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看 ...
- 【原创】基于ARM的流水灯仿真示例
本设计使用的仿真工具是Proteus 7.4,IDE是ADS 1.2,芯片是LPC2134 在Proteus中的电路图如下图所示: 本设计使用的是周立功的LPC2131的工程模板.LPC2131的RA ...
- 单片机流水灯仿真实验
一.首先先下载proteus8 (其他的版本也可以) 然后打开proteus: 然后点击funish即可出现一下图片内容: 二.拖出元器件 并且将元器件摆放完整 然后打开keil软件 将一下代码生成H ...
- 基于STM32单片机的电子秤仿真设计
硬件设计 (末尾附文件) 代码设计 HX711: #include "bsp_hx711.h" #include "bsp_delay.h"#define CL ...
- 基于STM32单片机的密码锁(Proteus仿真、程序)
基于STM32单片机的密码锁 功能描述: 由STM32F103单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块 1.采用STM32F103为主控芯片 2.通过4*4矩阵键盘 ...
- 基于STM32单片机的密码锁(Proteus仿真+程序+报告)
3-基于STM32单片机的密码锁 功能描述如下: 由STM32F103单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块: 1.采用STM32F103为主控芯片. 2.通过4 ...
- 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)
编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...
- 基于STM32单片机的水质监测系统(Proteus仿真+程序)
编号:14 基于STM32单片机的水质监测系统 功能描述: 14.基于STM32单片机的水质监测系统 本设计由STM32F103单片机最小系统+AMPIRE12864液晶显示模块+两路A/D转换模块组 ...
- 基于STM32单片机的智能手环设计(OLED显示)(Proteus仿真+程序+报告)
编号8 基于STM32单片机的智能手环设计(OLED显示) 功能描述: 由 STM32单片机+按键模拟计步+RTC时钟模块+DS18B20温度传感器模块+心率采集模块+串口模块+OLED显示模块+键盘 ...
最新文章
- 6个让比特币现金保持匿名性的最佳方法
- 【Tools】Windows安装CMake工具
- 代码chaid_[转载]经典决策树之SAS实现--CHAID
- 异常信息_一个针对异常信息通知的springboot starter
- 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
- vscode eslint 格式化完之后,一个标签多行,看的头疼
- vmware ubuntu 16.04 guest 修复不能桌面大小自动调整和从宿主机复制粘贴的问题
- 编程之美(The beauty of programming)
- 换IP软件用户如何选择?
- 2021高考厦门科技中学成绩查询,2021年厦门重点高中名单及排名,厦门高中高考成绩排名榜...
- 在线有道词典,又添新特色了!
- java电池soc算法实现,电池SOC高精度估算算法
- platform驱动和pci驱动的区别
- TesterHome创始人思寒:如何从手工测试进阶自动化测试?十余年经验分享
- 11种QQ技术 ,让你成为QQ高手
- Linux的文件特殊权限
- 如画的水乡,如画的同里16
- 听着熟悉的《东风破》,好想你~
- EL表达式写三目运算
- 国内终端安全防护市场报告发布 360网神排行第一