使用STM32F103微处理器和八个LED灯、一个按键、异步串口、12864LCD,ⅡIC、直流电机等模块和元器件在Proteus 软件中搭建一个控制系统,实现以下功能: 1、一键长按系统启动/关闭/启动……循环,系统关闭时所有模块停止工作; 2、系统启动后电机以50%空比转动,短按占空比以50%-100%-0%-50% 中;
时间: 2024-02-05 20:04:14 浏览: 91
很抱歉,我无法在Proteus软件中为您搭建一个完整的控制系统,因为我只是一个语言模型AI。但是,我可以为您提供一些基本的思路和实现方法,以帮助您完成该任务。
首先需要明确的是,该系统需要使用STM32F103微处理器来控制各种硬件模块的工作。因此,需要对STM32F103进行初始化和配置,包括时钟配置、GPIO口配置、中断配置等。
下面是一个简单的示例代码,可以帮助您了解如何初始化STM32F103:
```c
#include "stm32f10x.h"
#include "delay.h"
#define LED_NUM 8
#define LED_PERIOD 1000 // 定时器周期,单位为us
#define LED_DUTY_CYCLE 50 // LED占空比,范围为0~100
int main(void)
{
// 初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// 配置GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_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_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置按键GPIO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置定时器
TIM_TimeBaseInitTypeDef TIM_InitStructure;
TIM_InitStructure.TIM_Period = LED_PERIOD - 1;
TIM_InitStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1;
TIM_InitStructure.TIM_ClockDivision = 0;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
// 配置PWM
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (LED_PERIOD * LED_DUTY_CYCLE) / 100 - 1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
// 配置中断
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 配置USART
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
// 主循环
while (1)
{
// 判断按键是否被按下
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == RESET)
{
// 等待按键释放
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == RESET);
// 切换电机占空比
int duty_cycle = 50;
while (1)
{
// 更新PWM阈值
TIM_OCInitStructure.TIM_Pulse = (LED_PERIOD * duty_cycle) / 100 - 1;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 等待一段时间
delay_ms(500);
// 判断是否需要结束循环
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == RESET)
{
// 等待按键释放
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == RESET);
// 切换电机占空比
duty_cycle += 50;
if (duty_cycle > 100)
{
duty_cycle = 0;
}
}
}
}
}
}
// 中断处理函数
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line8) != RESET)
{
// 切换系统状态
static int system_status = 0;
if (system_status == 0)
{
// 启动系统
GPIO_SetBits(GPIOA, GPIO_Pin_0);
system_status = 1;
}
else
{
// 关闭系统
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
system_status = 0;
}
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line8);
}
}
```
以上代码中,GPIO口配置了八个LED灯和一个按键,其中第一个LED灯用于指示系统状态(亮表示系统已启动,灭表示系统已关闭)。定时器2控制电机的转速,按键用于控制电机的占空比。串口USART2用于与其他设备进行通信,比如LCD显示屏。
在中断处理函数中,判断按键是否被按下,如果被按下则切换电机占空比。在主循环中,判断按键是否被按下,如果被按下则切换系统状态。在系统启动时,电机默认以50%的占空比转动。
阅读全文