一 , 1) 控制板上LED、蜂鳴器; 2) 使用DS18B20采集環境溫度值; 3) 液晶屏上顯示正常溫度、溫度閾值、相關提示信息; 4) 按鍵可以手動調節閾值溫度加減; 5) 通過蜂鳴器和LED實現溫度超限報警功能;
6) 通過WIFI模塊傳輸數據至電腦TCP調試助手,實現遠程控
二,自動報警
制作出來的實物圖如下:
程序比較亂,,,,,,
單片機源程序如下:
- #include "stm32f10x.h"
- #include "bsp_ili9341_lcd.h"
- #include "stdio.h"
- #include "bsp_esp8266.h"
- /**
- * @brief 主函數
- * @param 無
- * @retval 無
- */
- #define Beep_ON GPIO_SetBits(GPIOA,GPIO_Pin_8)
- #define Beep_OF GPIO_ResetBits(GPIOA,GPIO_Pin_8)
- #define LED1OF GPIO_SetBits(GPIOB,GPIO_Pin_0)
- #define LED2OF GPIO_SetBits(GPIOB,GPIO_Pin_1)
- #define LED3OF GPIO_SetBits(GPIOB,GPIO_Pin_5)
- #define LED1ON GPIO_ResetBits(GPIOB,GPIO_Pin_0)
- #define LED2ON GPIO_ResetBits(GPIOB,GPIO_Pin_1)
- #define LED3ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)
- #define K1_Port GPIOA
- #define K1_Pin GPIO_Pin_0
- #define K2_Port GPIOC
- #define K2_Pin GPIO_Pin_13
- #define Beep_Port GPIOA
- #define Beep_Pin GPIO_Pin_8
- unsigned int Temp_Val;//溫度
- unsigned char fun=2;
- //GPIO端口配置程序
- void GPIO_Init_Func()
- {
- GPIO_InitTypeDef GPIO_InitDef;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
-
- GPIO_InitDef.GPIO_Pin = Beep_Pin; //蜂鳴器
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(Beep_Port,&GPIO_InitDef);
-
- GPIO_InitDef.GPIO_Pin = K1_Pin; //按鍵 K1
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(K1_Port,&GPIO_InitDef);
- GPIO_InitDef.GPIO_Pin = K2_Pin; //按鍵 K2
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(K2_Port,&GPIO_InitDef);
- }
- //任務3
- void LED_GPIO_Init()
- {
- GPIO_InitTypeDef GPIO_InitDef;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitDef.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitDef);
- GPIO_InitDef.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitDef);
-
- GPIO_InitDef.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitDef);
- }
- void TIM1_PWM_Config(u16 arr, u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
-
- GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
-
- TIM_TimeBaseStructure.TIM_Period =arr-1;
- TIM_TimeBaseStructure.TIM_Prescaler = psc-1;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
-
- TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE );
- NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OC1Init(TIM1, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
-
- TIM_Cmd(TIM1, ENABLE);
-
- }
- void TIM1_UP_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM1,TIM_IT_Update) == 1)
- {
- if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5) == 1)
- {
- LED1ON;
- //LED2ON ;
- LED3ON;
- }
-
- else
- {
-
- //LED1OF;
- LED2OF;
- LED3OF;
- }
- TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
- }
- }
- //按鍵驅動子程序
- int Temp_Warn = 50;
- //u16 psc_dat = 7200;
- u16 arr_dat = 10000;
-
- unsigned int Tim_Dat = 0;
- void Scan_Key_Func()
- {
- u16 i;
-
- if(GPIO_ReadInputDataBit(K1_Port,K1_Pin) == 1) //K1
- {
-
- for(i = 0; i < 0xfff; i++);
- if(Temp_Warn<255)
- {Temp_Warn++;}
- if(arr_dat < 65535){
- arr_dat = arr_dat + 1000;
-
- // TIM1_PWM_Config(arr_dat,7200;
- }
- while(GPIO_ReadInputDataBit(K1_Port,K1_Pin) == 1); //等待按鍵松開
-
-
-
- }
- if(GPIO_ReadInputDataBit(K2_Port,K2_Pin) == 1) //K1
- {
-
- for(i = 0; i < 0xfff; i++);
- if(Temp_Warn>0)
- { Temp_Warn--;}
- if(arr_dat >1000){
- arr_dat = arr_dat - 1000;
- //TIM1_PWM_Config(arr_dat,7200);
- }
- while(GPIO_ReadInputDataBit(K2_Port,K2_Pin) == 1); //等待按鍵松開
- }
-
- }
-
- //任務5
- void USART_Config()
- {
-
- GPIO_InitTypeDef GPIO_InitStruct;
- USART_InitTypeDef USART_InitStrut;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
-
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //USART2 TX
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
-
- GPIO_Init(GPIOA,&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //USART2 RX
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOA,&GPIO_InitStruct);
-
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
-
- USART_InitStrut.USART_BaudRate = 9600 ;//9600;
- USART_InitStrut.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStrut.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_InitStrut.USART_Parity = USART_Parity_No;
- USART_InitStrut.USART_StopBits = USART_StopBits_1;
- USART_InitStrut.USART_WordLength = USART_WordLength_8b;
- USART_Init(USART1,&USART_InitStrut);
- USART_Cmd(USART1,ENABLE);
-
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//RX
- }
- void USART_TX_Data(char*Str)
- {
- while(*Str != '\0')
- {
- USART_SendData(USART1,*Str);
- Str++;
- while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
- }
- }
- unsigned char usart1Buf[255];
- unsigned int RXDATA=0;
- void USART1_IRQHandler()
- {
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
-
- usart1Buf[RXDATA]=USART_ReceiveData(USART1);
- RXDATA++;RXDATA%=255;
- USART_ClearFlag(USART1, USART_FLAG_RXNE);
- }
- }
- float OUTPUT_Val;
- //報警
- void Warn_Func()
- {
- if (Temp_Val >= (Temp_Warn*10)) Beep_ON;
- if (Temp_Val < (Temp_Warn*10)) Beep_OF;
- }
- //任務8ADC轉換
- void ADC_Config()
- {
- GPIO_InitTypeDef GPIO_InitStru;
- ADC_InitTypeDef ADC_InitStr;
- NVIC_InitTypeDef NVIC_InitSrt;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
- RCC_APB2Periph_ADC1,ENABLE);
-
- GPIO_InitStru.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_InitStru.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStru.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOC,&GPIO_InitStru);
- ADC_InitStr.ADC_ContinuousConvMode = DISABLE;
- ADC_InitStr.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStr.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_None;
- ADC_InitStr.ADC_Mode = ADC_Mode_Independent;
- ADC_InitStr.ADC_NbrOfChannel = 1;
-
- ADC_InitStr.ADC_ScanConvMode = DISABLE;
- ADC_Init(ADC1,&ADC_InitStr);
- ADC_Cmd(ADC1,ENABLE);////////////
-
- ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
-
- NVIC_InitSrt.NVIC_IRQChannel = ADC1_2_IRQn;
- NVIC_InitSrt.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitSrt.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitSrt.NVIC_IRQChannelSubPriority = 3;
- NVIC_Init(&NVIC_InitSrt);
-
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
-
- ADC_ResetCalibration(ADC1); //使能復位校準
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束
- ADC_StartCalibration(ADC1); //開啟AD校準
- while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束
-
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);
-
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );
- }
- u16 ADC_Buf = 0;
- void ADC1_2_IRQHandler(void)
- {
- if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == 1)
- {
- ADC_Buf = ADC_GetConversionValue(ADC1);
-
- ADC_ClearITPendingBit(ADC1,ADC_IT_EOC) ;
- }
- }
- int main(void)
- {
-
- unsigned i=0;
- ESP8266_Init();
- GPIO_Init_Func();
- LED_GPIO_Init();
- TIM1_PWM_Config(arr_dat,7200);
- USART_Config();
- ILI9341_Init();
- while(1)
- {
-
-
- USART_TX_Data("Temp_Warn\n");
- for(i=0;i<0xfffff;i++);
- Temp_Val = Get_Time();
- LED_Display_Function();
- Warn_Func();
- ADC_Config();
- Scan_Key_Func();
- ESP8266_Send_Data();
- ESP8266_Recv_Data();
- }
- }
復制代碼
全部資料51hei下載地址:
Demo_Code.7z
(227.5 KB, 下載次數: 38)
2019-1-6 00:29 上傳
點擊文件名下載附件
|