小蜜蜂单片机——实现蜂鸣器与继电器的基本控制

丶灬走出姿态 提交于 2019-12-07 17:47:34

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

在上次学的led跑马灯的基础上改

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

void delay(unsigned int t)
{
  while(t--);
  while(t--);
}


void ledrunning ()
{
  unsigned char i;
  HC138_C=1;
  HC138_B=0;
  HC138_A=0;   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    P0 = 0x00;
	delay(60000);
	delay(60000);
	P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { P0=0xff << i;
  delay(60000);
  }
  
  
  for(i=1;i<=8;i++)				   //led依次熄灭
  { P0=-(0xff << i);
  delay(60000);
  }
}

void main()
{ 
  while (1)
  { 
     ledrunning();
  }
  }

根据题目继电器要吸合然后断开,看电路图:
U9锁存器蜂鸣器
38译码器
继电器
hc02
当N RELAY是低电平时继电器吸合,而N RELAY对应的是U9锁存器的P04口,因为N RELAY低电平有效,所以OUT5要输出0,对应的IN5要输入1,所以D5(P04口)必须是高电平。
而要想寄存器有效,则其选通端LE必须接1,即Y5C=1,那么Y5=0,对应的38译码器的输入应是101。

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

void delay(unsigned int t)
{
  while(t--);
  while(t--);
}


void ledrunning ()
{
  unsigned char i;
  HC138_C=1;
  HC138_B=0;
  HC138_A=0;   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    P0 = 0x00;
	delay(60000);
	delay(60000);
	P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { P0=0xff << i;
  delay(60000);
  }
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;      //Y5输出1,,选中锁存器U9
  P0=0x10;        //P04口为高电平
  delay(60000);    //保持一段时间
  P0=0x00;        //断开继电器
  
  for(i=1;i<=8;i++)				   //led依次熄灭
  { P0=-(0xff << i);
  delay(60000);
  }
}

void main()
{ 
  while (1)
  { 
     ledrunning();
  }
  }

但实际上在写继电器的代码之前,应该先写一个InitSystem()函数,先把蜂鸣器关掉(这也是考试比较常考的——关掉某部分器件)

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

void delay(unsigned int t)
{
  while(t--);
  while(t--);
}
void InitSystem()
{
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;      //Y5输出0,,选中锁存器U9
  P0=0x00//通过控制P0口的输出控制继电器和蜂鸣器
}

void ledrunning ()
{
  unsigned char i;
  HC138_C=1;
  HC138_B=0;
  HC138_A=0;   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    P0 = 0x00;
	delay(60000);
	delay(60000);
	P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { P0=0xff << i;
  delay(60000);
  }
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;      //Y5输出0,,选中锁存器U9
  P0=0x10;        //P04口为高电平
  delay(60000);    //保持一段时间
  P0=0x00;        //断开继电器
  
  for(i=1;i<=8;i++)				   //led依次熄灭
  { P0=-(0xff << i);
  delay(60000);
  }
}

void main()
{ 
  while (1)
  { 
     InitSystem();
     ledrunning();
  }
  }

然后是蜂鸣器的。跟继电器一样,只不过是让P06口输入1。

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

void delay(unsigned int t)
{
  while(t--);
  while(t--);
}
void InitSystem()
{
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;      //Y5输出0,,选中锁存器U9
  P0=0x00//通过控制P0口的输出控制继电器和蜂鸣器
}

void ledrunning ()
{
  unsigned char i;
  HC138_C=1;
  HC138_B=0;
  HC138_A=0;   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    P0 = 0x00;
	delay(60000);
	delay(60000);
	P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { P0=0xff << i;
  delay(60000);
  }
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;      //Y5输出0,,选中锁存器U9
  P0=0x10;        //P04口为高电平
  delay(60000);    //保持一段时间
  P0=0x00;        //断开继电器
  
  HC138_C=1;
  HC138_B=0;
  HC138_A=0;     //Y4输出0,选中led
  for(i=1;i<=8;i++)				   //led依次熄灭
  { P0=-(0xff << i);
  delay(60000);
  }
  HC138_C=1;
  HC138_B=0;
  HC138_A=1;    //Y5输出0,选中锁存器U9
  P0=0x40;       //选中蜂鸣器
  delay(60000);
  dealy(60000);
  P0=0x00;     //关掉蜂鸣器
  
}

void main()
{ 
  InitSystem();
  while (1)
  { 
     ledrunning();
  }
  }

现在这个代码就能实现题目要求的。
但是还可以优化。
可以将38译码器的输出优化:加一个HC138(unsigned char n)函数。

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

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;
        break;
    case 5:
        HC138_C=1;
        HC138_B=0;
        HC138_A=1;
        break;
    case 6:
        HC138_C=1;
        HC138_B=1;
        HC138_A=0;
        break;
    case 7:
        HC138_C=1;
        HC138_B=1;
        HC138_A=1;
        break;
  }
}
void InitSystem()
{
  InitHC138(5) ;     //Y5输出0,,选中锁存器U9
  P0=0x00//通过控制P0口的输出控制继电器和蜂鸣器
}

