基于51单片机的智能声光路灯

模式一:下只接受声音信号当声音超过阈值时,LED灯亮,一段时间后自动熄灭。

模式二:只接受光信号,光照强度低于阈值时,LED灯亮,一段时间后自动熄灭。

模式三:两种信号都接受,光照强度低于阈值同时分贝超过阈值时LED灯亮一段时间后自动熄灭。这些阈值都是可以调节的,可以设置在某个时间段常亮。

基于51单片机的智能声光路灯毕业设计是一个集成了光敏感应、声音检测和实时时间管理的智能系统。这种设计旨在提高路灯的能效和智能化水平,适应城市照明的需求。下面是该项目的主要组成部分和功能介绍:

1. 系统组成

  • 51单片机: 作为整个系统的核心控制单元,负责处理各种传感器数据,并根据预设的逻辑控制路灯的开关。
  • 光敏模块: 用于检测环境光线强度,根据光强来判断是白天还是夜晚,从而控制路灯的开启和关闭。
  • 声音模块: 捕捉周围的声音信号,可以用来检测车辆或行人的存在,以便在需要时开启路灯。
  • DS1302实时时钟模块: 提供精确的时间信息,用于设置路灯的开关时间,以及记录日志等功能。
  • 驱动电路: 控制路灯的电源,根据单片机的指令来开启或关闭路灯。

2. 功能实现

  • 自动光控: 利用光敏模块的数据,自动判断白天和夜晚,晚上自动开灯,白天自动关灯。
  • 声控激活: 当声音模块检测到一定强度的声音时,如车辆经过,路灯可以被临时开启,以提供必要的照明。
  • 时间控制: 利用DS1302模块设置路灯的具体开关时间,可以根据不同季节和地区的日出日落时间自动调整。
  • 省电模式: 结合声控和光控功能,智能调节路灯的工作状态,避免不必要的能源浪费。

3. 系统优势

  • 节能环保: 通过智能控制减少能源消耗,响应环保节能政策。
  • 提高安全性: 在必要的时候提供照明,增加夜间行车和行人的安全。
  • 灵活性高: 可以根据实际需要调整路灯的工作模式和策略。

4. 设计挑战

  • 环境适应性: 设计中需要考虑不同环境条件下光敏和声音模块的准确性和稳定性。
  • 系统集成: 各个模块之间的协调和数据通信需要精确设计,以保证系统的稳定运行。
  • 能耗管理: 在确保功能和灵活性的同时,还需要优化能耗。

这种基于51单片机的智能声光路灯设计不仅技术含量高,而且具有很好的实用性和推广价值,是城市智能照明系统的一个优秀示例。

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include <INTRINS.H> 

sbit ADCLK = P1^2;					//定义ADC0832 		
sbit ADDO = P1^3; 
sbit ADDI = P1^3;
sbit ADCS = P1^5; 
sbit Anjian_jia = P3^0;//按键光照/声音分贝阀值加功能IO口
sbit Anjian_jian = P3^1;//按键光照/声音分贝阀值减功能IO口
sbit Set_key = P3^7;//设置按键IO口
sbit LED = P1^0;//LED灯IO口

typedef unsigned char uchar;
#define uint  unsigned int	// 以后unsigned int 就可以用uint 代替
#define uchar unsigned char // 以后unsigned char 就可以用char 代替

uchar light,Voice;//定义保存光照强度值、声音分贝值变量 
uchar light_limit = 60,Voice_limit = 50,shiji_L = 22,shiji_MAX = 23;//定义光照初始值阈值变量,声音分贝初始值阀值变量,时段开始时间、结束时间变量
int XS_shiji_shi,XS_shiji_fen,XS_shiji_miao,temp, T0Count; //显示时钟时间时、分、秒变量以及DS1302保存数据中间变量、计时变量
uchar BaiTiao_Qizhi = 7,BaiTiao_Jieshu = 24;//定义晚上时间段
uchar WanShang_flag,Set_flag;//定义晚上功能模式标志位,设置模式标志位,

