找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3817|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32液位檢測系統(tǒng)程序(含原理圖)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:954677 發(fā)表于 2021-7-21 12:58 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
電路原理圖如下:


STM32單片機(jī)源程序如下:
#include "main.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

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

#include "OLED_NEW.H"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

#define LED0(a) if(a){HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);}
#define LED1(a) if(a){HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);}
#define BEEP(a) if(a){HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET);}
#define Trig(a) if(a){HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);}
#define IN1(a) if(a){HAL_GPIO_WritePin(IN1_GPIO_Port,IN1_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(IN1_GPIO_Port,IN1_Pin,GPIO_PIN_RESET);}
#define IN2(a) if(a){HAL_GPIO_WritePin(IN2_GPIO_Port,IN2_Pin,GPIO_PIN_SET);}\
                                                                        else{HAL_GPIO_WritePin(IN2_GPIO_Port,IN2_Pin,GPIO_PIN_RESET);}
#define k1 HAL_GPIO_ReadPin(K1_GPIO_Port,K1_Pin)
#define k2 HAL_GPIO_ReadPin(K2_GPIO_Port,K2_Pin)
#define k3 HAL_GPIO_ReadPin(K3_GPIO_Port,K3_Pin)
                                                                        
#define level_Reservoir 145   //水庫高度

/* USER CODE END PD */

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

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

uint8_t key_bz,mode,ms_20,state,state_bz;
uint8_t value_set,value_H,value_L,uart_buf[2];
uint16_t value_level;

/* USER CODE END PV */

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

void key()//按鍵程序
{
        if(k1==1 && k2==1 && k3==1){key_bz=1;}
        
        if(k1==0 && key_bz==1)//K1按下,切換設(shè)置參數(shù)
        {
                key_bz=0;mode++;
                if(mode>=4){mode=0;}
                switch(mode)
                {
                        case 0:
                                OLED_ShowChar(7*8,2,' ');
                                OLED_ShowChar(7*8,4,' ');
                                OLED_ShowChar(7*8,6,' ');
                                break;
                        case 1:
                                OLED_ShowChar(7*8,2,'*');
                                OLED_ShowChar(7*8,4,' ');
                                OLED_ShowChar(7*8,6,' ');
                                break;
                        case 2:
                                OLED_ShowChar(7*8,2,' ');
                                OLED_ShowChar(7*8,4,'*');
                                OLED_ShowChar(7*8,6,' ');                                
                                break;        
                        case 3:
                                OLED_ShowChar(7*8,2,' ');
                                OLED_ShowChar(7*8,4,' ');
                                OLED_ShowChar(7*8,6,'*');                                                
                                break;
                }
        }
        
        if(k2==0 && key_bz==1)//K2按下,參數(shù)加
        {
                key_bz=0;
                if(mode == 0)
                {
                        mode=4;state_bz=1;
                }
                if(mode == 1)
                {
                        value_set++;
                        if(value_set > 9){value_set=2;}
                }
                else if(mode == 2)
                {
                        value_H++;
                        if(value_H > 9){value_H=2;}
                }
                else if(mode == 3)
                {
                        value_L++;
                        if(value_L > 9){value_L=2;}
                }
        }
        
        if(k3==0 && key_bz==1)//K3按下,參數(shù)減
        {
                key_bz=0;
                if(mode == 1)
                {
                        value_set--;
                        if(value_set >= 17){value_set=9;}
                }
                else if(mode == 2)
                {
                        value_H--;
                        if(value_H >=17){value_H=9;}
                }
                else if(mode == 3)
                {
                        value_L--;
                        if(value_L >= 17){value_L=9;}
                }
        }
}

void Control_Motor(uint8_t way)//控制水泵的方式
{
        switch(way)
        {
                case 0://電機(jī)停止
                        IN1(0);IN2(0);
                        LED0(1);LED1(1);
                        break;
                case 1://抽水
                        IN1(1);IN2(0);
                        LED0(0);LED1(1);
                        break;
                case 2://補(bǔ)水
                        IN1(0);IN2(1);
                        LED0(1);LED1(0);
                        break;
        }
}

void Uart_Send(uint8_t dat)//串口發(fā)送
{
        HAL_UART_Transmit(&huart1,&dat,1,999);
}

/* USER CODE END PFP */

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

