冰楓論壇

標題: STM8S105K4智能水族箱 [打印本頁]

作者: 洪嵐峰    時間: 2023-4-4 06:12
標題: STM8S105K4智能水族箱
包括水循環、溫度控制、誤操作提示、遠程控制、數據記錄、人機交互等功能的實現。

零件清單:

STM8S105K4微控制器
16x2字符LCD顯示器
溫度傳感器
水泵
水位傳感器
水箱加熱器
時鐘芯片
遙控器
蜂鳴器
按鈕開關
LED燈
程序代碼:
#include <iostm8s105k4.h>

#define PUMP_PIN            PA1   //水泵引腳
#define HEATER_PIN          PA2   //水箱加熱器引腳
#define TEMP_SENSOR_PIN     PC3   //溫度傳感器引腳
#define WATER_SENSOR_PIN    PC4   //水位傳感器引腳
#define LCD_RS_PIN          PC5   //LCD顯示器RS引腳
#define LCD_RW_PIN          PD2   //LCD顯示器RW引腳
#define LCD_EN_PIN          PD3   //LCD顯示器EN引腳
#define LCD_DATA_PORT       PD    //LCD顯示器數據口引腳
#define REMOTE_PIN          PD4   //遙控器接收器引腳
#define BUZZER_PIN          PD5   //蜂鳴器引腳
#define BUTTON_PIN          PD6   //按鈕開關引腳
#define LED_PIN             PD7   //LED燈引腳

#define TEMP_HIGH           28    //溫度上限(攝氏度)
#define TEMP_LOW            26    //溫度下限(攝氏度)
#define WATER_LOW           10    //水位下限(毫米)
#define BUZZER_FREQ         1000  //蜂鳴器頻率(赫茲)

#define PUMP_ON             GPIOA->ODR |= (1 << PUMP_PIN)          //打開水泵
#define PUMP_OFF            GPIOA->ODR &= ~(1 << PUMP_PIN)        //關閉水泵
#define HEATER_ON           GPIOA->ODR |= (1 << HEATER_PIN)        //打開水箱加熱器
#define HEATER_OFF          GPIOA->ODR &= ~(1 << HEATER_PIN)      //關閉水箱加熱器
#define BUZZER_ON           GPIOB->ODR |= (1 << BUZZER_PIN)        //打開蜂鳴器
#define BUZZER_OFF          GPIOB->ODR &= ~(1 << BUZZER_PIN)      //關閉蜂鳴器
#define LED_ON              GPIOB->ODR |= (1 << LED_PIN)           //打開LED燈
#define LED_OFF             GPIOB->ODR &= ~(1 << LED_PIN)         //關閉LED燈

unsigned int water_level = 0;     //水位
unsigned int temperature = 0;     //溫度

void delay_ms(unsigned int ms)    //延時函數
{
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 1000; j++);
}

void LCD_init()                   //初始化LCD顯示器
{
    GPIOC->DDR |= (1 << LCD_RS_PIN) | (1 << LCD_RW_PIN) | (1 << LCD_EN_PIN);
    LCD_DATA_PORT->DDR |= 0xFF;
    delay_ms(15);
    LCD_RS_PIN = 0;
    LCD_RW_PIN = 0;
    LCD_EN_PIN = 0;
    LCD_DATA_PORT->ODR = 0x30;
    LCD_EN_PIN = 1;
    delay_ms(5);
    LCD_EN_PIN = 0;
    delay_ms(1);
    LCD_DATA_PORT->ODR = 0x30

//主函數
int main(void)
{
    //初始化
    init();

    //循環執行
    while(1)
    {
        //獲取傳感器數據
        get_sensor_data();

        //檢測水位
        check_water_level();

        //檢測溫度
        check_temperature();

        //檢測遙控器
        check_remote();

        //檢測按鈕
        check_button();

        //更新LCD顯示
        update_lcd();

        //延時1秒
        delay_ms(1000);
    }
}




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