Stm32f103c8t6(proteus仿真)学习——1.点亮LED流水灯

该教程介绍了如何使用keiluVision5和Proteus8.15进行STM32项目开发,从原理图绘制到代码编写,再到程序仿真。步骤包括新建工程、LED灯的代码实现、生成.hex文件并上传至Proteus进行仿真运行。此外,还展示了点亮一排LED灯和流水灯的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件准备:keil uVsion 5 和 proteus 8.15
在这里插入图片描述

一、原理图的绘制

打开proteus8.15 -> 新建项目 -> 改名 -> 一直next
鼠标右键 -> 放置 -> 元件 -> From Libraries
在这里插入图片描述
搜索Stm32 -> 选择stm32f103c8(如果没有找到,是因为版本太低,版本要大于8.15)
在这里插入图片描述
画出点亮一个LED灯的原理图
在这里插入图片描述

提示,各元器件搜索:
主控芯片:stm32
电阻:res
LED灯:led
鼠标右键 -> 放置 -> 元件 -> From Libraries
在这里插入图片描述
地和VCC 在左侧工具栏
在这里插入图片描述
注意:这里的LED分为高电平导通和低电平导通,主要区分方式看二极管的方向(正负),我们知道二极管有单向导通性,只有当二极管正极接高电平、负极接低电平时,且高低电平至少>二极管导通电压(约0.7V)时,二极管才会导通。
我们可以通过改变LED的方向和选择接地或者VCC,进而选择LED是高电平导通还是低电平导通。
在这里插入图片描述

二、代码的编写

1.新建一个工程模板

这里采用正点原子提供的工程模板
复制工程模板,改名为1.点亮一个LED灯
在这里插入图片描述

2.打开新建的项目

在项目文件夹 -> USER下的.uvprojx
在这里插入图片描述
点击即可通过keil_v5打开

3.点亮一个LED灯代码

led.c文件的内容

#include "led.h" 
void LED_Init(void)  //LED初始化函数
{
	//声明一个结构体,名字是GPIO_InitStructure
	GPIO_InitTypeDef GPIO_InitStructure;
	//使能GPIOA的时钟,ENABLE代表使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA
	//设置引脚为推挽输出Out_PP
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	//定义引脚为哪一号引脚,GPIO_Pin_1就是1号引脚
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2; 
	 //设置引脚的速度50MHz
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	 //初始化GPIO,初始化哪个引脚就对应哪个
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA,所以引脚对应PA1和PA2
	GPIO_ResetBits(GPIOA,GPIO_Pin_1); //因为LED1是高电平导通,所以要初始化为低电平,防止他一直亮
	GPIO_SetBits(GPIOA,GPIO_Pin_2); //同理,LED2是低电平导通,所以要初始化为高电平
}
void Led1_Open(void){ //LED1打开函数,具体效果可以自己修改
  GPIO_SetBits(GPIOA,GPIO_Pin_1);  //高电平导通
	delay_ms(500);      //延时500ms
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);  //关闭
	delay_ms(500);  //延时500ms
}
void Led2_Open(void){//LED2打开函数,具体效果可以自己修改
	GPIO_SetBits(GPIOA,GPIO_Pin_2); //低电平导通
	delay_ms(500);  //延时500ms
	GPIO_ResetBits(GPIOA,GPIO_Pin_2); //关闭
	delay_ms(500); //延时500ms
}
GPIO_SetBits(GPIOC,GPIO_Pin_1); 设置PC1为高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_1); 设置PC1为低电平

led.h头文件的内容

#ifndef __LED_H   //如果未定义头文件LED_H
#define __LED_H   //则,定义头文件LED_H

#include "stm32f10x.h"
#include "delay.h"
//函数声明(只有声明过的函数才能正常使用)
void Led_Init(void);
void Led1_Open(void);
void Led2_Open(void);

#endif  //结束

main.c的内容

#include "stm32f10x.h"
#include  "led.h"
#include "delay.h"