unsigned int Adc0832(unsigned char channel)//读取0通道的AD值,channel:通道0和通道1选择
{
	uchar i=0;
	uchar j;
	uint dat=0;
	uchar ndat=0;
	uchar  Vot=0;

	if(channel==0)channel=2;
	if(channel==1)channel=3;
	ADDI=1;
	_nop_();
	_nop_();
	ADCS=0;//拉低CS端
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿1
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=channel&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿2
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=(channel>>1)&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿3
	ADDI=1;//控制命令结束
	_nop_();
	_nop_();
	dat=0;
	for(i=0;i<8;i++)
	{
		dat|=ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		dat<<=1;
		if(i==7)dat|=ADDO;
	}
	for(i=0;i<8;i++)
	{
		j=0;
		j=j|ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		j=j<<7;
		ndat=ndat|j;
		if(i<7)ndat>>=1;
	}
	ADCS=1;//拉低CS端
	ADCLK=0;//拉低CLK端
	ADDO=1;//拉高数据端,回到初始状态
	dat<<=8;
	dat|=ndat;

	return(dat);           
}

void delayms(unsigned int x)   //0.14ms误差 0us 延时函数
{
	unsigned char i;
	while(x--)
	{
		for (i = 0; i<13; i++)
		{}
	}
}

char Settings_interface()//设置按键扫描函数
{
	if(Set_key==0)// 如果设置项调整按键按下了
	{
	//显示屏第一行显示
		LCD_WriteCommand(0x80);//设置字符显示地址,显示屏第一行显示位置
		LCD_WriteData(0x30+XS_shiji_shi%100/10);//0,显示显示时间_时变量十位
		LCD_WriteData(0x30+XS_shiji_shi%10);//1,显示显示实时时间_时变量个位
		LCD_WriteData(':');//2,显示:
		LCD_WriteData(0x30+XS_shiji_fen%100/10);//3,显示显示时间_分变量十位
		LCD_WriteData(0x30+XS_shiji_fen%10);//4,显示显示声音实时时间_分变量个位
		LCD_WriteData(':');//5,显示:
		LCD_WriteData(0x30+XS_shiji_miao%100/10);//6,显示显示时间_秒变量十位
		LCD_WriteData(0x30+XS_shiji_miao%10);//7,显示显示时间_秒变量十位
		LCD_WriteData(' ');//显示屏具体位置8,显示
		LCD_WriteData('G');//显示屏具体位置9,显示G
		LCD_WriteData('Z');//显示屏具体位置10,显示Z
		LCD_WriteData(':');//显示屏具体位置11,显示:
		LCD_WriteCommand(0x80+12);//设置字符显示地址
		LCD_WriteData(0x30+light_limit/100);//显示屏具体位置12,显示光照强度阀值变量百位
		LCD_WriteData(0x30+light_limit%100/10);//显示屏具体位置13,显示光照强度阀值变量十位
		LCD_WriteData(0x30+light_limit%10);//显示屏具体位置14,显示烟雾光照强度阀值变量个位
		LCD_WriteCommand(0x80+15);//设置字符显示地址
		LCD_WriteData(' ');//显示屏具体位置15,显示

		//显示屏第二行显示		
		LCD_WriteCommand(0xC0+0);//设置字符显示地址,显示屏第二行显示位置
		LCD_WriteData('V');//显示屏具体位置0,显示V
		LCD_WriteData('O');//显示屏具体位置1,显示O
		LCD_WriteData(':');//显示屏具体位置2,显示:
		LCD_WriteCommand(0xC0+3);//设置字符显示地址
		LCD_WriteData(0x30+Voice_limit/100);//显示屏具体位置3,显示声音分贝阀值变量百位
		LCD_WriteData(0x30+Voice_limit%100/10);//显示屏具体位置4,显示声音分贝阀值变量十位
		LCD_WriteData(0x30+Voice_limit%10);//显示屏具体位置6,显示声音分贝阀值变量个位
		LCD_WriteData(' ');//显示屏具体位置7,显示
		LCD_WriteData(' ');//显示屏具体位置8,显示
		LCD_WriteData('S');//显示屏具体位置9,显示S
		LCD_WriteData('D');//显示屏具体位置10,显示H
		LCD_WriteData(':');//显示屏具体位置11,显示:
		LCD_WriteCommand(0xC0+11);//设置字符显示地址
		LCD_WriteData(0x30+shiji_L%100/10);//显示屏具体位置11,显示时段开始时间值十位
		LCD_WriteData(0x30+shiji_L%10);//显示屏具体位置12,显示时段开始时间值个位
		LCD_WriteData('-');//显示屏具体位置13,显示-
		LCD_WriteCommand(0xC0+14);//设置字符显示地址
		LCD_WriteData(0x30+shiji_MAX%100/10);//14,显示时段结束时间变量值十位
		LCD_WriteData(0x30+shiji_MAX%10);//15,显示时段结束时间变量值个位

		//实时时间小时设置
		LCD_WriteCommand(0x80+1);//显示屏第一行设置字符显示地址,显示屏具体位置为1
		LCD_WriteCommand(0x0f);//显示光标
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{
			if(Anjian_jian==0)//判断减按键是否按下
			{
				if(XS_shiji_shi>0)//判断实时时间的小时值变量是否大于0					
				XS_shiji_shi--;//实时时间的小时值变量自减1
				LCD_WriteCommand(0x80+0);//显示屏第一行设置字符显示地址,显示屏具体位置为0,
				temp=(XS_shiji_shi)/10*16+(XS_shiji_shi)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_shi/10);//0,显示显示时间_时变量十位
				LCD_WriteData(0x30+XS_shiji_shi%10);//1,显示显示实时时间_时变量个位
				LCD_WriteCommand(0x80+1);//设置字符显示地址
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{
				if(XS_shiji_shi<24)//判断实时时间的小时值变量是否小于24
				XS_shiji_shi++;//实时时间的小时值变量自加1
				LCD_WriteCommand(0x80+0);//显示屏第一行设置字符显示地址,显示屏具体位置为0
				temp=(XS_shiji_shi)/10*16+(XS_shiji_shi)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_shi/10);//0,显示显示时间_时变量十位
				LCD_WriteData(0x30+XS_shiji_shi%10);//1,显示显示实时时间_时变量个位
				LCD_WriteCommand(0x80+1);//显示屏第一行设置字符显示地址,显示屏具体位置为1
				delayms(250);//延时			
				while(!Anjian_jia);//按键消抖
			}				
		}

		//分钟设置
		LCD_WriteCommand(0x80+4);//显示屏第一行设置字符显示地址,显示屏具体位置为4
		LCD_WriteCommand(0x0f);//显示光标
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{
			if(Anjian_jian==0)//判断减按键是否按下
			{
				if(XS_shiji_fen>0)//判断实时时间的分钟值变量是否大于0					
				XS_shiji_fen--;//判断实时时间的分钟值变量自减1
				LCD_WriteCommand(0x80+3);//显示屏第一行设置字符显示地址,显示屏具体位置为3,
				temp=(XS_shiji_fen)/10*16+(XS_shiji_fen)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x82,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_fen/10);//0,显示判断实时时间的分钟值变量十位
				LCD_WriteData(0x30+XS_shiji_fen%10);//1,显示显示判断实时时间的分钟值变量变量个位
				LCD_WriteCommand(0x80+4);//设置字符显示地址
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{
				if(XS_shiji_fen<60)//判断判断实时时间的分钟值变量是否小于60
				XS_shiji_fen++;//判断实时时间的分钟值变量自加1
				LCD_WriteCommand(0x80+3);//显示屏第一行设置字符显示地址,显示屏具体位置为3
				temp=(XS_shiji_fen)/10*16+(XS_shiji_fen)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x82,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_fen/10);//0,显示判断实时时间的分钟值变量十位
				LCD_WriteData(0x30+XS_shiji_fen%10);//1,显示判断实时时间的分钟值变量个位
				LCD_WriteCommand(0x80+4);//显示屏第一行设置字符显示地址,显示屏具体位置为4
				delayms(250);//延时			
				while(!Anjian_jia);//按键消抖
			}				
    }

		//时间秒设置
		LCD_WriteCommand(0x80+7);//显示屏第一行设置字符显示地址,显示屏具体位置为12
		LCD_WriteCommand(0x0f);//显示光标
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{
			if(Anjian_jian==0)//判断减按键是否按下
			{
				if(XS_shiji_miao>0)//判断光照强度阀值变量是否大于0					
				XS_shiji_miao--;//光照强度阀值变量自减1
				LCD_WriteCommand(0x80+6);//显示屏第一行设置字符显示地址,显示屏具体位置为12,
				temp=(XS_shiji_miao)/10*16+(XS_shiji_miao)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x80,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_miao/10);//0,显示显示时间_时变量十位
				LCD_WriteData(0x30+XS_shiji_miao%10);//1,显示显示实时时间_时变量个位
				LCD_WriteCommand(0x80+6);//设置字符显示地址
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{
				if(XS_shiji_miao<60)//判断光照强度阀值变量是否小于256
				XS_shiji_miao++;//光照强度阀值变量自加1
				LCD_WriteCommand(0x80+6);//显示屏第一行设置字符显示地址,显示屏具体位置为12
				temp=(XS_shiji_fen)/10*16+(XS_shiji_miao)%10;//十进制转换成DS1302要求的DCB码
				DS1302_WriteByte(0x8e,0x00);//允许写,禁止写保护 
				DS1302_WriteByte(0x80,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
				DS1302_WriteByte(0x8e,0x80);//打开写保护
				LCD_WriteData(0x30+XS_shiji_miao/10);//0,显示显示时间_时变量十位
				LCD_WriteData(0x30+XS_shiji_miao%10);//1,显示显示实时时间_时变量个位
				LCD_WriteCommand(0x80+6);//显示屏第一行设置字符显示地址,显示屏具体位置为14
				delayms(250);//延时			
				while(!Anjian_jia);//按键消抖
			}				
		}

		//光照强度阀值设置
		LCD_WriteCommand(0x80+14);//显示屏第一行设置字符显示地址,显示屏具体位置为12
		LCD_WriteCommand(0x0f);//显示光标
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{
			if(Anjian_jian==0)//判断减按键是否按下
			{
				if(light_limit>0)//判断光照强度阀值变量是否大于0					
				light_limit--;//光照强度阀值变量自减1
				LCD_WriteCommand(0x80+12);//显示屏第一行设置字符显示地址,显示屏具体位置为12,
				LCD_WriteData(0x30+light_limit/100);//12,显示光照强度阀值变量百位,显示屏具体位置为12
				LCD_WriteData(0x30+light_limit%100/10);//13,显示光照强度阀值变量十位,显示屏具体位置为13
				LCD_WriteData(0x30+light_limit%10);//14,显示光照强度阀值变量个位,显示屏具体位置为14 	 	 	 	
				LCD_WriteCommand(0x80+14);//设置字符显示地址
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{
				if(light_limit<256)//判断光照强度阀值变量是否小于256
				light_limit++;//光照强度阀值变量自加1
				LCD_WriteCommand(0x80+12);//显示屏第一行设置字符显示地址,显示屏具体位置为12
				LCD_WriteData(0x30+light_limit/100);//12,显示光照强度阀值变量百位,显示屏具体位置为12
				LCD_WriteData(0x30+light_limit%100/10);//13,显示光照强度阀值变量十位,显示屏具体位置为13
				LCD_WriteData(0x30+light_limit%10);//14,显示光照强度阀值变量个位 ,显示屏具体位置为14
				LCD_WriteCommand(0x80+14);//显示屏第一行设置字符显示地址,显示屏具体位置为14
				delayms(250);//延时			
				while(!Anjian_jia);//按键消抖
			}				
		}
		
		//声音分贝阀值设置
		LCD_WriteCommand(0xC0+5);//显示屏第二行设置字符显示地址,显示屏具体位置为5
		LCD_WriteCommand(0x0f);//显示光标		
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{
			if(Anjian_jian==0)//判断减按键是否按下
			{
				if(Voice_limit>=0)//判断温度上限值是否大于0
				Voice_limit--;//温度上限值自减1
				LCD_WriteCommand(0xC0+3);//显示屏第二行设置字符显示地址,显示屏具体位置为3
				LCD_WriteData(0x30+Voice_limit/100);//3,显示声音分贝阀值变量百位,显示屏具体位置为3
				LCD_WriteData(0x30+Voice_limit%100/10);//4,显示声音分贝阀值变量十位,显示屏具体位置为4
				LCD_WriteData(0x30+Voice_limit%10);//5,显示声音分贝阀值变量个位,显示屏具体位置为5	 	
				LCD_WriteCommand(0xC0+5);//显示屏第二行设置字符显示地址,显示屏具体位置为5
				delayms(250);//
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{
				if(Voice_limit<256)//判断声音分贝阀值变量是否小于256
				Voice_limit++;//声音分贝阀值变量自加1
				LCD_WriteCommand(0xC0+3);//显示屏第二行设置字符显示地址,显示屏具体位置为3
				LCD_WriteData(0x30+Voice_limit/100);//3,显示声音分贝阀值变量百位,显示屏具体位置为3
				LCD_WriteData(0x30+Voice_limit%100/10);//4,显示声音分贝阀值变量十位,显示屏具体位置为4
				LCD_WriteData(0x30+Voice_limit%10);//5,显示声音分贝阀值变量个位,显示屏具体位置为5	 	
				LCD_WriteCommand(0xC0+5);//显示屏第二行设置字符显示地址,显示屏具体位置为5
				delayms(250);//
				while(!Anjian_jia);//按键消抖
			}				
		}
		
		//时段起始时间设置
		LCD_WriteCommand(0xC0+12);//显示屏第二行设置字符显示地址,显示屏具体位置为12	
		LCD_WriteCommand(0x0f);//显示光标	
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{		
			LCD_WriteCommand(0xC0+12);//显示屏第二行设置字符显示地址,显示屏具体位置为12	
			LCD_WriteCommand(0x0f);//显示光标	
			if(Anjian_jian==0)//判断减按键是否按下	
			{
				if(shiji_L>=0)//判断时段起始时间阀值变量是否大于0
				shiji_L--;//时段起始时间阀值变量自减1				
				LCD_WriteCommand(0xC0+11);//11,显示屏第二行设置字符显示地址,显示屏具体位置为11	
				LCD_WriteData(0x30+shiji_L%100/10);//12,显示时段起始时间阀值变量十位,显示屏具体位置为12
				LCD_WriteData(0x30+shiji_L%10);//13,显示时段起始时间阀值变量个位,显示屏具体位置为13
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{		
				LCD_WriteCommand(0xC0+12);//显示屏第二行设置字符显示地址,显示屏具体位置为12	
				LCD_WriteCommand(0x0f);//显示光标	
				if(shiji_L<(shiji_MAX-1))//判断时段起始时间阀值变量是否小于(时段结束时间阀值变量减1)
				shiji_L++;//时段起始时间阀值变量自加1
				LCD_WriteCommand(0xC0+11);//11,显示屏第二行设置字符显示地址,显示屏具体位置为11
				LCD_WriteData(0x30+shiji_L%100/10);//12,显示时段起始时间阀值变量十位,显示屏具体位置为12
				LCD_WriteData(0x30+shiji_L%10);//13,显示时段起始时间阀值变量个位,显示屏具体位置为13
				delayms(250);//延时
				while(!Anjian_jia);//按键消抖
			}				
		}
		
		//时段结束时间设置
		LCD_WriteCommand(0xC0+15);//显示屏第二行设置字符显示地址,显示屏具体位置为15
		LCD_WriteCommand(0x0f);//显示光标	
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		while(Set_key!=0)//判断设置项调整按键是否松开
		{		
			LCD_WriteCommand(0xC0+15);//显示屏第二行设置字符显示地址,显示屏具体位置为15	
			LCD_WriteCommand(0x0f);//显示光标	
			if(Anjian_jian==0)//判断减按键是否按下	
			{
				if(shiji_MAX>(shiji_L+1))//判断时段结束时间阀值变量是否大于(时段起始时间阀值变量加1)
				shiji_MAX--;//时段结束时间阀值变量自减1				
				LCD_WriteCommand(0xC0+14);//14,显示屏第二行设置字符显示地址,显示屏具体位置为14
				LCD_WriteData(0x30+shiji_MAX%100/10);//14,时段结束时间阀值变量十位,显示屏具体位置为14
				LCD_WriteData(0x30+shiji_MAX%10);//15,时段结束时间阀值变量个位,显示屏具体位置为15
				delayms(250);//延时
				while(!Anjian_jian);//按键消抖
			}
			if(Anjian_jia==0)//判断加按键是否按下
			{		
				LCD_WriteCommand(0xC0+15);//显示屏第二行设置字符显示地址,显示屏具体位置为15	
				LCD_WriteCommand(0x0f);//显示光标	
				if(shiji_MAX<24)//判断时段结束时间阀值变量是否小于24
				shiji_MAX++;//时段结束时间阀值变量自加1
				LCD_WriteCommand(0xC0+14);//14,显示屏第二行设置字符显示地址,显示屏具体位置为14
				LCD_WriteData(0x30+shiji_MAX%100/10);//14,时段结束时间阀值变量十位,显示屏具体位置为14
				LCD_WriteData(0x30+shiji_MAX%10);//15,时段结束时间阀值变量个位,显示屏具体位置为15
				delayms(250);//延时
				while(!Anjian_jia);//按键消抖
			}				
		}
		delayms(10);//延时
		while(!Set_key);//判断设置项调整按键是否松开
		delayms(10);//延时
		LCD_WriteCommand(0x0c);//清屏

		temp=(XS_shiji_miao)/10*16+(XS_shiji_miao)%10;
		DS1302_WriteByte(0x8e,0x00);
		DS1302_WriteByte(0x80,0x00|temp);//miao数据写入DS1302
		DS1302_WriteByte(0x8e,0x80);

		}
		return 0;//没有按键按下
}	

void LED_Work()//LED灯工作函数
{ 
	//判断是否结束过了白天时间段
	if((XS_shiji_shi>=BaiTiao_Qizhi)&&(XS_shiji_shi<=BaiTiao_Jieshu))//判断时间的小时值同时满足是否大于等于白天起止时间和是否大于白天结束时间
	{
		WanShang_flag = 1;//晚上时间段标志位等于1
	}
	else
	{
		WanShang_flag = 0;//时间段标志位等于0
	}

	//晚上时间工作模式
	if( WanShang_flag == 0)//判断到了晚上时间段
	{   
			if((light<light_limit)||(Voice>Voice_limit))//判断是否满足实时光照值小于光照阀值或者是实时声音分贝大于声音分贝阀值变量,
		{
			//LED灯10秒关闭
			if(T0Count>=200)//判断是否开始计时10秒
			{
 				TR0 = 0;		//定时器关闭计时
				LED = 1;//LED灯关闭
      }
			else
			{
				LED = 0;//LED灯打开
				TR0 = 1;		//定时器0开始计时
      }
		}	
		else
		{
				LED = 1;//LED灯关闭
				T0Count = 0; //计时变量清零
		}

	}
	
	//时段LED灯常亮工作模式
	if((XS_shiji_shi>=shiji_L)&&(XS_shiji_shi<shiji_MAX))//判断实时时间是否大于等于时段起始时间变量或者实时时间是否小于等于时段结束时间变量
	{
		LED = 0;//LED灯打开
	}
}
void Initial_interface()//初始界面显示函数
{	
	//初始显示界面第一行显示
	LCD_WriteCommand(0x80);//显示屏第一行显示位置
	LCD_WriteData(0x30+XS_shiji_shi%100/10);//1,显示显示时间_时变量十位
	LCD_WriteData(0x30+XS_shiji_shi%10);//2,显示显示实时时间_时变量个位
	LCD_WriteData(':');//3,显示:
	LCD_WriteData(0x30+XS_shiji_fen%100/10);//4,显示显示时间_分变量十位
	LCD_WriteData(0x30+XS_shiji_fen%10);//5,显示显示声音实时时间_分变量个位
	LCD_WriteData(':');//6,显示:
	LCD_WriteData(0x30+XS_shiji_miao%100/10);//7,显示显示时间_秒变量十位
	LCD_WriteData(0x30+XS_shiji_miao%10);//8,显示显示时间_秒变量十位
	LCD_WriteData(' ');//9,显示空白
	LCD_WriteData(' ');//10,显示空白
	LCD_WriteData(' ');//11,显示空白
	LCD_WriteData(' ');//12,显示空白
	LCD_WriteData(' ');//13,显示空白
	LCD_WriteData(' ');//14,显示空白
	LCD_WriteData(' ');//15,显示空白
	//初始显示界面第二行显示
	LCD_WriteCommand(0xC0);//显示屏第二行显示位置
	LCD_WriteData('V');//1,显示“V”
	LCD_WriteData('o');//2,显示“o”
	LCD_WriteData('i');//3,显示“i”
	LCD_WriteData('c');//4,显示“c”
	LCD_WriteData('e');//5,显示“e”
	LCD_WriteData(':');//6,显示“:”
	LCD_WriteData(0x30+Voice/100);//7,显示实时声音分贝值变量百位
	LCD_WriteData(0x30+Voice%100/10);//8,显示实时声音分贝值变量十位
	LCD_WriteData(0x30+Voice%10);//9,显示实时声音分贝值变量个位
	LCD_WriteData(' ');	//10,显示空白
	LCD_WriteData('G');//11
	LCD_WriteData('Z');//12
	LCD_WriteData(':');//13
	LCD_WriteData(0x30+light/100);//14,显示实时光照值变量百位
	LCD_WriteData(0x30+light%100/10);//15,显示实时光照值变量十位
	LCD_WriteData(0x30+light%10);//16,显示实时光照值变量个位
}
void Timer0Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TH0=(65536-50000)/256;//设置定时初值
	TL0=(65536-50000)%256;//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0关闭计时
	ET0=1;
	EA=1;
	PT0=0;
}

//定时器中断函数
void Timer0_Routine() interrupt 1
{

	TH0=(65536-50000)/256;//设置定时初值
	TL0=(65536-50000)%256;//设置定时初值
	T0Count++;

}

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值