【Proteus仿真】【STM32单片机】视力保护仪

2023-12-14 19:37:09


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使LCD1602液晶,按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。
主要功能:
系统运行后,LCD1602显示超声波检测距离、光线强度值和对应阈值及计时时间;
如果光线强度低于阈值,指示灯亮,蜂鸣器报警;
如果检测距离低于阈值,指示灯亮,蜂鸣器报警;
如果开启计时,计时到达60分钟,指示灯亮,蜂鸣器报警,可通过K1键取消报警。
正常模式下,可通过K1键开启计时和关闭计时;
可通过K3键进入阈值设置,K1和K2对相应值调节,K4键确认。


二、软件设计

/*
作者:嗨小易(QQVIP群2:570487280)

*/



//系统数据显示
void sys_data_show(void)
{
	while(1)
	{
		//距离显示
		lcd1602_show_nums(2,0,sys_ctrl.dis,3,0);
		//光线显示
		lcd1602_show_nums(2,1,sys_ctrl.light,2,0);
		//有无开启计时状态显示
		if(sys_ctrl.timeflag==1)lcd1602_show_string(15,0,"Y");
		else lcd1602_show_string(15,0,"N");

		//时间显示
		lcd1602_show_nums(11,1,sys_ctrl.time[0],2,0x80);
		lcd1602_show_nums(14,1,sys_ctrl.time[1],2,0x80);

		//距离阈值显示
		lcd1602_show_nums(8,0,sys_ctrl.disl,3,0);
		//光线阈值显示
		lcd1602_show_nums(6,1,sys_ctrl.lightl,2,0);

		//设置参数闪烁
		switch(sys_ctrl.mode)
		{
			case 1://距离
				lcd1602_show_string(8,0,"   ");
				delay_ms(50);
				lcd1602_show_nums(8,0,sys_ctrl.disl,3,0);
				break;
			case 2://光线
				lcd1602_show_string(6,1,"  ");
				delay_ms(50);
				lcd1602_show_nums(6,1,sys_ctrl.lightl,2,0);
				break;
		}

		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=key_scan(0);

	//设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>2)sys_ctrl.mode=1;
	}
	//阈值设置模式
	if(sys_ctrl.mode!=0)
	{
		//加
		if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://距离
					sys_ctrl.disl++;
					if(sys_ctrl.disl>500)sys_ctrl.disl=0;
					break;
				case 2://光线
					sys_ctrl.lightl++;
					if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
					break;
			}	
		}
		//减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://距离
					sys_ctrl.disl--;
					if(sys_ctrl.disl<0)sys_ctrl.disl=500;
					break;
				case 2://光线
					sys_ctrl.lightl--;
					if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
					break;
			}	
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.mode=0;	
		}	
	}
	//正常模式
	else
	{
		//计时器开关
		if(key==KEY1_PRESS)
		{
			sys_ctrl.timeflag=!sys_ctrl.timeflag;
			if(sys_ctrl.timeflag==1)
			{
				TR1=1;//打开定时器
			}
			else
			{
				TR1=0;//关闭定时器
				sys_ctrl.time[0]=0;sys_ctrl.time[1]=0;
			}	
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//正常模式
	if(sys_ctrl.mode==0)
	{
		//如果光线强度低于阈值,指示灯亮,蜂鸣器报警
		if(sys_ctrl.light<sys_ctrl.lightl)
		{
			LED_LIGHT=0;
			beep_alarm(1,1000);		
		}
		//如果光线强度正常,指示灯灭,报警取消
		else
		{
			LED_LIGHT=1;	
		}

		//如果检测距离低于阈值,指示灯亮,蜂鸣器报警
		if(sys_ctrl.dis<sys_ctrl.disl)
		{
			LED_DIS=0;
			beep_alarm(1,1000);	
		}
		//如果检测距离正常,指示灯灭,报警取消
		else
		{
			LED_DIS=1;	
		}

		//如果开启计时
		if(sys_ctrl.timeflag)
		{
			//如果计时到达60分钟,指示灯亮,蜂鸣器报警
			if(sys_ctrl.time[0]==60)
			{
				LED_TIME=0;
				beep_alarm(1,1000);
			}
		}
	}	
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

文章来源:https://blog.csdn.net/Hello_Muyi/article/details/135001941
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。