基于stm32f103的智能楼道灯设计怎么写
时间: 2023-08-02 22:05:07 浏览: 56
以下是一个基于STM32F103的智能楼道灯设计的简单示例代码,仅供参考:
```c
#include "stm32f10x.h"
#define LIGHT_THRESHOLD 1000 //光线阈值
#define MOTION_DELAY 1000 //人体感应延时
void GPIO_Configuration(void);
void TIM_Configuration(void);
void Delay_Ms(u32 nTime);
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_Configuration();
TIM_Configuration();
while(1)
{
u16 light = ADC_GetConversionValue(ADC1);
if(light < LIGHT_THRESHOLD)
{
GPIO_SetBits(GPIOA, GPIO_Pin_7);
Delay_Ms(MOTION_DELAY);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == Bit_SET)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
//光敏电阻连接PA0口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//LED灯连接PA7口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//人体红外感应模块连接PB0口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置ADC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//配置定时器(TIM3)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_InitStructure.TIM_Period = 5000 - 1;
TIM_InitStructure.TIM_Prescaler = 7200 - 1;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
//配置中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Delay_Ms(u32 nTime)
{
TIM_SetCounter(TIM3, 0);
while(TIM_GetCounter(TIM3) < nTime);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
```
在这个示例代码中,我们使用了ADC1来检测环境光强度,光敏电阻连接到了PA0口。同时,我们还使用了一个定时器(TIM3)来实现延时功能,中断函数中的代码可以根据实际需要进行修改。人体红外感应模块连接到了PB0口,我们在程序中使用了一个延时函数来控制人体感应模块的延时时间,当检测到人体移动时,打开LED灯,延时一段时间后再次检测是否仍有人体存在,如果没有则关闭LED灯。
需要注意的是,这只是一个简单的示例程序,实际开发中还需要根据具体的需求进行功能扩展和优化。同时,硬件电路的连接也需要注意保证正确性和安全性。