欢迎光临
我们一直在努力

【mcu-1244】基于STM32单片机智能垂钓伞的设计【单片机毕业设计项目参考】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

一、功能介绍

项目名:基于STM32单片机智能垂钓伞的设计
项目编号:dz-1244
单片机类型:STM32F103C8T6
具体功能:
1、通过扫码枪进行付费,每扫一次时间+1小时(可通过按键修改时间),付费完成后开始倒计时,倒计时到达语音提醒“你购买的垂钓时间到达,如需继续垂钓,请重新付款,如果结束垂钓请携带好随身物品离场”。
2、通过DS18B20监测当前环境的温度,监测到温度大于最大值自动打开风扇,否则关闭风扇(付费才可启动)
3、通过光照监测模块监测当前环境的光照强度,监测到光照小于最小值自动打开照明灯(付费才可启动)
4、通过紫外线监测模块监测当前的紫外线强度,监测到紫外线大于最大值自动打开伞进行防晒(付费才可启动)
5、通过雨量监测模块,监测到当前下雨,自动打开伞(付费才可启动)
5、通过OLED显示测量值;
6、通过按键可以设置温度的最大值、按键选择垂钓的时间和价格(初始默认一个小时50元)、光照最小值、紫外线最大值、风扇开关、照明开关、伞的开关。

二、资料总览

实物资料

请添加图片描述

仿真资料

请添加图片描述

三、部分资料展示

1、实物展示

供电接口:TYPE-C
板子类型:PCB集成板,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别芯片会使用贴片式。
在这里插入图片描述

2、仿真展示

仿真软件版本:proteus8.17
电路连线方式:网络标号连线方式
注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样
在这里插入图片描述

3、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
在这里插入图片描述

4、PCB图展示

由原理图导出,两层板,上下覆铜接地。
在这里插入图片描述

5、系统框图

绘制软件:VISIO
在这里插入图片描述

6、软件设计流程

绘制软件:VISIO
在这里插入图片描述

7、部分程序展示

软件版本:keil5

/* USER CODE BEGIN Header */

/**********************************
**********************************/

/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/

/* USER CODE END Header */
/* Includes ——————————————————————*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ———————————————————-*/
/* USER CODE BEGIN Includes */

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#include "./DELAY/delay.h"
#include "./OLED/oled.h"
#include "./KEY/key.h"
#include "./DS18B20/ds18b20.h"
#include "./MOTOR/motor.h"

/* USER CODE END Includes */

/* Private typedef ———————————————————–*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ————————————————————*/
/* USER CODE BEGIN PD */
uint8_t huart_tx_buf[100];
#define Huart1_Send_Str(...) HAL_UART_Transmit(&huart1,huart_tx_buf,sprintf((char *)huart_tx_buf,__VA_ARGS__),0xffff)//重定义串口1发送函数
#define Huart2_Send_Str(...) HAL_UART_Transmit(&huart2,huart_tx_buf,sprintf((char *)huart_tx_buf,__VA_ARGS__),0xffff)//重定义串口1发送函数
#define Huart3_Send_Str(...) HAL_UART_Transmit(&huart3,huart_tx_buf,sprintf((char *)huart_tx_buf,__VA_ARGS__),0xffff)//重定义串口1发送函数

#define BUJIN_SPEED 0//步进电机转速0-10
#define BUJIN_ANGLE 180//步进电机旋转角度
/* USER CODE END PD */

/* Private macro ————————————————————-*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ———————————————————*/

/* USER CODE BEGIN PV */

uint8_t key_num = 0;//按键键值
uint8_t display_num = 0;//显示界面
uint16_t time_num = 0;//计时值
char display_buf[16] = {0};//显示数组

#define HUART2_RX_SIZE1024//串口2接收数组最大值
uint8_t huart2_rx_buf[HUART2_RX_SIZE];//串口2接收数组
uint8_t huart2_rx_finish = 0;//串口2接收完成标志位

_Bool flag_sm = 0; //扫码成功
uint8_t value = 0;//扫码
uint8_t len = 0;//金额

_Bool flag_2s = 0;//5s计时开始标志位
_Bool flag_finish_5s = 0;//5s计时完成标志位

