久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3781|回復: 2
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:


STM32單片機源程序如下:
#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按下,切換設置參數
        {
                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按下,參數加
        {
                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按下,參數減
        {
                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://電機停止
                        IN1(0);IN2(0);
                        LED0(1);LED1(1);
                        break;
                case 1://抽水
                        IN1(1);IN2(0);
                        LED0(0);LED1(1);
                        break;
                case 2://補水
                        IN1(0);IN2(1);
                        LED0(1);LED1(0);
                        break;
        }
}

void Uart_Send(uint8_t dat)//串口發送
{
        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,"設置");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補水
                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);//串口發送液位值
                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);//顯示  設置  值
                OLED_ShowChar(6*8,2,value_set%10 + 0x30);

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

                OLED_ShowChar(5*8,6,value_L/10 + 0x30);//顯示  設置  值
                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;}//大于設置值,抽水
                                else if(value_level < (value_set*10)){state=1;state_bz=3;}//小于設置值補水
                        }
                        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)//外部中斷 中斷回調函數
{
        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)//定時器中斷回調函數
{
        if(htim == &htim2)
        {
                time++;
                if(time >= 500){time=0;ms_20=1;}
        }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口回調函數
{
        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, 下載次數: 38)

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久无码国产精品一区 | 欧日韩不卡在线视频 | 亚洲高清一区二区三区 | 国产情侣一区 | 一区二区电影网 | 亚洲第一在线 | 国产精品福利在线观看 | 在线看黄免费 | av一级久久 | 91精品国产91综合久久蜜臀 | 国产一区二区欧美 | 天天操天天插天天干 | 欧美成年黄网站色视频 | 奇米四色影视 | 午夜精品久久久久久久久久久久久 | 国产精品久久久 | 亚洲视频欧美视频 | av先锋资源| 免费在线视频一区二区 | 少妇一级淫片免费放播放 | 久久99精品久久久久久 | 二区在线视频 | 久久久久久久一区 | 国产精品一区二区三 | 嫩呦国产一区二区三区av | 成人一级视频在线观看 | 97久久精品午夜一区二区 | 91av国产在线视频 | 亚洲综合色丁香婷婷六月图片 | 精品一区二区在线观看 | 日韩成人影院在线观看 | www.久久国产精品 | 精品视频在线观看 | 中文字幕日韩欧美 | 日韩精品在线看 | 国内自拍视频在线观看 | 久久久久久久久久爱 | 四虎影音 | 黄色片网此 | 又黄又色 | 国产乱码精品一区二区三区中文 |