void ledrunning ()
{
  unsigned char i;
 InitHC138(4);   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    P0 = 0x00;
	delay(60000);
	delay(60000);
	P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { P0=0xff << i;
  delay(60000);
  }
  InitHC138(5) ;     //Y5输出0,,选中锁存器U9
  P0=0x10;        //P04口为高电平
  delay(60000);
  delay(60000);    //保持一段时间
  P0=0x00;        //断开继电器
  
  InitHC138(4);//Y4输出0,选中led
  for(i=1;i<=8;i++)				   //led依次熄灭
  { P0=-(0xff << i);
  delay(60000);
  }
  InitHC138(5);    //Y5输出0,选中锁存器U9
  P0=0x40;       //选中蜂鸣器
  delay(60000);
  dealy(60000);
  P0=0x00;     //关掉蜂鸣器
  
}

void main()
{ 
  InitSystem();
  while (1)
  { 
     ledrunning();
  }
  }

进一步优化:

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;	//注意是P2

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;
        break;
    case 5:
        HC138_C=1;
        HC138_B=0;
        HC138_A=1;
        break;
    case 6:
        HC138_C=1;
        HC138_B=1;
        HC138_A=0;
        break;
    case 7:
        HC138_C=1;
        HC138_B=1;
        HC138_A=1;
        break;
  }
}
void OutPutP0(unsigned char channel,unsigned char dat)
{
   InitHC138(channel);
   P0=dat;
}
void InitSystem()
{
  OutPutP0(5,0x00)  ;   //Y5输出0,,选中锁存器U9,通过控制P0口的输出控制继电器和蜂鸣器
}

void ledrunning ()
{
  unsigned char i;
 //InitHC138(4);   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    OutPutP0(4,0x00);// = 0x00;
	delay(60000);
	delay(60000);
	OutPutP0(4,0xff);//P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { OutPutP0(4,(0xff << i))  //P0= 0xff << i;
  delay(60000);
  }
  OutPutP0(5, P0=0x10);//InitHC138(5) ;     //Y5输出0,,选中锁存器U9
  //P0=0x10;        //P04口为高电平
  delay(60000);
  delay(60000);    //保持一段时间
  OutPutP0(5, P0=0x00);//P0=0x00;        //断开继电器
  
  //InitHC138(4);//Y4输出0,选中led
  for(i=1;i<=8;i++)				   //led依次熄灭
  { OutPutP0(4,~(0xff << i))//P0=~(0xff << i);
  delay(60000);
  }
  OutPutP0(5, P0=0x40);//InitHC138(5);    //Y5输出0,选中锁存器U9
  //P0=0x40;       //选中蜂鸣器
  delay(60000);
  dealy(60000);
  OutPutP0(5, P0=0x00);//P0=0x00;     //关掉蜂鸣器
  
}

void main()
{ 
  InitSystem();
  while (1)
  { 
     ledrunning();
  }
  }

还可以再优化:

#include "reg52.h"


void delay(unsigned int t)
{
  while(t--);
  while(t--);
}
void InitHC138(unsigned char n)
{
  switch(n)
  {
    case 4:
       P2=(P2 & 0x1f) | 0x80;
        break;
    case 5:
       P2=(P2 & 0x1f) | 0xa0;
        break;
    case 6:
        P2=(P2 & 0x1f) | 0xc0;
        break;
    case 7:
        P2=(P2 & 0x1f) | 0xe0;
        break;
  }
}
void OutPutP0(unsigned char channel,unsigned char dat)
{
   InitHC138(channel);
   P0=dat;
}
void InitSystem()
{
  OutPutP0(5,0x00)  ;   //Y5输出0,,选中锁存器U9,通过控制P0口的输出控制继电器和蜂鸣器
}

void ledrunning ()
{
  unsigned char i;
 //InitHC138(4);   //Y4输出低电平

  for(i=0;i<3;i++)		   //闪烁3遍熄灭
  {
    OutPutP0(4,0x00);// = 0x00;
	delay(60000);
	delay(60000);
	OutPutP0(4,0xff);//P0 = 0xff;
	delay(60000);
	delay(60000);
  }

  for(i=1;i<=8;i++)				  //led依次点亮
  { OutPutP0(4,(0xff << i))  //P0= 0xff << i;
  delay(60000);
  }
  OutPutP0(5, P0=0x10);//InitHC138(5) ;     //Y5输出0,,选中锁存器U9
  //P0=0x10;        //P04口为高电平
  delay(60000);
  delay(60000);    //保持一段时间
  OutPutP0(5, P0=0x00);//P0=0x00;        //断开继电器
  
  //InitHC138(4);//Y4输出0,选中led
  for(i=1;i<=8;i++)				   //led依次熄灭
  { OutPutP0(4,~(0xff << i))//P0=~(0xff << i);
  delay(60000);
  }
  OutPutP0(5, P0=0x40);//InitHC138(5);    //Y5输出0,选中锁存器U9
  //P0=0x40;       //选中蜂鸣器
  delay(60000);
  dealy(60000);
  OutPutP0(5, P0=0x00);//P0=0x00;     //关掉蜂鸣器
  
}

void main()
{ 
  InitSystem();
  while (1)
  { 
     ledrunning();
  }
  }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!