STM32标准库实现流水灯和Kiel观测GPIO波形仿真

系列文章目录

在实验1的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒

前言

提示:这里可以添加本文要记录的大概内容:

利用stm32标准库点亮流水灯


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建.c和.h文件

先创建文件夹存放.c和.h文件
在这里插入图片描述
点击led文件按右键点击添加文件led.h文件
在这里插入图片描述

相同的步骤创建led.c文件
可以看到创建完成
在这里插入图片描述
点开led.h文件进行编代码

#ifndef led_H
#define led_H
void GPIO_A(void);
#endif

同理点开led.c文件

#include "stm32f10x.h"
#include "led.h"
void GPIO_A(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

编写main.c

#include "stm32f10x.h"   
#include "led.h"
#include "Delay.h"
int main(void)
{
	GPIO_A();
	GPIO_B();
	GPIO_C();
	//GPIO_SetBits(GPIOA,GPIO_Pin_0);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0)
	 //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
	 //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); 
	 while(1)
	 {
		GPIO_SetBits(GPIOA,GPIO_Pin_7);//
		Delay_ms(500);
	  GPIO_ResetBits(GPIOA,GPIO_Pin_7);//
		Delay_ms(500); 
		 GPIO_SetBits(GPIOB,GPIO_Pin_7);//
		Delay_ms(500);
	  GPIO_ResetBits(GPIOB,GPIO_Pin_7);//
		Delay_ms(500); 
		GPIO_SetBits(GPIOC,GPIO_Pin_13);//
		Delay_ms(500);
	  GPIO_ResetBits(GPIOC,GPIO_Pin_13);//
		Delay_ms(500); 
	 } 
}

QQ视频20230924115534

二、使用kiel观察GPIO口波形

配置Debug

点击魔术棒
在这里插入图片描述
这里使用的是STM32f103CT8
在这里插入图片描述
点击如图配置。
配置好
点击Debug进行仿真
在这里插入图片描述
点击左上角set up
在这里插入图片描述
点击右上脚方框添加引脚:输入PORTA.7和PORTC.13(这里是PA口7引脚)然后按回车。选择Bit然后取消
在这里插入图片描述
然后再点击像钥匙那个,在点击旁边那个运行后点击×就显示波形
在这里插入图片描述

总结

本篇介绍了使用标准库函数进行试下流水灯代码,和如何使用kiel进行波形仿真0为高点平1为低电平。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于上述文字的Kiel程序和Proteus仿真: ``` // 定义ADC输入口和PWM输出口 sbit ADC_Pin = P1^0; sbit PWM_Pin = P1^1; // 定义加速计数器和减速计数器 unsigned int acceleration_count = 0; unsigned int deceleration_count = 0; // 定义加速键、减速键和模式切换键 sbit Acceleration_Key = P3^0; sbit Deceleration_Key = P3^1; sbit Mode_Key = P3^2; // 定义手动模式和自动模式的标志位 bit is_manual_mode = 1; // 定义PWM输出的计数器 unsigned int pwm_counter = 0; // 定义PWM输出的周期 const unsigned int PWM_PERIOD = 200; // 定义PWM输出的占空比 unsigned int pwm_duty_cycle = 100; // 定义加速键和减速键的计数器阈值 const unsigned int ACCELERATION_THRESHOLD = 5; const unsigned int DECELERATION_THRESHOLD = 3; // 定义加速和减速的步进值 const unsigned int ACCELERATION_STEP = 10; const unsigned int DECELERATION_STEP = 5; // 定义ADC采样函数 unsigned char ADC_Sample() { unsigned char adc_value; ADC_CONTR = 0x80; // 打开ADC模块 ADC_CONTR |= 0x08; // 开始一次ADC转换 while (!(ADC_CONTR & 0x10)); // 等待ADC转换完成 adc_value = ADC_RES; // 读取ADC转换结果 ADC_CONTR &= ~0x80; // 关闭ADC模块 return adc_value; } // 定义PWM输出函数 void PWM_Output() { if (pwm_counter < pwm_duty_cycle) { PWM_Pin = 1; } else { PWM_Pin = 0; } pwm_counter++; if (pwm_counter == PWM_PERIOD) { pwm_counter = 0; } } void main() { // 初始化ADC模块 ADC_RES = 0; ADC_RESL = 0; ADC_CONTR = 0x88; // 初始化PWM计数器和PWM输出口 TMOD = 0x01; TH0 = 0x3C; TL0 = 0xB0; EA = 1; ET0 = 1; TR0 = 1; // 循环执行 while (1) { // 判断当前是否处于手动模式 if (is_manual_mode) { // 检测加速键和减速键是否按下 if (Acceleration_Key == 0) { acceleration_count++; if (acceleration_count >= ACCELERATION_THRESHOLD) { acceleration_count = 0; pwm_duty_cycle += ACCELERATION_STEP; if (pwm_duty_cycle > PWM_PERIOD) { pwm_duty_cycle = PWM_PERIOD; } } } else { acceleration_count = 0; } if (Deceleration_Key == 0) { deceleration_count++; if (deceleration_count >= DECELERATION_THRESHOLD) { deceleration_count = 0; pwm_duty_cycle -= DECELERATION_STEP; if (pwm_duty_cycle < 0) { pwm_duty_cycle = 0; } } } else { deceleration_count = 0; } } else { // 自动模式下,根据ADC采样值来调整PWM占空比 unsigned char adc_value = ADC_Sample(); pwm_duty_cycle = (unsigned int)adc_value * PWM_PERIOD / 255; } // 判断模式切换键是否按下 if (Mode_Key == 0) { is_manual_mode = !is_manual_mode; while (Mode_Key == 0); // 等待键盘松开 } // 输出PWM信号 PWM_Output(); } } // 定时器0中断服务函数 void Timer0_ISR() interrupt 1 { TH0 = 0x3C; TL0 = 0xB0; } ``` 在Proteus中,需要添加一个C51单片机和一个直流电机模块,并将它们连接起来。在直流电机模块的控制端口处连接一个PWM模块,以控制直流电机的转速。然后,将程序下载到C51单片机中,并进行仿真测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值