uint8_t relay_select_num = 0;//继电器选择值
uint8_t flag_ff = 0;//付费中
uint8_t flag_bb = 1;//付费结束播报
uint16_t flag_jg = 50;//价格

int32_t time_hour = 1;//单次添加时间时
int32_t time_minute = 0;//单次添加时间分
int32_t time_second = 0; //单次添加时间秒
int32_t time_all = 0; //总时间

float temp_value = 0;//温度值
int8_t temp_max = 40;//温度最大值
int8_t flag_temp = 0;//温度标志位

uint16_t light_value = 0; //光照值
uint16_t light_min = 200;//光照最小值
uint8_t flag_light = 0; //光照标志位

uint16_t ultraviolet_value = 0; //紫外线值
uint16_t ultraviolet_max = 5;//紫外线最大值
uint8_t flag_ultraviolet = 0; //紫外线标志位

_Bool flag_bujin_foreward = 0;//步进电机正转标志位
_Bool flag_bujin_reversal = 0;//步进电机反转标志位
_Bool flag_bujin_state = 0; //步进电机状态标志位
/* USER CODE END PV */

/* Private function prototypes ———————————————–*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

void Key_Function(void);//按键函数
void Monitor_Function(void);//监测函数
void Display_Function(void);//显示函数
void Manage_Function(void);//处理函数

/* USER CODE END PFP */

/* Private user code ———————————————————*/
/* USER CODE BEGIN 0 */

/**********************************
函数名:按键函数
传参值:无
返回值:无
**********************************/

void Key_Function(void)
{
key_num = Chiclet_Keyboard_Scan(0);//按键扫描,获取键值
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1:切换界面
display_num++;
if(display_num >= 8)
{
display_num = 0;
}

Oled_Clear_All(); //清屏
break;

case 2: //按键2
switch(display_num)
{
case 0: //选择继电器
relay_select_num++;
if(relay_select_num >= 4)
{
relay_select_num = 0;
}
break;

case 1://坐下定时总时间时+1
if(time_hour < 23)
{
time_hour++;
}
break;

case 2://坐下定时总时间分+1
time_minute++;
if(time_minute >= 60)
{
time_minute = 0;
}
break;

case 3://坐下定时总时间秒+1
time_second++;
if(time_second >= 60)
{
time_second = 0;
}
break;

case 4: //价格最大值+1
if(flag_jg < 500)
{
flag_jg += 5;
}
break;

case 5: //温度最大值+1
if(temp_max < 99)
{
temp_max++;
}
break;

case 6://光照最小值+10
if(light_min < 500)
{
light_min += 10;
}
break;

case 7://紫外线最大值+1
if(ultraviolet_max < 15)
{
ultraviolet_max ++;
}
break;

default:
break;
}
break;

case 3://按键3
switch(display_num)
{
case 0: //控制对应继电器开关
switch(relay_select_num)
{
case 1: //控制加热继电器
if(flag_ff == 0 || temp_value <= temp_max)
{
RELAY_TF = !RELAY_TF;

flag_temp = 1;
}
break;

case 2: //控制照明继电器
if(flag_ff == 0 || light_value >= light_min)
{
RELAY_BG = !RELAY_BG;

flag_light = 1;
}
break;

case 3: //控制遮阳
if(flag_ff == 0 || (ultraviolet_value <= ultraviolet_max && YSJC == 1))
{
if(flag_bujin_state == 1)
{
flag_bujin_reversal = 1;
}
else
{
flag_bujin_foreward = 1;
}

flag_ultraviolet = 1;
}
break;

default:
break;
}
break;

case 1://坐下定时总时间时-1
if(time_hour > 0)
{
time_hour—;
}
break;

case 2://坐下定时总时间分-1
time_minute—;
if(time_minute < 0)
{
time_minute = 59;
}
break;

case 3://坐下定时总时间秒-1
time_second—;
if(time_second < 0)
{
time_second = 59;
}
break;

case 4: //价格最大值-1
if(flag_jg > 0)
{
flag_jg -= 5;
}
break;

case 5: //温度最大值-1
if(temp_max > 0)
{
temp_max—;
}
break;

case 6://光照最小值-10
if(light_min > 0)
{
light_min -= 10;
}
break;

case 7://紫外线最大值-1
if(ultraviolet_max > 0)
{
ultraviolet_max—;
}
break;

default:
break;
}
break;

default:
break;
}
}
}