/* 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_DMA_Init();
  MX_TIM1_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */

        HAL_TIM_Base_Start(&htim1);
        HAL_TIM_Base_Start_IT(&htim2);
        HAL_UART_Receive_DMA(&huart1,uart_buf,2);
        OLED_Init();
        OLED_Clear();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
        
        BEEP(0);
        OLED_ShowCHinese(0,0,"水位");OLED_ShowChar(4*8,0,':');
        OLED_ShowCHinese(0,2,"設(shè)置");OLED_ShowChar(4*8,2,':');
        OLED_ShowCHinese(0,4,"上限");OLED_ShowChar(4*8,4,':');
        OLED_ShowCHinese(0,6,"下限");OLED_ShowChar(4*8,6,':');
        
        value_set=6;value_L=2;value_H=8;
        
  while (1)
  {
                key();
                Control_Motor(state);//0停止    1抽水    2補(bǔ)水
                if(ms_20 == 1)
                {
                        ms_20=0;
                        Trig(1);
                        HAL_Delay(1);
                        Trig(0);
                }
                OLED_ShowChar(5*8,0,value_level/100%10 + 0x30);
                OLED_ShowChar(6*8,0,value_level/10%10 + 0x30);//顯示液位
                OLED_ShowChar(7*8,0,'.');
                OLED_ShowChar(8*8,0,value_level%10 + 0x30);
               
                Uart_Send(value_level/100%10 + 0x30);//串口發(fā)送液位值
                Uart_Send(value_level/10%10 + 0x30);
                Uart_Send(value_level%10 + 0x30);
                Uart_Send('\r');
                Uart_Send('\n');
               
                if(value_level>=(value_H*10) || value_level<=(value_L*10)){BEEP(1);}
                else{BEEP(0);}
               
                OLED_ShowChar(5*8,2,value_set/10 + 0x30);//顯示  設(shè)置  值
                OLED_ShowChar(6*8,2,value_set%10 + 0x30);

                OLED_ShowChar(5*8,4,value_H/10 + 0x30);//顯示  設(shè)置  值
                OLED_ShowChar(6*8,4,value_H%10 + 0x30);

                OLED_ShowChar(5*8,6,value_L/10 + 0x30);//顯示  設(shè)置  值
                OLED_ShowChar(6*8,6,value_L%10 + 0x30);
               
                if(mode == 4)
                {
                        if(state_bz == 1)
                        {
                                if(value_level > (value_set*10)){state=2;state_bz=2;}//大于設(shè)置值,抽水
                                else if(value_level < (value_set*10)){state=1;state_bz=3;}//小于設(shè)置值補(bǔ)水
                        }
                        if(state_bz == 2)
                        {
                                if(value_level <= (value_set*10)){mode=0;state=0;}
                        }
                        if(state_bz == 3)
                        {
                                if(value_level >= (value_set*10)){mode=0;state=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};

  /**Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /**Initializes the CPU, AHB and APB busses 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();
  }
}

/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//外部中斷 中斷回調(diào)函數(shù)
{
        if(GPIO_Pin == GPIO_PIN_11)
        {
                TIM1->CNT = 0;
                while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) == 1);
                value_level = TIM1->CNT*0.34/2;//計算液面與傳感器距離
                if(value_level <= value_level){value_level = level_Reservoir - value_level;}//計算液位距離
                else{value_level = 0;}
        }
}

uint16_t time;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器中斷回調(diào)函數(shù)
{
        if(htim == &htim2)
        {
                time++;
                if(time >= 500){time=0;ms_20=1;}
        }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口回調(diào)函數(shù)
{
        if(uart_buf[0] == 'S'){value_set = uart_buf[1]-0x30;}
        else if(uart_buf[0] == 'H'){value_H = uart_buf[1]-0x30;}
        else if(uart_buf[0] == 'L'){value_L = uart_buf[1]-0x30;}
        else if(uart_buf[0] == 'Z'){state_bz=1;mode=4;}
}

/* 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 */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT

全部代碼51hei附件下載:
KEIL5_LEVEL.7z (2.96 MB, 下載次數(shù): 38)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:274187 發(fā)表于 2021-7-21 16:07 | 只看該作者
液位傳感器走的是串口是嗎?
回復(fù)

使用道具 舉報

板凳
ID:971154 發(fā)表于 2021-12-2 09:38 | 只看該作者
樓主好,液位檢測讀的是某個pin腳的PWM的值嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表