一. 系统概述
本系统采用STM32单片机作为主控制器,利用HC-SR04超声波测距模块进行坐姿监测,并通过滑动变阻器模拟光敏检测模块。系统会在坐姿不当(如距离桌子过近)时发出报警,并在光强过低时自动开灯。此外,用户可以通过按键设置光强和距离的阈值。
二. 仿真概述
- 在仿真模式下,显示屏会实时显示检测到的距离、光强以及设定的阈值。当检测参数在阈值范围内时,系统不会发出报警或开灯。
- 按下定时按键,系统将开始计时。
- 当检测到的距离低于设定阈值时,系统会发出声光报警。
- 若光强低于设定阈值,系统将自动开灯。用户可通过按键调整光强和距离的阈值设置。
三.程序设计
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
#include "HCSR04.h"
#include "timer.h"
#include "LED.h"
#include "EXTERN-Key.h"
#include "AD.h"
uint16_t Num;
uint16_t T;
extern uint16_t distance ;
extern uint16_t light;
float Angle;
int main(void)
{
distance=50;
light=40;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init(); //OLED初始化
HCSR04_Init();
Externkey_Init();
Timer_Init();
LED_Init();
AD_Init();
OLED_ShowString(2, 1, "distance:");
OLED_ShowString(2, 13, "cm");
/*显示静态字符串*/
OLED_ShowString(3, 1, "light:");
OLED_ShowString(3, 10, "%");
OLED_ShowString(1, 1, "time:00.00.00");
OLED_ShowString(4, 1, "limit:");
OLED_ShowString(4, 9, "cm");
OLED_ShowString(4, 14, "%");
while (1)
{
Angle= ((float)AD_GetValue()/ 4095 *100);
OLED_ShowNum(3, 7, Angle, 3);
T = HCSR04_GetValue();
OLED_ShowNum(2, 10, T, 3);
OLED_ShowNum(1, 12, (Num % 3600) % 60, 2);
OLED_ShowNum(1, 9, (Num % 3600) / 60, 2);
OLED_ShowNum(1, 6, Num / 3600, 2);
OLED_ShowNum(4, 7, distance, 2);
OLED_ShowNum(4, 12, light, 2);
if(Angle<=light)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
if(T<=distance)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
if(Num /3600==1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
if(Angle>light && T>distance&& Num /3600!=1)
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
}
24-32f-60