/**********************************
函数名:读取指定ADC通道的数据
传参值:通道
返回值:ADC值
**********************************/

uint32_t ADC_Get_Value(uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig;

sConfig.Channel = Channel;
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);

HAL_ADC_Start(&hadc1);//启动转换并等待结束
HAL_ADC_PollForConversion(&hadc1, 10); //等待转换完成,10是超时时间(单位ms)

return HAL_ADC_GetValue(&hadc1);//返回转换后的数据
}

/**********************************
函数名:监测函数
传参值:无
返回值:无
**********************************/

void Monitor_Function(void)
{
if(time_num % 100 == 0)//监测数据
{
temp_value = Ds18b20_Read_Temp();

light_value = 500 – 150 * (ADC_Get_Value(ADC_CHANNEL_0) / 4096.0 * 3.3); //获取光照值

ultraviolet_value = 5.0 * (ADC_Get_Value(ADC_CHANNEL_1) / 4096.0 * 3.3); //获取紫外线值
}

if(huart2_rx_finish == 1)//解析数据,确认付费
{
if(flag_2s == 0)
{

len = strlen((char*)huart2_rx_buf)–1;

if(len >= 16 && len <= 24)
{
sprintf(display_buf,"%c%c",huart2_rx_buf[0],huart2_rx_buf[1]);
value = atoi(display_buf);
if((value >= 25 && value <= 30) || (len == 18 && value >= 10 && value <= 15))
{
flag_sm = 1;
flag_2s = 1;
time_all += time_hour * 3600 + time_minute * 60 + time_second;
}
}
}
else
{
flag_sm = 0;
}

memset(huart2_rx_buf, 0 ,HUART2_RX_SIZE);
huart2_rx_finish = 0;
}
}

/**********************************
函数名:显示函数
传参值:无
返回值:无
**********************************/

void Display_Function(void)
{
if(time_num % 100 == 0)
{
switch(display_num)//根据不同的显示界面,显示不同的内容
{
case 0: //显示测量数据

Oled_ShowCHinese(1, 0, "紫外线:"); //显示紫外线值
sprintf(display_buf, "%d ", ultraviolet_value);
Oled_ShowString(1, 8, display_buf);

Oled_ShowCHinese(2, 0, "光照:"); //显示光照值
sprintf(display_buf, "%dLux ", light_value);
Oled_ShowString(2, 6, display_buf);

Oled_ShowCHinese(3,0,"温度:"); //显示温度
sprintf(display_buf,"%.1fC ",temp_value);
Oled_ShowString(3,6,display_buf);

sprintf(display_buf,"%02d:%02d:%02d",(time_all)/3600,(time_all)%3600/60,(time_all)%60);
Oled_ShowString(4,0,display_buf);

switch(relay_select_num)//显示选择的继电器及状态
{
case 0:
Oled_ShowString(3,12," ");

Oled_ShowString(4,12," ");
break;

case 1: //显示照明继电器状态
Oled_ShowCHinese(3,6,"通风");

if(RELAY_TF == 1)
{
Oled_ShowCHinese(4,6,"打开");
}
else
{
Oled_ShowCHinese(4,6,"关闭");
}
break;

case 2: //显示照明继电器状态
Oled_ShowCHinese(3,6,"照明");

if(RELAY_BG == 1)
{
Oled_ShowCHinese(4,6,"打开");
}
else
{
Oled_ShowCHinese(4,6,"关闭");
}
break;

case 3: //显示照明继电器状态
Oled_ShowCHinese(3,6,"伞");
Oled_ShowString(3,14," ");

if(flag_bujin_state == 1)
{
Oled_ShowCHinese(4,6,"打开");
}
else
{
Oled_ShowCHinese(4,6,"关闭");
}
break;

default:
break;
}

break;

case 1://显示设置定时总时间时
Oled_ShowCHinese(1,1,"设置单次时间");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2,4," ");
}
break;

case 2://显示设置定时总时间分
Oled_ShowCHinese(1,1,"设置单次时间");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2,7," ");
}
break;

