二、蜂鸣器与继电器的基本控制

二、蜂鸣器与继电器的基本控制,第1张

二、蜂鸣器继电器的基本控制

首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指示灯,蜂鸣器鸣叫一会后关闭,程序循环实现上述功能。

目录

1、蜂鸣器与继电器电路

1、ULN2003(约等于放大倍数较大的三极管)

2、继电器

3、蜂鸣器

2、程序代码

1、自己写的:

2、标准代码


1、蜂鸣器与继电器电路

 WR低,Y5低-->Y5C高(或非,锁存器连通)

CBA = 101(选Y5)

1、ULN2003(约等于放大倍数较大的三极管)

     中间是非门!!

2、继电器

 N_RELAY接低(OUT5-->(非门)IN5-->Y5C)--->线圈通电,继电器吸合

                                   OUT5低,IN5高,P04高(Y5C高)P0 = 0001 0000 = 0x10                 

3、蜂鸣器

N_BUZZ接低(叫),IN7高,P06高 ,P0 = 0100 0000 = 0x40

2、程序代码 1、自己写的:
#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;//位定义

void Delay (unsigned int t)//延时函数
{
	while(t--);
	while(t--);
}

void BUZZER()//蜂鸣器
{
	HC138_C = 1;
	HC138_B = 0;
	HC138_A = 1;//选Y5
	
	P0 = 0x40;//P06高 = 0100 0000,蜂鸣器叫
	Delay(60000);
	Delay(60000);
	
	P0 = 0x00;//蜂鸣器关闭
}

void DIODE()//继电器
{
	HC138_C = 1;
	HC138_B = 0;
	HC138_A = 1;//选Y5,Y5C高 锁存器连通
	
	P0 = 0x10;//P04高 = 0001 0000,继电器吸合
	Delay(60000);
	Delay(60000);
	
	P0 = 0x00;//继电器断开
}

void LEDRunning()//灯
{
	unsigned char i;
	
	HC138_C = 1;
	HC138_B = 0;
	HC138_A = 0;//选Y4,Y4C高 锁存器连通
	
	for (i = 1; i <= 3; i++)//闪烁3遍
	{
		P0 = 0x00;//全亮
		Delay(60000);
		Delay(60000);
		
		P0 = 0xff;//全灭
		Delay(60000);
		Delay(60000);
	}
	
	for (i = 1; i <= 8; i++)//熄灭,接着依次点亮
	{
		P0 = 0xff << i;//全灭;位移一位,添一个0(亮),左移
		Delay(60000);
		Delay(60000);
	}
	
	DIODE();//继电器
	
	for (i = 1; i <= 8; i++)//依次熄灭
	{
		P0 = ~(0xff << i);
		Delay(60000);
		Delay(60000);
	}
	
	BUZZER();//蜂鸣器
	
}

void main()//主函数
{
	while(1)
	{
		LEDRunning();
	}
}

运行后存在问题:

1、初始时继电器和蜂鸣器都在运行(改进:写一个初始化系统函数,放在主函数中while之前)

2、继电器吸合并断开后,灯无法依次熄灭(被跳过),蜂鸣器叫,然后接着闪烁循环。

3、Y4、Y5的选择繁琐,需简化代码(switch)。

分析代码:

void DIODE()//继电器
{
	HC138_C = 1;
	HC138_B = 0;
	HC138_A = 1;//选Y5,Y5C高 锁存器连通
	
	P0 = 0x10;//P04高 = 0001 0000,继电器吸合
	Delay(60000);
	Delay(60000);
	
	P0 = 0x00;//继电器断开
}

//引用继电器之和的程序
    
    DIODE();//继电器
	
    	for (i = 1; i <= 8; i++)//依次熄灭
	    {
	    	P0 = ~(0xff << i);
	    	Delay(60000);
	    	Delay(60000);
	    }
	
	    BUZZER();//蜂鸣器

DIODE(继电器)函数引用后,CBA = 101(选Y5)

而灯依次熄灭则需要CBA = 100(选Y4)

2、标准代码
#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

void Delay(unsigned int t)//延时函数
{
	while(t--);
	while(t--);
}

void InitHC138(unsigned char n)//简化选择
{
	switch(n)
	{
		case 4:
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 0;//选Y4
		break;
		case 5:
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 1;//选Y5
		break;
		case 6:
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 0;//选Y6
		break;
		case 7:
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 1;//选Y7
		break;
	}
}

//void OutPutP0(unsigned char channel, unsigned char dat)简化
//{
//	InitHC138(channel);
//	P0 = dat;
//}

void InitSystem()//初始化系统(关闭继电器与蜂鸣器)
{
	InitHC138(5);//选Y5
	
	P0 = 0x00; //关闭继电器与蜂鸣器
}

void LEDRunning()
{
	unsigned char i;
	
	InitHC138(4);//选Y4 
	
//LED指示灯闪烁3遍	
	for(i = 0; i < 3; i++)
	{
		P0 = 0x00;//D1~8为低,LED点亮
		Delay(60000);
		Delay(60000);
		P0 = 0xff;//D1~8为高,LED熄灭
		Delay(60000);
		Delay(60000);
	}
	
//然后熄灭,接着依次点亮LED指示灯(i初始不能为0->移0位)
	for (i = 1; i <= 8; i++)
	{
		P0 = 0xff << i;//0xff:全灭(然后熄灭) 移1位,补充一个0(亮)
		Delay(60000);
		Delay(60000);
	}
	
//继电器吸合一会后断开
	InitHC138(5);//选Y5 CBA=101
	
	P0 = 0x10;//吸合,P04高-->P0=0001 0000=0x10
	Delay(60000);
	Delay(60000);
	P0 = 0x00;//断开
	
//选Y4!!!!!!!
	InitHC138(4);//选Y4:CBA = 100(C为高位);(Y4C得高)
	
//依次熄灭指示灯	
	for (i = 1; i <= 8; i++)
	{
		P0 = ~(0xff << i);//取反
		Delay(60000);
		Delay(60000);
	}
	
//蜂鸣器鸣叫一会后关闭
	InitHC138(5);//选Y5 CBA=101
	
	P0 = 0x40;//叫,P06高-->P0=0100 0000=0x40
	Delay(60000);
	Delay(60000);
	P0 = 0x00;//关闭
}

void main()//主函数
{
	InitSystem();
	while(1)
	{
		LEDRunning();
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存