Stm32f103c8t6(proteus仿真)学习——1.点亮LED流水灯
目录
软件准备: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” 获取。
更多推荐
所有评论(0)