当前位置: 首页 > news >正文

基于51单片机教室红外计数灯光控制—可蓝牙控制

基于51单片机智能教室灯光

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

本系统由STC89C52单片机+时钟芯片DS1302+液晶屏LCD1602+光敏电阻+红外对管+LED灯模块+按键模块+蓝牙模块构成

具体功能:

1.四个LED模拟教室灯光;

2.使用两个红外对管检测人进出教室,并统计;

3.LCD1602实时显示日期时间和统计的人数及光照强度;

4.按键设定定时时间段,在这时间段内开启自动照明功能;

5.光敏电阻检测光线,光线暗则打开自动照明;

6.人数<10:亮1个;10≤人数<20:亮2个;20≤人数<30:亮3个;30≤人数:全亮;

7.可以切换手动模式,手动开灯、手动调节亮度;

8.可以无线蓝牙按键控制

添加图片注释,不超过 140 字(可选)

程序

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***微信公众号:木子单片机********/
uchar time_data[7];
uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //数据的地址
uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};uchar code table1[]="L: - |2000/00/00";
uchar code table2[]="R:   |00:00:00 0";
uchar code table3[]="                ";			 //清屏内容
uchar code table4[]="  Set Real Time ";
uchar code table5[]="  Set Open Time ";
uchar code table6[]="   Start Time:  ";
uchar code table7[]="    00:00:00    ";
uchar code table8[]="    End Time:   ";
uchar code table9[]="Date: 2000/00/00";
uchar code table0[]="Time: 00:00:00 0";
uchar value[]="C:000 L: \r\n";bit Adjust;			  //调节标志位,=1表示进入调节模式,=0是正常模式
bit Auto_flg;		  //自动模式标志位,=1表示手动模式,=0是自动模式
bit Timer;
bit SELT_flg;
bit ENTER_flg;
bit UP_flg;
bit DOWN_flg;	  								
/***微信公众号:木子单片机********/
sbit rs=P1^0;		  //LCD1602
sbit rw=P1^1; 		  //LCD1602
sbit e=P1^2;		  //LCD1602
sbit sck=P2^5;		  //时钟端口
sbit io=P2^6;		  //时钟端口
sbit rst=P2^7;		  //时钟端口
sbit SELT =P1^6;	  //设置键
sbit ENTER=P1^7;	  //确认键
sbit UP   =P2^4;	  //加键
sbit DOWN =P2^3;	  //减键
sbit AUTO_LED=P1^3;	  //自动模式灯接口
sbit HAND_LED=P1^5;	  //手动灯接口
sbit LAMP1=P3^4;	  //灯接口
sbit LAMP2=P3^5;	  //灯接口
sbit LAMP3=P3^6;	  //灯接口
sbit LAMP4=P3^7;	  //灯接口
sbit CS   =P2^0;								//ADC0832
sbit Clk  =P2^2;						    	//ADC0832
sbit DATI =P2^1;								//ADC0832
sbit DATO =P2^1;								//ADC0832uchar Select_num;	  //设置按键按下次数
uchar Enter_num;	  //确认按键按下次数
uchar Switch_num;	  //手动开关按键按下次数
char Year,Month,Day;
float Hour,Minute,Second;			//时间设置值
char Week;		
float Hour_H,Minute_H,Second_H;  					//设置结束时间
float Hour_L,Minute_L,Second_L;  					//设置开始时间
int Value1;											//人数
uchar IN1_flag=0;
uchar OUT1_flag=0;
uint Count;           //T0定时器中断计数次数
uchar Miao;
uint Count1;           //T1定时器中断计数次数
uchar dat=0x00;           						//AD值
uchar CH;       								//通道变量
char num;			   							//PWM中断次数
char pwm;			   							//脉宽参数 0-10 开机默认中间值
char Light;										//光线强度uchar xdata UART0_Data[32];
uchar UART0_Len=1;void read_rtc();/***********************************************液晶屏LCD1602**********************************************************************/
void delay1(uint z)			  		//延时0.1ms函数
{uint x,y;for(x=z;x>0;x--)for(y=3;y>0;y--);
}void write_com(uchar com)			 //写指令函数
{rw=0;delay1(5);rs=0;delay1(5);e=1;delay1(5);P0=com;delay1(5);e=0;delay1(5);	
}void write_date(uchar date)			//写数据函数
{									rw=0;delay1(5);rs=1;delay1(5);e=1;delay1(5);P0=date;delay1(5);e=0;delay1(5);	
}void init()						    //初始化函数
{	uchar num;	e=0;						    // 时序表e初始为0write_com(0x38);		        //设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);				//设置光标write_com(0x06);				//光标自动加1,光标输入方式write_com(0x01);				//清屏write_com(0x80);				//设置初始显示位置for(num=0;num<16;num++){write_date(table1[num]);delay1(5);}write_com(0x80+0x40);for(num=0;num<16;num++){write_date(table2[num]);delay1(5);}					  
}void SetTime_dispaly(uchar add,uchar dat)	 //第一个:参数的地址,第二个:参数的内容
{uchar shi,ge;shi=dat/10;							//把十位提取出来ge=dat%10;							//把个位提取出来write_com(add);			   	 		//要写的地址write_date(0x30+shi);				//十位的内容   1602字符库write_date(0x30+ge);				//个位的内容   1602字符库
}void Week_dispaly(uchar add,uchar dat)	//第一个:参数的地址,第二个:参数的内容
{write_com(add);						//要写的地址write_date(0x30+dat);				//十位的内容   1602字符库
}
void Date_dispaly(uchar add,uchar dat)	 //第一个:参数的地址,第二个:参数的内容
{uchar shi,ge;shi=dat/16;							//把十位提取出来ge=dat%16;							//把个位提取出来write_com(add+3);			   	 	//要写的地址write_date(0x30+shi);				//十位的内容   1602字符库write_date(0x30+ge);				//个位的内容   1602字符库				   
}
void Write_Data(uchar add,uint date)  //把数据写到对应的位置 为3位数
{uchar bai,shi,ge;bai=date/100;shi=date%100/10;ge=date%10;write_com(0x80+add);write_date(0x30+bai);write_date(0x30+shi);				   write_date(0x30+ge);				    
}
void LCD_Display_String(unsigned char line,unsigned char *string)
{ 										//液晶屏显示内容,把要显示的内容写到对应的位置unsigned char i;unsigned char address=0;if(line==1){address=0x80;	 				//0X80是第1行的第1个位置  ,0x81第2位}else if(line==2){address=0x80+0x40;  			//0X80+0x40是第2行的第1个位置  ,0X80+0x40+1是第2行第2位}for(i=0;i<16;i++){write_com(address);write_date(string[i]);address++;} 
}void Time_Display(void)
{read_rtc();Date_dispaly(0x80+0x40+9,time_data[6]);  //显示秒Date_dispaly(0x80+0x40+6,time_data[5]);	 //显示分Date_dispaly(0x80+0x40+3,time_data[4]);	 //显示时Date_dispaly(0x80+11,time_data[3]);		 //显示日Date_dispaly(0x80+8,time_data[2]);		 //显示月Week_dispaly(0x80+0x40+15,time_data[1]-1);  //显示周  0表示星期天,1表示星期一......6表示星期六 芯片读出的数据表示1为一周的第一天星期天,故做减一处理Date_dispaly(0x80+5,time_data[0]);		 //显示年//	Year/10*16+Year%10Year=time_data[0]/16*10+time_data[0]%16;Week=time_data[1]/16*10+time_data[1]%16-1;Month=time_data[2]/16*10+time_data[2]%16;Day=time_data[3]/16*10+time_data[3]%16;Hour=time_data[4]/16*10+time_data[4]%16;Minute=time_data[5]/16*10+time_data[5]%16;Second=time_data[6]/16*10+time_data[6]%16;}/*******************************************时钟芯片DS1302*****************************************************/
void write_ds1302_byte(uchar dat)
{uchar i;for(i=0;i<8;i++){sck=0;io=dat&0x01;					   //准备数据,从最低位开始dat=dat>>1;sck=1;}
}void write_ds1302(uchar add,uchar dat)
{rst=0;_nop_();  						//CPU原地踏步sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);		    //传地址write_ds1302_byte(dat);		    //传数据rst=0;     						//不受其他影响_nop_();io=1;						   //释放sck=1;
}uchar read_ds1302(uchar add)
{uchar i,value;rst=0;_nop_();  //CPU原地踏步sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sck=0;if(io)value=value|0x80;sck=1;}rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;
}void set_rtc()			          //设置时间
{uchar i,j;for(i=0;i<7;i++)			 //转换BCD码{j=time_data[i]/10;time_data[i]=time_data[i]%10;time_data[i]=time_data[i]+j*16;}write_ds1302(0x8e,0x00);	  //去除写保护for(i=0;i<7;i++){write_ds1302(write_add[i],time_data[i]);}write_ds1302(0x8e,0x80);      //加写保护
}void read_rtc()
{uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]);	//最终读出来的数 16进制}
}/*************************************************按键****************************************************************/
void Keyscan(void)
{if((SELT==0)||(SELT_flg==1)){delay1(50);if(SELT==0){while(!SELT);}SELT_flg=0;Select_num++;						//设置键按下一次Adjust=1;							//进入调节模式if(Select_num==1){LCD_Display_String(1,table4);LCD_Display_String(2,table5);write_com(0x80+0);				//写 >>write_date(0x3e);write_com(0x80+1);				//写 >>write_date(0x3e);Enter_num=0;}if(Select_num==2){LCD_Display_String(1,table4);LCD_Display_String(2,table5);write_com(0x80+0x40+0);				//写 >>write_date(0x3e);write_com(0x80+0x40+1);				//写 >>write_date(0x3e);Enter_num=0;}if(Select_num==3){LCD_Display_String(1,table1);LCD_Display_String(2,table2);Select_num=0;Enter_num=0;					Adjust=0;}write_com(0x0c);									//光标不再闪烁Enter_num=0;}if((ENTER==0)||(ENTER_flg==1)){delay1(50);if(ENTER==0){while(!ENTER);}ENTER_flg=0;			Enter_num++;if(Select_num==0)					//模式切换{Auto_flg=~Auto_flg;				//模式切换if(Auto_flg==0)					//自动模式{AUTO_LED=0;					//自动灯亮HAND_LED=1;}if(Auto_flg==1)					//手动模式{AUTO_LED=1;					HAND_LED=0;					//手动灯亮LAMP1=1;					//关灯LAMP2=1;LAMP3=1;LAMP4=1;pwm=5;}}if(Select_num==1)					//设置实时时间{if(Enter_num==1){LCD_Display_String(1,table9);LCD_Display_String(2,table0);SetTime_dispaly(0x80+8,Year);SetTime_dispaly(0x80+11,Month);SetTime_dispaly(0x80+14,Day);SetTime_dispaly(0x80+0x40+6,Hour);SetTime_dispaly(0x80+0x40+9,Minute);SetTime_dispaly(0x80+0x40+12,Second);Week_dispaly(0x80+0x40+15,Week);write_com(0x80+8);			//光标闪烁地址,停留在年的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==2){write_com(0x80+11);			//光标闪烁地址,停留在月的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==3){write_com(0x80+14);			//光标闪烁地址,停留在日的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==4){write_com(0x80+0x40+6);		//光标闪烁地址,停留在时的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==5){write_com(0x80+0x40+9);		//光标闪烁地址,停留在分的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==6){write_com(0x80+0x40+12);	//光标闪烁地址,停留在秒的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==7){write_com(0x80+0x40+15);	//光标闪烁地址,停留在星期的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==8){Enter_num=0;write_com(0x0c);			//光标不再闪烁LCD_Display_String(1,table1);LCD_Display_String(2,table2);Week++;                     //按键设置时,比如设置星期6,此时显示会被减一处理(void Time_Display(void)函数)显示5,此处加回去,保证设置多少就显示多少time_data[0]=Year;///10*16+Year%10;time_data[1]=Week;///10*16+Week%10;time_data[2]=Month;///10*16+Month%10;time_data[3]=Day;///10*16+Day%10;time_data[4]=Hour;///10*16+Hour%10;time_data[5]=Minute;///10*16+Minute%10;time_data[6]=Second;///10*16+Second%10;set_rtc();					 //设置时间Select_num=0;Adjust=0;}}if(Select_num==2)					//设置开启时间{if(Enter_num==1){LCD_Display_String(1,table6);LCD_Display_String(2,table7);SetTime_dispaly(0x80+0x40+4,Hour_L);SetTime_dispaly(0x80+0x40+7,Minute_L);SetTime_dispaly(0x80+0x40+10,Second_L);write_com(0x80+0x40+4);		//光标闪烁地址,停留在时的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==2){write_com(0x80+0x40+7);		//光标闪烁地址,停留在分的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==3){write_com(0x80+0x40+10);	//光标闪烁地址,停留在秒的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==4){write_com(0x0c);			//光标不再闪烁LCD_Display_String(1,table8);LCD_Display_String(2,table7);	SetTime_dispaly(0x80+0x40+4,Hour_H);SetTime_dispaly(0x80+0x40+7,Minute_H);SetTime_dispaly(0x80+0x40+10,Second_H);write_com(0x80+0x40+4);		//光标闪烁地址,停留在时的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==5){write_com(0x80+0x40+7);		//光标闪烁地址,停留在分的位置上					write_com(0x0f);			//光标闪烁}if(Enter_num==6){write_com(0x80+0x40+10);	//光标闪烁地址,停留在秒的位置上					write_com(0x0f);			//光标闪烁}		if(Enter_num==7){Enter_num=0;write_com(0x0c);			//光标不再闪烁LCD_Display_String(1,table1);LCD_Display_String(2,table2);Select_num=0;Adjust=0;}}}if((UP==0)||(UP_flg==1)){delay1(50);if(UP==0){while(!UP);}UP_flg=0;if(Select_num==0){if(Auto_flg==1)							//手动模式{Switch_num++;				//按下次数增加if(Switch_num==1)			//按下一次,开一盏灯{LAMP1=0;LAMP2=1;LAMP3=1;LAMP4=1;}if(Switch_num==2)			//按下二次,开二盏灯{LAMP1=0;LAMP2=0;LAMP3=1;LAMP4=1;}if(Switch_num==3)			//按下3次,开3盏灯{LAMP1=0;LAMP2=0;LAMP3=0;LAMP4=1;}if(Switch_num==4)			//按下4次,开4盏灯{LAMP1=0;LAMP2=0;LAMP3=0;LAMP4=0;}if(Switch_num==5)			//按下5次,开0盏灯{LAMP1=1;LAMP2=1;LAMP3=1;LAMP4=1;Switch_num=0;			//次数清除}}}if(Select_num==1){if(Enter_num==1){Year++;if(Year>99)Year=0;SetTime_dispaly(0x80+8,Year);write_com(0x80+8);								write_com(0x0f);			}if(Enter_num==2){Month++;if(Month>12)Month=1;SetTime_dispaly(0x80+11,Month);write_com(0x80+11);								write_com(0x0f);							  }if(Enter_num==3){Day++;if(Day>31)Day=1;SetTime_dispaly(0x80+14,Day);write_com(0x80+14);								write_com(0x0f);}if(Enter_num==4){Hour++;if(Hour>23)Hour=0;SetTime_dispaly(0x80+0x40+6,Hour);write_com(0x80+0x40+6);								write_com(0x0f);}if(Enter_num==5){Minute++;if(Minute>59)Minute=0;SetTime_dispaly(0x80+0x40+9,Minute);write_com(0x80+0x40+9);								write_com(0x0f);}if(Enter_num==6){Second++;if(Second>59)Second=0;SetTime_dispaly(0x80+0x40+12,Second);write_com(0x80+0x40+12);								write_com(0x0f);}if(Enter_num==7){Week++;if(Week>6)Week=0;Week_dispaly(0x80+0x40+15,Week);write_com(0x80+0x40+15);								write_com(0x0f);}}if(Select_num==2){				if(Enter_num==1){Hour_L++;if(Hour_L>23)Hour_L=0;SetTime_dispaly(0x80+0x40+4,Hour_L);write_com(0x80+0x40+4);								write_com(0x0f);}if(Enter_num==2){Minute_L++;if(Minute_L>59)Minute_L=0;SetTime_dispaly(0x80+0x40+7,Minute_L);write_com(0x80+0x40+7);								write_com(0x0f);}if(Enter_num==3){Second_L++;if(Second_L>59)Second_L=0;SetTime_dispaly(0x80+0x40+10,Second_L);write_com(0x80+0x40+10);								write_com(0x0f);}if(Enter_num==4){Hour_H++;if(Hour_H>23)Hour_H=0;SetTime_dispaly(0x80+0x40+4,Hour_H);write_com(0x80+0x40+4);								write_com(0x0f);}if(Enter_num==5){Minute_H++;if(Minute_H>59)Minute_H=0;SetTime_dispaly(0x80+0x40+7,Minute_H);write_com(0x80+0x40+7);								write_com(0x0f);}if(Enter_num==6){Second_H++;if(Second_H>59)Second_H=0;SetTime_dispaly(0x80+0x40+10,Second_H);write_com(0x80+0x40+10);								write_com(0x0f);}				}}if((DOWN==0)||(DOWN_flg==1)){delay1(50);if(DOWN==0){while(!DOWN);}DOWN_flg=0;if(Select_num==0){if(Auto_flg==1)					//手动模式{pwm++;						//亮度变化if(pwm>9)pwm=0;}}if(Select_num==1){if(Enter_num==1){Year--;if(Year<0)Year=99;SetTime_dispaly(0x80+8,Year);write_com(0x80+8);								write_com(0x0f);}if(Enter_num==2){Month--;if(Month<1)Month=12;SetTime_dispaly(0x80+11,Month);write_com(0x80+11);								write_com(0x0f);}if(Enter_num==3){Day--;if(Day<1)Day=31;SetTime_dispaly(0x80+14,Day);write_com(0x80+14);								write_com(0x0f);}if(Enter_num==4){Hour--;if(Hour<0)Hour=23;SetTime_dispaly(0x80+0x40+6,Hour);write_com(0x80+0x40+6);								write_com(0x0f);}if(Enter_num==5){Minute--;if(Minute<0)Minute=59;SetTime_dispaly(0x80+0x40+9,Minute);write_com(0x80+0x40+9);								write_com(0x0f);}if(Enter_num==6){Second--;if(Second<0)Second=59;SetTime_dispaly(0x80+0x40+12,Second);write_com(0x80+0x40+12);								write_com(0x0f);}if(Enter_num==7){Week--;if(Week<0)Week=6;Week_dispaly(0x80+0x40+15,Week);write_com(0x80+0x40+15);								write_com(0x0f);}		}if(Select_num==2){if(Enter_num==1){Hour_L--;if(Hour_L<0)Hour_L=23;SetTime_dispaly(0x80+0x40+4,Hour_L);write_com(0x80+0x40+4);								write_com(0x0f);}if(Enter_num==2){Minute_L--;if(Minute_L<0)Minute_L=59;SetTime_dispaly(0x80+0x40+7,Minute_L);write_com(0x80+0x40+7);								write_com(0x0f);}if(Enter_num==3){Second_L--;if(Second_L<0)Second_L=59;SetTime_dispaly(0x80+0x40+10,Second_L);write_com(0x80+0x40+10);								write_com(0x0f);}if(Enter_num==4){Hour_H--;if(Hour_H<0)Hour_H=23;SetTime_dispaly(0x80+0x40+4,Hour_H);write_com(0x80+0x40+4);								write_com(0x0f);}if(Enter_num==5){Minute_H--;if(Minute_H<0)Minute_H=59;SetTime_dispaly(0x80+0x40+7,Minute_H);write_com(0x80+0x40+7);								write_com(0x0f);}if(Enter_num==6){Second_H--;if(Second_H<0)Second_H=59;SetTime_dispaly(0x80+0x40+10,Second_H);write_com(0x80+0x40+10);								write_com(0x0f);}}}	
}
****//完整资料
***//***微信公众号:木子单片机********/
void Open(void)
{float Now;float Set_L,Set_H;Now=Hour+Minute/60+Second/3600;				  		//把实时时间化成小时为单位Set_L=Hour_L+Minute_L/60+Second_L/3600;		  		//把设置下限时间化成小时为单位Set_H=Hour_H+Minute_H/60+Second_H/3600;		  		//把设置上限时间化成小时为单位if((Now>=Set_L)&(Now<=Set_H))				  		//实时时间在上下限时间范围内Timer=1;elseTimer=0;		
} 
/*************************************ADC0832*****************************************/
uchar adc0832(uchar CH)					// AD转换子程序
{uchar i,test,adval;adval=0x00;test=0x00;Clk=0;       						//初始化DATI=1;_nop_();CS=0;_nop_();Clk=1;_nop_();if(CH==0x00)      					//通道选择{Clk=0;DATI=1;      //通道0的第一位_nop_();Clk=1;_nop_();Clk=0;DATI=0;      //通道0的第二位_nop_();Clk=1;_nop_();} else{Clk=0;DATI=1;      //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DATI=1;      //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0;DATI=1;for(i=0;i<8;i++)      //读取前8位的值{_nop_();adval<<=1;Clk=1;_nop_();Clk=0;if(DATO)adval|=0x01;elseadval|=0x00;}for(i=0;i<8;i++)      //读取后8位的值{test>>=1;if(DATO)test|=0x80;else test|=0x00;_nop_();Clk=1;_nop_();Clk=0;}if(adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉dat=test;_nop_();CS=1;        			//释放ADC0832DATO=1;Clk=1;return dat;
}
void Light_Check(void)
{dat=adc0832(CH);						//采集光线电压if((dat>=0)&(dat<20))					//根据采到的电压值给定光线强度,电压越高,光线强度越低{Light=9;}				   if((dat>=20)&(dat<40)){Light=8;}if((dat>=40)&(dat<60)){Light=7;}if((dat>=60)&(dat<80)){Light=6;}if((dat>=80)&(dat<100)){Light=5;}if((dat>=100)&(dat<120)){Light=4;}if((dat>=120)&(dat<140)){Light=3;}if((dat>=140)&(dat<160)){Light=2;}if((dat>=160)&(dat<180)){Light=1;}if((dat>=180)&(dat<=255)){Light=0;}if(Auto_flg==0)			   				//自动模式下{if((dat>=0)&(dat<20))					{pwm=0;}				   if((dat>=20)&(dat<40)){pwm=1;}if((dat>=40)&(dat<60)){pwm=2;}if((dat>=60)&(dat<80)){pwm=3;}if((dat>=80)&(dat<100)){pwm=4;}if((dat>=100)&(dat<120)){pwm=5;}if((dat>=120)&(dat<140)){pwm=6;}if((dat>=140)&(dat<160)){pwm=7;}if((dat>=160)&(dat<180)){pwm=8;}if((dat>=180)&(dat<=255)){pwm=9;}}Week_dispaly(0x80+2,Light);				//显示光线强度Week_dispaly(0x80+4,pwm);				//显示亮灯强度
}
/*****************************************人数统计**************************************************************/
void intinit(void)				 //外部中断0初始化
{	EA=1;					  	 //打开总中断EX0=1;					  	 //中断允许位IT0=1;					  	 //外部中断0触发方式为下降沿触发EX1=1;					  	 //中断允许位IT1=1;					  	 //外部中断0触发方式为下降沿触发
}void int1 () interrupt 2   		//外红外对管
{	if(IN1_flag==0){OUT1_flag=1;TR0=1;					 //开启定时器开始计时,如果3秒内只触发一个则清零,防止误触发}if(IN1_flag==1){Value1--;				//人数减少if(Value1<0)			//如果人数计数小于0,变为最小0Value1=0;IN1_flag=0;				//清零OUT1_flag=0;TR0=0;					 //关闭定时器Count=0;Miao=0;}
}
void int0 () interrupt 0   		//内红外对管
{	if(OUT1_flag==0){IN1_flag=1;TR0=1;					 //开启定时器开始计时,如果3秒内只触发一个则清零,防止误触发}if(OUT1_flag==1){Value1++;				 //人数增加if(Value1>=999)			 //如果人数计数到999,变为最大999Value1=999;OUT1_flag=0;			 //清零IN1_flag=0;TR0=0;					 //关闭定时器Count=0;Miao=0;}
}

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

排阻:8*10K;瓷片电容:104;

插件电容:2.2uF/50V;

插件电容:100uF/16V;

LED灯;纽扣电池座;

开关;电源接口;瓷片电容:30;

蓝牙模块:HC-05;液晶屏:LCD1602;

红外接收管;红外发射管;

光敏电阻:100k;蓝白可调电阻:10K;

插件电阻:4.7K;插件电阻:510;

插件电阻:10K;插件电阻:100k;

插件电阻:100;按键:SW-PB;

万用板:9*15cm; 时钟芯片:DS1302;

模数转换器:ADC0832;运放:LM393;

晶振:32768Hz;晶振:11.0592M;

12M晶振;导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

一万两千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

全部资料包括程序(含注释)、仿真源文件 、AD原理图、任务书、PCB、设计报告、流程图、实物图、元件清单等。具体内容如下,全网最全! !

点赞分享一起学习成长。

相关文章:

基于51单片机教室红外计数灯光控制—可蓝牙控制

基于51单片机智能教室灯光 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本系统由STC89C52单片机时钟芯片DS1302液晶屏LCD1602光敏电阻红外对管LED灯模块按键模块蓝牙模块构成 具体…...

HTTPS、SSL证书是啥?网站“安全小锁”的入门科普

你有没有发现&#xff0c;浏览网页时&#xff0c;有些网站地址栏前面会出现一个小锁的图标&#x1f512;&#xff0c;而有些网站却没有&#xff1f;这个小锁其实代表着网站用了“HTTPS”&#xff0c;是比普通“HTTP”更安全的协议。今天&#xff0c;我们就来聊聊HTTPS、SSL证书…...

大模型备案中的安全考量:筑牢数字时代的安全防线

在数字化浪潮席卷全球的当下&#xff0c;大模型技术凭借强大的数据分析、模式识别与语言理解生成能力&#xff0c;成为推动产业变革、提升社会运转效率的关键力量。从智能客服降本增效&#xff0c;到医疗影像精准诊断&#xff0c;再到金融风险智能预测&#xff0c;大模型正重塑…...

Linux句柄数过多问题排查

以下是Linux句柄数过多问题的排查与解决方法整理&#xff1a; 一、检测句柄使用情况 1‌.查看系统限制‌ 单个进程限制&#xff1a;ulimit -n 系统级总限制&#xff1a;cat /proc/sys/fs/file-max 2‌.统计进程占用量‌ 查看指定进程&#xff1a;lsof -p <PID> | wc -…...

Python训练第三十天

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 总结&#xff1a;导入包的核心就是找到目录&#xff0c;只有理解了py…...

Java资源管理与防止泄漏:从SeaTunnel源码看资源释放

资源管理是 Java 开发中常被忽视却至关重要的一环。本文从 SeaTunnel 案例出发&#xff0c;探讨 Java 中如何正确管理资源&#xff0c;防止资源泄漏。 SeaTunnel 中的一次修复 Apache SeaTunnel 项目中的 HiveSink 组件曾存在一个典型的资源泄漏隐患。修复前后的代码对比如下…...

Notepad++ 学习(三)使用python插件编写脚本:实现跳转指定标签页(自主研发)

目录 一、先看成果二、安装Python Script插件三、配置Python脚本四、使用脚本跳转标签页方法一&#xff1a;通过菜单运行方法二&#xff1a;设置快捷键&#xff08;推荐&#xff09; 五、注意事项六、进阶使用 官网地址&#xff1a; https://notepad-plus-plus.org/Python Scri…...

PYTHON训练营DAY30

库的导入 一、导入整个 import 库 二、从库中导入特征项 from 库 import XXX 三、非标准导入&#xff1a;导入整个库 from 库 import * 四、导入自定义的库 &#xff08;一&#xff09;项目 创建一个打招呼的库 # greet.py def say_hello(name):return f"你好&a…...

Linux 文件(2)

文章目录 1. 文件描述符1.1 文件描述符是什么1.2 文件描述符如何分配 2 重定向2.1 输出重定向2.2 输入重定向2.3 使用dup2进行重定向 3. 文件、父子进程和进程替换 1. 文件描述符 1.1 文件描述符是什么 什么是文件描述符呢&#xff1f; 我们先来看之前所介绍的系统级别的文件…...

netcore项目使用winforms与blazor结合来开发如何按F12,可以调出chrome devtool工具辅助开发

就是像在开发网页那样&#xff0c;可以使用devtool工具辅助开发。可查看页面css&#xff0c;js等。我在网上看解决办法。没一个有用的。自己找了一个。不需要单独在页面写多余的代码 我的program.cs中有服务注册代码增加 3行代码。 #if DEBUGservices.AddBlazorWebViewDevelo…...

CSS attr() 函数详解

attr() 是 CSS 中的一个函数&#xff0c;用于获取 HTML 元素的属性值并在样式中使用。虽然功能强大&#xff0c;但它的应用有一些限制和注意事项。 基本语法 element::pseudo-element {property: attr(attribute-name); } 可用场景 1. 在伪元素的 content 属性中使用&#…...

人生如戏、戏如人生

今早&#xff0c;6&#xff1a;30起床给一家人弄早餐&#xff0c;然后听到了老公的一声大喊&#xff1a;”半小时了&#xff0c;你干什么了“&#xff0c;原来孩子说她在理书包&#xff0c;被老公骂了。 最近几天&#xff0c;老公脾气变得很差&#xff0c;孩子每天都会被老公骂…...

Java迭代器知识点详解

在 Java 编程中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如 List、Set、Map 等&#xff09;元素的接口。它提供了一种统一的方式来访问集合中的元素&#xff0c;而无需暴露集合的内部结构。以下是关于 Java 迭代器的详细知识点&#…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷

近日&#xff0c;苏州自动驾驶巴士线路——阳澄数谷示范线正式上线&#xff0c;即日起向全民免费开放试乘体验&#xff01; 在苏州工业园区地铁3号线倪浜•阳澄数谷站外&#xff0c;一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是&#xff0c;小巴造型奇…...

Kotlin 协程

第一个协程程序 协程是可暂停计算的一个实例。它在概念上类似于线程&#xff0c;因为它需要运行一个代码块&#xff0c;该代码块与其他代码并发运行。然而&#xff0c;协程并不绑定到任何特定的线程。它可以在一个线程中暂停执行&#xff0c;并在另一个线程中恢复执行。 协程…...

MySQL函数触发:函数处理与触发器自动化应用

引言 各位数据库爱好者们好&#xff01;今天我们要探索MySQL中两个强大的自动化工具——函数和触发器 &#x1f680;。函数就像数据库中的"瑞士军刀"&#xff0c;能帮你高效处理各种数据&#xff1b;而触发器则是数据库的"自动感应器"&#xff0c;能在数据…...

数据可视化热图工具:Python实现CSV/XLS导入与EXE打包

在数据分析工作中,热图(Heatmap)是一种非常直观的可视化工具,能够清晰展示数据矩阵中的数值分布和相关性。本文将介绍如何使用Python构建一个支持CSV/XLS文件导入、热图生成并可打包为EXE的桌面应用程序。 核心功能设计 我们的热图工具将包含以下核心功能: 支持CSV和Excel…...

CUDA Stream的进阶用法:流水线并行的资源竞争解决方案

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 引言&#xff1a;多任务推理场景的挑战 GPU在AI推理服务器的典型负载特征&#xff08;并行模…...

Eclipse Java 开发调优:如何让 Eclipse 运行更快?

Eclipse Java 开发调优&#xff1a;如何让 Eclipse 运行更快&#xff1f; 在 Java 开发领域&#xff0c;Eclipse 是一款被广泛使用的集成开发环境&#xff08;IDE&#xff09;。然而&#xff0c;随着项目的日益庞大和复杂&#xff0c;Eclipse 的运行速度可能会逐渐变慢&#x…...

大模型(1)——基本概念

文章目录 一、大模型的定义与概念二、大模型的原理与技术核心三、大模型的应用领域四、市面上常用的大模型1. 生成类模型&#xff08;文本/代码/图像&#xff09;2. 理解类模型&#xff08;文本/语义&#xff09;3. 多模态模型4. 国产大模型 五、总结与趋势 一、大模型的定义与…...

MYSQL故障排查和环境优化

一、MySQL故障排查 1. 单实例常见故障 &#xff08;1&#xff09;连接失败类问题 ERROR 2002 (HY000): Cant connect to MySQL server 原因&#xff1a;MySQL未启动或端口被防火墙拦截。 解决&#xff1a;启动MySQL服务&#xff08;systemctl start mysqld&#xff09;或开放…...

sts下载安装

windows下STS&#xff08;Spring Tools Suite&#xff0c;自带spring插件的eclipse&#xff09;的下载与安装_sts下载-CSDN博客Spring Boot安装与配置教程_spring boot安装配置-CSDN博客...

Baklib知识中台架构设计与智能服务实践

知识中台架构四库体系解析 现代企业知识管理系统的核心在于构建结构化知识资产池&#xff0c;Baklib通过独创的四库体系——知识库、流程库、案例库、模型库——实现知识资源的全生命周期管理。其中&#xff0c;知识库作为基础层&#xff0c;聚合文档、图谱等显性知识&#xf…...

TinyEngine 2.5版本正式发布:多选交互优化升级,页面预览支持热更新,性能持续跃升!

前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码…...

嵌入式系统:技术演进、应用领域发展趋势全面解析

嵌入式系统&#xff1a;技术演进、应用领域及发展趋势全面解析 一、引言 在当今数字化时代&#xff0c;嵌入式系统已悄然融入到我们生活的方方面面&#xff0c;从日常使用的智能手机、智能家电&#xff0c;到汽车中的各种控制系统&#xff0c;乃至工业生产中的自动化设备、航…...

软件工程-项目管理

进度管理 又叫时间管理&#xff0c;确定进度目标&#xff0c;在与质量、成本目标协调的基础上&#xff0c;实现工期目标 具体包括以下过程&#xff1a; 活动定义&#xff1a;确定完成各项交付成果需要展开的具体活动活动排序&#xff1a;活动之间的先后关系和逻辑关系活动资…...

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(二)爆炸效果修改图元类型

1. 爆炸效果 这是几何着色器中的一个常见应用&#xff0c;我们使用几何着色器来模拟爆炸效果。 我们希望将每个三角形沿其表面法向量向外移动&#xff0c;则实际上是将组成环面的三角形向外“爆炸”。 我们只需取三个顶点的法向量&#xff0c;然后将其相加并求平均&#xff…...

需求频繁变更?AI 驱动的自动化解决方案实践

在软件开发的实际场景中&#xff0c;需求频繁变更已成为困扰开发团队的常见难题。每一次需求变动&#xff0c;都意味着代码的重新编写、调试与测试&#xff0c;不仅消耗大量时间和人力成本&#xff0c;还可能引发一系列连锁反应&#xff0c;影响项目进度与质量。而飞算 JavaAI …...

ffmpeg转码后的视频有横条纹和彩虹横条等乱彩问题

原因&#xff1a;ffmpeg安装的时&#xff0c;./configure 添加了–disable-asm参数&#xff0c;导致色彩异常。 **解决方法&#xff1a;**移除该参数–disable-asm。 注意&#xff1a;不加该参数可能提示no yasm或nasm等问题&#xff0c;解决该问题即可。大多是环境变量没有配置…...

QT6 源(111):阅读与注释菜单栏 QMenuBar,进行属性与成员函数测试,信号与槽函数测试,并给出源码

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09; &#xff08;6&#xff09; &#xff08;7&#xff09;以下源代码来自于头文件 qmenubar . h &#xff1a; #ifndef QMENUBAR_H #defi…...

达梦数据库对json字段进行操作

在达梦数据库中&#xff0c;字段类型不能显式定义为JSON&#xff0c;通常以VARCHAR或TEXT类型存储JSON字符串&#xff0c;可以通过内置的JSON函数对JSON格式数据进行操作和条件过滤。 1. 创建表并插入JSON数据 假设字段类型为VARCHAR&#xff0c;存储JSON字符串&#xff1a; -…...

基于vue框架的东莞市二手相机交易管理系统5yz0u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,相机分类,二手相机 开题报告内容 基于FlaskVue框架的东莞市二手相机交易管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着数字技术的迅猛发展和摄影文化的广泛普及&#xff0c;相机已成为人们记录生活、表达创意的重要工…...

谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频

近期&#xff0c;谷歌旗下的 NotebookLM 即将推出一项令人瞩目的新功能 ——Sparks 视频概览。这一功能借助 Gemini 与 Deep Research 的强大能力&#xff0c;能够生成 1 - 3 分钟的 AI 视频&#xff0c;为用户带来全新的内容创作与信息获取体验。 NotebookLM&#xff1a;AI 笔…...

MCP详解

前言:AI能力跃迁的“最后一公里” 当前,大语言模型(LLMs)已展现出文本生成、逻辑推理等通用能力,但其与真实世界的交互仍存在瓶颈。传统模式下,开发者需为每个外部工具(如数据库、API、文件系统)编写定制化接口,导致开发周期长、兼容性差、安全风险高。而​​模型上下…...

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539&#xff1a;简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 模板题及讲解&#xff1a;洛谷 P3374 【模板】树状数组 【解题思路】 解法1&#xff1a;树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…...

设计模式-面试题

摘要&#xff1a; 1、通俗易懂&#xff0c;适合小白 2、仅做面试复习用&#xff0c;部分来源网络&#xff0c;博文免费&#xff0c;知识无价&#xff0c;侵权请联系&#xff01; 1. 什么是设计模式&#xff1f; 设计模式是在软件开发过程中&#xff0c;针对反复出现的问题所…...

upload-labs靶场通关详解:第11关

一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array("php","php5","php4","php3","php2","html","htm","phtml"…...

excel:时间戳格式与日期格式的互转

13位时间戳转日期时间&#xff08;毫秒&#xff09; 假设A2单元格内容为13位的时间戳&#xff0c;再选中B2单元格&#xff0c;在公式框中输入 TEXT((A2/10008*3600)/8640070*36519,"yyyy/mm/dd hh:mm:ss.000")接下来&#xff0c;选中B2单元格&#xff0c;下拉应用公…...

嵌套式向量中断控制器(NVIC)

1.概述 2. NVIC 的中断处理机制 3. NVIC 中断管理机制 1.概述 中断控制器是ARMv7-M 异常模型的核心组成部分。该中断控制器的运行遵循 ARM 通用中断控制器(GIC)规范,该规范也适用于其他 ARMv7 架构配置和其他处理器架构。 ARMv7-M 的 NVIC(嵌套向量中断控制器)架构支持最…...

2025.05.19【Barplot】柱状图的多样性绘制

Custom color A few examples showing how to custom barplot color. Horizontal barchart It makes sense to make your barchart horizontal: group labels are now much easier to read 文章目录 Custom colorHorizontal barchart 探索Barplot的奥秘Barplot基础什么是Barp…...

MongoDB的管道聚合

管道聚合可以实现很多数据处理和统计功能&#xff0c;并且随着不断的更新&#xff0c;其功能也越来越丰富。代表着NoSQL数据库的一种发展趋势。 管道聚合通过aggregate语句实现&#xff0c;支持多种匹配、处理、输出方式。 其语法是&#xff1a; db.<collection>.aggr…...

基于 STM32 的自动温度巡检小车控制系统设计与实现

一、引言 在工业监控、仓储管理及环境监测等场景中,自动温度巡检系统具有重要应用价值。本文设计一种基于 STM32 单片机的自动温度巡检小车,通过集成温度采集、路径规划及数据处理功能,实现对目标区域的实时温度监测与异常报警,为智能化环境监控提供低成本解决方案。 二、…...

怎么利用JS根据坐标判断构成单个多边形是否合法

怎么利用JS根据坐标判断构成单个多边形是否合法 引言 在GIS(地理信息系统)、游戏开发、计算机图形学等领域,判断一组坐标点能否构成合法的简单多边形(Simple Polygon)是一个常见需求。合法多边形需要满足几何学上的基本规则,本文将详细介绍如何使用JavaScript实现这一判…...

20. 自动化测试框架开发之Excel配置文件的IO开发

20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本&#xff08;支持xlsx格式&#…...

高校快递物流管理系统设计与实现(SpringBoot+MySQL)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

python-leetcode 67.寻找两个正序数组中的中位数

题目&#xff1a; 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。请找出并返回这两个正序数组的中位数。 通过双指针和二分查找的思想&#xff0c;找到两个有序数组的中位数。 1.初始化和基本情况处理 首先获取两个个数组的长度m和n,计算…...

Python 实现图片浏览和选择工具

实现将截图预览&#xff0c;并按照顺序加入一个pdf文件中&#xff0c;实现照片管理尤其对于喜欢看教程截图做笔记的网友们。 C:\pythoncode\new\python-image-pdf-processor.py 界面展示 &#x1f9f1; 一、核心结构概述 主类 ImageViewer(wx.Frame) 是主窗口类&#xff0c;…...

V4L2应用程序开发-01数据采集流程

1 数据采集流程 可以参考这些文件&#xff1a; mjpg-streamer\mjpg-streamer-experimental\plugins\input_control\input_uvc.c video2lcd\video\v4l2.c Video for Linux two(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2支持三种方式来采集图像&#xff1a;内存…...

TDengine 2025年产品路线图

TDengine OSS 之 2025 年年度路线图如下表所示。 季度功能2025Q1 虚拟表查询能力&#xff1a;REGEXP、GREATEST、LEAST、CAST 函数支持判断表达式、单行选择函数的其他列值、INTERP 支持插值时间范围存储能力&#xff1a;支持将查询结果写入超级表、超级表支持 KEEP 参数、STM…...

Unreal 从入门到精通之SceneCaptureComponent2D实现UI层3D物体360°预览

文章目录 前言SceneCaptureComponent2D实现步骤新建渲染目标新建材质UI控件激活3DPreview鼠标拖动旋转模型最后前言 我们在(电商展示/角色预览/装备查看)等应用场景中,经常会看到这种3D展示的页面。 即使用相机捕获一个3D的模型的视图,然后把这个视图显示在一个UI画布上,…...