int main(void)
{ 
	delay_init();
	Led_Init();	 //LED初始化	
	while(1){  //LED1和LED2来回闪烁
	  Led1_Open();
	  Led2_Open();
	}
}

4.设置生成.hex文件

魔术棒-> Output -> 勾选Create HEX File -> ok
在这里插入图片描述
编译运行代码
在这里插入图片描述
0错误,0警告
在这里插入图片描述

5.上传.hex文件到proteus

打开proteus
双击芯片->选择Program File的路径
在这里插入图片描述
选择刚刚生成的.hex文件打开
在这里插入图片描述

6.仿真运行

点击左下角运行
在这里插入图片描述
需要暂停运行也是在左下角
注意:只有停止运行才能修改原理图
在这里插入图片描述

三、更多功能的实现

1.点亮一排LED灯

在这里插入图片描述
led.c文件新增几个引脚
led.c文件的内容:

#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//GPIOC
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	 //PC13、PC14、PC15引脚拉高电平
	GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}

led.h头文件内容不变
main.c文件:(三个灯一起亮、一起灭)

#include "stm32f10x.h"
#include  "led.h"
#include "delay.h"
int main(void)
{ 
	delay_init();
	LED_Init();		
	while(1){  //效果是三个灯一起亮、一起灭
		GPIO_ResetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
		delay_ms(500);
		//上面x|x|x 和下面分开写的效果是一样的
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		GPIO_SetBits(GPIOC,GPIO_Pin_14);
		GPIO_SetBits(GPIOC,GPIO_Pin_15);
		delay_ms(500);
		}
}

在这里插入图片描述

2.点亮流水灯

main.c文件:(流水灯)

#include "stm32f10x.h"
#include  "led.h"
#include "delay.h"
int main(void)
{ 
	delay_init();
	LED_Init();		
	while(1){  //效果是三个灯轮流亮(流水灯)
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		delay_ms(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		GPIO_ResetBits(GPIOC,GPIO_Pin_14);
		delay_ms(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_14);
		GPIO_ResetBits(GPIOC,GPIO_Pin_15);
		delay_ms(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_15);
		}
}

在这里插入图片描述

四、项目(代码+仿真)分享链接

wx公众号“鹏哥嵌入式”,回复:“STM-01” 获取。

### 关于Proteus中使用STM32实现点亮LED的功能配置 在Proteus中使用STM32实现点亮LED功能,通常涉及硬件设计与软件编程两个部分。以下是相关内容的详细介绍: #### 硬件设计部分 在Proteus中搭建电路时,需完成以下设置: - 添加STM32微控制器至原理图,并连接电源和地线。 - 将LED的一端通过限流电阻接到STM32的一个GPIO引脚上,另一端接地[^1]。 #### 软件开发环境准备 为了使STM32能够正常工作并控制外部设备,在Keil环境中编写程序前需要做好如下准备工作: - 创建一个新的工程文件(.uvprojx),并将目标芯片型号设定为具体的STM32系列型号。 - 编写初始化代码来配置所需的外设模块,比如定时器等资源用于延时处理以便观察LED状态变化效果明显[^2]。 #### 示例代码展示 下面给出一段简单的C语言源码用来演示如何利用TIM3作为基础时间基准去周期性的改变PA5口电平从而达到闪烁目的: ```c #include "stm32f10x.h" void TIM3_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); //开启TIM3时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 999; /* 自动重装载值 */ TIM_TimeBaseStructure.TIM_Prescaler = 7199; /* 预分频系数 */ TIM_TimeBaseStructure.TIM_ClockDivision = 0; /* 时钟分割:TDTS=CK_INT */ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;/* 向上计数模式 */ TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );//允许更新中断 } int main(){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO , ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_Init(GPIOA,&GPIO_InitStructure ); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM3_Init(); TIM_Cmd(TIM3,ENABLE); while(1){}; } ``` 当上述程序编译完成后将其下载到实际运行平台或者虚拟仿真环境下即可看到预期的结果即每隔一段时间就会切换一次指定引脚上的逻辑信号高低使得相连的小型发光二极管呈现明暗交替的现象。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值