case 3://显示设置定时总时间秒
Oled_ShowCHinese(1,1,"设置单次时间");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2,10," ");
}
break;

case 4://显示设置温度最大值
Oled_ShowCHinese(1,1,"设置单次价格");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d ",flag_jg);
Oled_ShowString(2,6,display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2,6," ");
}
break;

case 5://显示设置温度最大值
Oled_ShowCHinese(1,0,"设置温度最大值");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d ",temp_max);
Oled_ShowString(2,6,display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2,6," ");
}
break;

case 6: // 显示设置光照最大值
Oled_ShowCHinese(1, 0, "设置光照最小值");
if(time_num % 20 == 0)
{
sprintf(display_buf, "%d ", light_min);
Oled_ShowString(2, 6, display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2, 6, " ");
}
break;

case 7: // 显示设置紫外线最大值
Oled_ShowCHinese(1, 0, "设置紫外线最大值");
if(time_num % 20 == 0)
{
sprintf(display_buf, "%d ", ultraviolet_max);
Oled_ShowString(2, 6, display_buf);
}
if(time_num % 40 == 0)
{
Oled_ShowString(2, 6, " ");
}
break;

default:
break;
}
}
}

/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/

void Manage_Function(void)
{
if(display_num == 0)//测量界面
{
if(flag_ff == 1)
{
if(temp_value > temp_max) //温度大于最大值,自动控制打开通风进行工作;
{
RELAY_TF = 1;
flag_temp = 0;
}
else //否则通风
{
if(flag_temp == 0)
{
RELAY_TF = 0;
}
}

if(light_value < light_min) //光照值低于设置最小值,控制灯打开
{
RELAY_BG = 1;
flag_light = 0;
}
else
{
if(flag_light == 0)
{
RELAY_BG = 0;
}
}

if(ultraviolet_value > ultraviolet_max || YSJC == 0) //监测到紫外线大于最大值 、监测到当前下雨 自动打开伞进行防晒
{
if(flag_bujin_state == 0)
{
flag_bujin_foreward = 1;
}

flag_ultraviolet = 0;
}
else
{
if(flag_ultraviolet == 0)
{
if(flag_bujin_state == 1)
{
flag_bujin_reversal = 1;
}
}
}

}
else
{
if(flag_temp == 0)
{
RELAY_TF = 0;
}

if(flag_light == 0)
{
RELAY_BG = 0;
}

if(flag_ultraviolet == 0)
{
if(flag_bujin_state == 1)
{
flag_bujin_reversal = 1;
}
}
}

if(time_all <= 0)//倒计时到达语音提醒
{
flag_ff = 0;

if(flag_bb == 0)
{
flag_bb = 1;
Huart3_Send_Str(" 你购买的垂钓时间到达,如需继续垂钓,请重新付款,如果结束垂钓请携带好随身物品离场");
}
}
else
{
flag_ff = 1;
flag_bb = 0;
}

}
else//设置界面
{
RELAY_TF = 0;
RELAY_BG = 0;
if(flag_bujin_state == 1)
{
flag_bujin_reversal = 1;
}
}
}

/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/

int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration——————————————————–*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */

Delay_Init();//延时初始化
Oled_Init();//OLED初始化
Key_Init();//KEY初始化
Ds18b20_Init(); //DS18B20初始化
Motor_Init();//电机初始化

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */

Oled_Clear_All();//清屏

HAL_TIM_Base_Start_IT(&htim3);//启动定时器3
HAL_UARTEx_ReceiveToIdle_IT(&huart2, huart2_rx_buf, HUART2_RX_SIZE);//获取串口2接收数据

Oled_ShowString(1,4,"DS18B20");//DS18B20温度传感器初始化
Oled_ShowCHinese(2,2,"初始化中");
temp_value = Ds18b20_Read_Temp();
Delay_ms(1000);
temp_value = Ds18b20_Read_Temp();
Delay_ms(1000);
Oled_Clear_All();

