天天看点

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

1.设计要求

        1.利用红外对管检测是否有人进出

        2.在触发红外对管后,使用PWM驱动蜂鸣器,使其发出四个不同频率的声音

2.设计概述   

        本实验所用芯片为STC89C52,所用硬件是由华清远见基于STC89C52开发的智能小车,该小车具有流水灯模块、蜂鸣器模块、独立键盘模块、矩阵键盘模块等。本实验采用蜂鸣器模拟,通过pwm驱动蜂鸣器来实现不同的音调,采用红外对管检测来模拟感应系统,当有人通过时,指示灯亮(此时返回值为0),门铃发出四种不同的声音。

3、原理图以及线路连接

感应模块

J11-P3.3接C52-P3.3                                //当检测到有人通过时,端口返回0,指示灯亮

J11-VCC接电源

J11-GND接地

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

蜂鸣器模块

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

4.软件设计 

感应模块

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

当检测到有人时,开启总中断,允许蜂鸣器启动

没人时关闭总中断,不允许蜂鸣器启动,同时关闭正在运行的蜂鸣器

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

 蜂鸣器模块

蜂鸣器控制函数,当函数输入参数BEEPON时,启动蜂鸣器,输入BEEPOFF时关闭蜂鸣器

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

使用定时器精准控时

基于STC89C52单片机的智能门铃1.设计要求2.设计概述   3、原理图以及线路连接4.软件设计 

如果感应装置检测到有人。打开了总中断,程序就会定时进入中断函数,通过time0控制pwm,已达到不同音调的效果,当i<100时,蜂鸣器发出第一种音调,当i>100时,发出第二种音调,当i == 200时,关闭定时器0,启动定时器1,同时i,time0置0,在定时器1中,i<100时,发出第三种音调,当i>100时发出第四种音调,当i==200时关闭定时器1,启动定时器0,同时i,time0置0。

void inter1(void) interrupt 1		   	//定时器0中断函数
{	
	time0++;
	if(0 <= i&&100 > i)					//0-2s内第一个音调(10/200调)
	{
		if(10 == time0)
		{
			beep_ctl(BEEPON);
		}
		if(200 == time0)
		{
			beep_ctl(BEEPOFF);
			time0 = 0;
			i++;	  //以当前音调响20ms后i++ ,i到100后(即响2s后)下一调
		}
	}
	else								 //2-4s内第二个音调(150/200调)
	{
		if(150 == time0)
		{
			beep_ctl(BEEPON);
		}
		if(200 == time0)
		{
			beep_ctl(BEEPOFF);
			time0 = 0;
			i++;		 //以当前音调响20ms后i++
		}
	}
	if(200 == i)		 //当i=200时,关闭中断器0,启动中断器1,i清零
		{
			i = 0;
			ET0 = 0;
			ET1 = 1;
		}
}

void inter2(void) interrupt 3		   //定时器1中断函数
{
	time0++;						   //4-6s内第三个音调(190/200调)
	if(0 <= i&&100 > i)
	{
		if(190 == time0)
		{
			beep_ctl(BEEPON);
		}
		if(200 == time0)
		{
			beep_ctl(BEEPOFF);
			time0 = 0;
			i++;					   //以当前音调响20ms后i++ ,i到100后(即响2s后)下一调
		}
	}
	else							    //6-8s内第四个音调(150/200调)
	{
		if(30 == time0)
		{
			beep_ctl(BEEPON);
		}
		if(200 == time0)
		{
			beep_ctl(BEEPOFF);
			time0 = 0;
			i++;						//以当前音调响20ms后i++
		}
	}
	if(200 == i)						//当i=200时,关闭中断器1,启动中断器0,i清零
		{
			i = 0;
			ET0 = 1;
			ET1 = 0;
		}
}

void test()
{
	if(0 == left_led1)			//检测有人,开总中断,启动报警器
			EA = 1;
		if(1 == left_led1)			//没检测到人,关总中断,关闭报警器
			{
				EA = 0;
				beep_ctl(BEEPOFF);
			}
}
           

继续阅读