基于STM32 的家居环境检测和家电控制系统源代码.docx
- 文档编号:28620534
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:69
- 大小:30.31KB
基于STM32 的家居环境检测和家电控制系统源代码.docx
《基于STM32 的家居环境检测和家电控制系统源代码.docx》由会员分享,可在线阅读,更多相关《基于STM32 的家居环境检测和家电控制系统源代码.docx(69页珍藏版)》请在冰豆网上搜索。
基于STM32的家居环境检测和家电控制系统源代码
/*包含头文件----------------------------------------------------------------*/
#include"stm32f1xx_hal.h"
#include"usart/bsp_debug_usart.h"
#include"AM2302/bsp_AM2302.h"
/*私有类型定义--------------------------------------------------------------*/
/*私有宏定义----------------------------------------------------------------*/
/*私有变量------------------------------------------------------------------*/
AM2302_Data_TypeDefAM2302_Data;
/*扩展变量------------------------------------------------------------------*/
/*私有函数原形--------------------------------------------------------------*/
/*函数体--------------------------------------------------------------------*/
/**
*函数功能:
系统时钟配置
*输入参数:
无
*返回值:
无
*说明:
无
*/
voidSystemClock_Config(void)
{
RCC_OscInitTypeDefRCC_OscInitStruct;
RCC_ClkInitTypeDefRCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;//外部晶振,8MHz
RCC_OscInitStruct.HSEState=RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue=RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL=RCC_PLL_MUL9;//9倍频,得到72MHz主时钟
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//系统时钟:
72MHz
RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB时钟:
72MHz
RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;//APB1时钟:
36MHz
RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;//APB2时钟:
72MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2);
//HAL_RCC_GetHCLKFreq()/10001ms中断一次
//HAL_RCC_GetHCLKFreq()/10000010us中断一次
//HAL_RCC_GetHCLKFreq()/10000001us中断一次
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);//配置并启动系统滴答定时器
/*系统滴答定时器时钟源*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/*系统滴答定时器中断优先级配置*/
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
}
/**
*函数功能:
主函数.
*输入参数:
无
*返回值:
无
*说明:
无
*/
intmain(void)
{
/*复位所有外设,初始化Flash接口和系统滴答定时器*/
HAL_Init();
/*配置系统时钟*/
SystemClock_Config();
/*初始化串口并配置串口中断优先级*/
MX_DEBUG_USART_Init();
printf("AM2302高精度温湿度传感器数据读取\n");
AM2302_Init();
/*无限循环*/
while
(1)
{
/*调用AM2302_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
if(AM2302_Read_TempAndHumidity(&AM2302_Data)==SUCCESS)
{
printf("读取AM2302成功!
-->湿度为%.1f%RH,温度为%.1f℃\n",AM2302_Data.humidity,AM2302_Data.temperature);
}
else
{
printf("读取AM2302信息失败\n");
}
HAL_Delay(1000);
}
}
/**
******************************************************************************
*FileName:
stm32f1xx_hal_msp.c
*Description:
ThisfileprovidescodefortheMSPInitialization
*andde-Initializationcodes.
******************************************************************************
*
*************************************************************************
*/
/*Includes------------------------------------------------------------------*/
#include"stm32f1xx_hal.h"
/*USERCODEBEGIN0*/
/*USERCODEEND0*/
/**
*InitializestheGlobalMSP.
*/
voidHAL_MspInit(void)
{
/*USERCODEBEGINMspInit0*/
/*USERCODEENDMspInit0*/
__HAL_RCC_AFIO_CLK_ENABLE();
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/*Systeminterruptinit*/
/*MemoryManagement_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(MemoryManagement_IRQn,0,0);
/*BusFault_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(BusFault_IRQn,0,0);
/*UsageFault_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(UsageFault_IRQn,0,0);
/*DebugMonitor_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(DebugMonitor_IRQn,0,0);
/*SysTick_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
/*USERCODEBEGINMspInit1*/
/*USERCODEENDMspInit1*/
}
/*USERCODEBEGIN1*/
/*USERCODEEND1*/
/**
*@}
*/
/**
*@}
*/
/**
******************************************************************************
*@filestm32f1xx_it.c
*@briefInterruptServiceRoutines.
******************************************************************************
*
*
/*Includes------------------------------------------------------------------*/
#include"stm32f1xx_hal.h"
#include"stm32f1xx.h"
#include"stm32f1xx_it.h"
/*USERCODEBEGIN0*/
/*USERCODEEND0*/
/*Externalvariables--------------------------------------------------------*/
/******************************************************************************/
/*Cortex-M3ProcessorInterruptionandExceptionHandlers*/
/******************************************************************************/
/**
*@briefThisfunctionhandlesNonmaskableinterrupt.
*/
voidNMI_Handler(void)
{
/*USERCODEBEGINNonMaskableInt_IRQn0*/
/*USERCODEENDNonMaskableInt_IRQn0*/
/*USERCODEBEGINNonMaskableInt_IRQn1*/
/*USERCODEENDNonMaskableInt_IRQn1*/
}
/**
*@briefThisfunctionhandlesHardfaultinterrupt.
*/
voidHardFault_Handler(void)
{
/*USERCODEBEGINHardFault_IRQn0*/
/*USERCODEENDHardFault_IRQn0*/
while
(1)
{
}
/*USERCODEBEGINHardFault_IRQn1*/
/*USERCODEENDHardFault_IRQn1*/
}
/**
*@briefThisfunctionhandlesMemorymanagementfault.
*/
voidMemManage_Handler(void)
{
/*USERCODEBEGINMemoryManagement_IRQn0*/
/*USERCODEENDMemoryManagement_IRQn0*/
while
(1)
{
}
/*USERCODEBEGINMemoryManagement_IRQn1*/
/*USERCODEENDMemoryManagement_IRQn1*/
}
/**
*@briefThisfunctionhandlesPrefetchfault,memoryaccessfault.
*/
voidBusFault_Handler(void)
{
/*USERCODEBEGINBusFault_IRQn0*/
/*USERCODEENDBusFault_IRQn0*/
while
(1)
{
}
/*USERCODEBEGINBusFault_IRQn1*/
/*USERCODEENDBusFault_IRQn1*/
}
/**
*@briefThisfunctionhandlesUndefinedinstructionorillegalstate.
*/
voidUsageFault_Handler(void)
{
/*USERCODEBEGINUsageFault_IRQn0*/
/*USERCODEENDUsageFault_IRQn0*/
while
(1)
{
}
/*USERCODEBEGINUsageFault_IRQn1*/
/*USERCODEENDUsageFault_IRQn1*/
}
/**
*@briefThisfunctionhandlesDebugmonitor.
*/
voidDebugMon_Handler(void)
{
/*USERCODEBEGINDebugMonitor_IRQn0*/
/*USERCODEENDDebugMonitor_IRQn0*/
while
(1)
{
}
/*USERCODEBEGINDebugMonitor_IRQn1*/
/*USERCODEENDDebugMonitor_IRQn1*/
}
/**
*@briefThisfunctionhandlesSystemticktimer.
*/
voidSysTick_Handler(void)
{
/*USERCODEBEGINSysTick_IRQn0*/
/*USERCODEENDSysTick_IRQn0*/
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
/*USERCODEBEGINSysTick_IRQn1*/
/*USERCODEENDSysTick_IRQn1*/
}
/*包含头文件----------------------------------------------------------------*/
#include"AM2302/bsp_AM2302.h"
/*私有类型定义--------------------------------------------------------------*/
/*私有宏定义----------------------------------------------------------------*/
#defineDelay_ms(x)HAL_Delay(x)
/*私有变量------------------------------------------------------------------*/
/*扩展变量------------------------------------------------------------------*/
/*私有函数原形--------------------------------------------------------------*/
staticvoidAM2302_Mode_IPU(void);
staticvoidAM2302_Mode_Out_PP(void);
staticuint8_tAM2302_ReadByte(void);
/*函数体--------------------------------------------------------------------*/
/**
*函数功能:
*输入参数:
无
*返回值:
无
*说明:
无
*/
staticvoidAM2302_Delay(uint16_ttime)
{
uint8_ti;
while(time)
{
for(i=0;i<10;i++)
{
}
time--;
}
}
/**
*函数功能:
AM2302初始化函数
*输入参数:
无
*返回值:
无
*说明:
无
*/
voidAM2302_Init(void)
{
AM2302_Dout_GPIO_CLK_ENABLE();
AM2302_Mode_Out_PP();
AM2302_Dout_HIGH();//拉高GPIO
}
/**
*函数功能:
使AM2302-DATA引脚变为上拉输入模式
*输入参数:
无
*返回值:
无
*说明:
无
*/
staticvoidAM2302_Mode_IPU(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
/*串口外设功能GPIO配置*/
GPIO_InitStruct.Pin=AM2302_Dout_PIN;
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
GPIO_InitStruct.Pull=GPIO_PULLUP;
HAL_GPIO_Init(AM2302_Dout_PORT,&GPIO_InitStruct);
}
/**
*函数功能:
使AM2302-DATA引脚变为推挽输出模式
*输入参数:
无
*返回值:
无
*说明:
无
*/
staticvoidAM2302_Mode_Out_PP(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
/*串口外设功能GPIO配置*/
GPIO_InitStruct.Pin=AM2302_Dout_PIN;
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(AM2302_Dout_PORT,&GPIO_InitStruct);
}
/**
*函数功能:
从AM2302读取一个字节,MSB先行
*输入参数:
无
*返回值:
无
*说明:
无
*/
staticuint8_tAM2302_ReadByte(void)
{
uint8_ti,temp=0;
for(i=0;i<8;i++)
{
/*每bit以50us低电平标置开始,轮询直到从机发出的50us低电平结束*/
while(AM2302_Data_IN()==GPIO_PIN_RESET);
/*AM2302以26~28us的高电平表示“0”,以70us高电平表示“1”,
*通过检测xus后的电平即可区别这两个状,x即下面的延时
*/
AM2302_Delay(40);//延时xus这个延时需要大于数据0持续的时间即可
if(AM2302_Data_IN()==GPIO_PIN_SET)/*xus后仍为高电平表示数据“1”*/
{
/*等待数据1的高电平结束*/
while(AM2302_Data_IN()==GPIO_PIN_SET);
temp|=(uint8_t)(0x01<<(7-i));//把第7-i位置1,MSB先行
}
else//xus后为低电平表示数据“0”
{
temp&=(uint8_t)~(0x01<<(7-i));//把第7-i位置0,MSB先行
}
}
returntemp;
}
/*
*
*
*/
/**
*函数功能:
一次完整的数据传输为40bit,高位先出
*输入参数:
AM2302_Data:
AM2302数据类型
*返回值:
ERROR:
读取出错
*SUCCESS:
读取成功
*说明:
8bit湿度整数+8bit湿度小数+8bit温度整数+8bit温度小数+8bit校验和
*/
uint8_tAM2302_Read_TempAndHumidity(AM2302_Data_TypeDef*AM2302_Data)
{
uint8_ttemp;
uint16_thumi_temp;
/*输出模式*/
AM2302_Mode_Out_PP();
/*主机拉低*/
AM2302_Dout_LOW();
/*延时18ms*/
Delay_ms(18);
/*总线拉高主机延时30us*/
AM2302_Dout_HIGH();
AM2302_Delay(30);//延时30us
/*主机设为输入判断从机响应信号*/
AM2302_Mode_IPU();
/*判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行*/
if(AM2302_Data_IN()==GPIO_PIN_RESET)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于STM32 的家居环境检测和家电控制系统源代码 基于 STM32 家居环境 检测 家电 控制系统 源代码