while (1)
{
Key_Function(); //按键函数
Monitor_Function();//监测函数
Display_Function();//显示函数
Manage_Function();//处理函数

if(time_num % 100 == 0)//指示灯闪烁
{
SYSTEM_LED = !SYSTEM_LED;
}

Delay_ms(1);//延时1ms
time_num++; //计时值+1
if(time_num >= 10000)
{
time_num = 0;
}

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

/**
* @brief System Clock Configuration
* @retval None
*/

void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}

/* USER CODE BEGIN 4 */

/**********************************
函数名:定时器中断回调函数
传参值:无
返回值:无
**********************************/

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t timer0_count;
static uint32_t timer0_count1;
static uint8_t motor_bujin_count = 0;//步进电机计时值
static uint16_t motor_bujin = 0;//步进电机步数值

if(htim->Instance == htim3.Instance)//定时器3触发中断
{
if(time_all > 0 && display_num == 0)
{
timer0_count++;
if(timer0_count >= 1000)
{
if(time_all > 0 )
{
time_all—;
}

timer0_count = 0;
}
}
else
{
timer0_count = 0;
}

if(flag_2s == 1)
{
timer0_count1++;
if(timer0_count1 >= 2000)
{
flag_2s = 0;
timer0_count1 = 0;
}
}
else
{
timer0_count1 = 0;
}

switch(motor_bujin % 8)//步进电机八步解析
{
case 0:BUJIN_A=1; BUJIN_B=0; BUJIN_C=0; BUJIN_D=1; break;
case 1:BUJIN_A=0; BUJIN_B=0; BUJIN_C=0; BUJIN_D=1; break;
case 2:BUJIN_A=0; BUJIN_B=0; BUJIN_C=1; BUJIN_D=1; break;
case 3:BUJIN_A=0; BUJIN_B=0; BUJIN_C=1; BUJIN_D=0; break;
case 4:BUJIN_A=0; BUJIN_B=1; BUJIN_C=1; BUJIN_D=0; break;
case 5:BUJIN_A=0; BUJIN_B=1; BUJIN_C=0; BUJIN_D=0; break;
case 6:BUJIN_A=1; BUJIN_B=1; BUJIN_C=0; BUJIN_D=0; break;
case 7:BUJIN_A=1; BUJIN_B=0; BUJIN_C=0; BUJIN_D=0; break;
}

if(flag_bujin_foreward == 1)//步进电机正转过程
{
motor_bujin_count++;
if(motor_bujin_count > BUJIN_SPEED)
{
motor_bujin_count = 0;
if(motor_bujin < (BUJIN_ANGLE/180.0*256) * 8)
motor_bujin++;
else
{
flag_bujin_foreward = 0;
flag_bujin_state = 1;
}
}
}
else if(flag_bujin_reversal == 1)//步进电机反转过程
{
motor_bujin_count++;
if(motor_bujin_count > BUJIN_SPEED)
{
motor_bujin_count = 0;
if(motor_bujin > 0)
motor_bujin—;
else
{
flag_bujin_reversal = 0;
flag_bujin_state = 0;
}
}
}
else//步进电机停止
{
motor_bujin_count = 0;
BUJIN_A=0; BUJIN_B=0; BUJIN_C=0; BUJIN_D=0;
}
}
}

/**********************************
函数名:串口事件回调函数
传参值:huart:串口号Size:数据大小
返回值:无
**********************************/

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == huart2.Instance)//串口2触发中断
{
HAL_UARTEx_ReceiveToIdle_IT(&huart2, huart2_rx_buf, HUART2_RX_SIZE);
huart2_rx_finish = 1;
}
}

/**********************************
函数名:串口错误回调函数
传参值:串口号
返回值:无
**********************************/

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
HAL_UART_DeInit(huart);
HAL_UART_Init(huart);

if(huart->Instance == huart2.Instance)
{
HAL_UARTEx_ReceiveToIdle_IT(&huart2, huart2_rx_buf, HUART2_RX_SIZE);
}
}

/* USER CODE END 4 */

/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/

void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/

void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\\r\\n", file, line) */

/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

赞(0)
未经允许不得转载:171主机测评 » 【mcu-1244】基于STM32单片机智能垂钓伞的设计【单片机毕业设计项目参考】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址