本节要实现的内容:在单片机综合训练平台上实现蜂鸣器与继电器的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指示灯,蜂鸣器鸣叫一会后关闭,程序循环实现上述功能。
1.蜂鸣器与继电器电路原理图
由原理图可知:
1、蜂鸣器:要使蜂鸣器响,(锁存器)P06输出1,(74HC138)Y5输出低电平。
2.代码实现(复杂代码,直接实现)
/************************************************************************
实验现象:实现蜂鸣器与继电器的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,
接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指
示灯,蜂鸣器鸣叫一会后关闭,程序循环实现上述功能。
************************************************************************/
#include "reg52.h"
#include "intrins.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 InitSystem()
{
HC138_C=1;
HC138_B=0;
HC138_A=1;
P0=0x00; //蜂鸣器,继电器都关闭
}
//Led控制函数
void Led_Proc()
{
unsigned char i;
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;
for(i = 0; i < 3; i++) //让LED灯闪烁3遍
{
P0 = 0x00;
Delay(60000);
Delay(60000);
P0 = 0xff;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++) //移位使灯依次点亮
{
P0 = 0xff << i;
Delay(60000);
Delay(60000);
}
HC138_C = 1;
HC138_B = 0;
HC138_A = 1; //Y5输出低电平
P0 = 0x10; //继电器p04吸合
Delay(60000);
Delay(60000);
P0 = 0x00; //继电器关
HC138_C = 1;
HC138_B = 0;
HC138_A = 0; //Y4输出低电平
for(i = 1; i <= 8; i++) //移位使灯依次熄灭
{
P0 = ~(0xff << i);
Delay(60000);
Delay(60000);
}
HC138_C = 1;
HC138_B = 0;
HC138_A = 1; //Y5输出低电平
P0 = 0x40; //蜂鸣器p06开
Delay(60000);
Delay(60000);
P0 = 0x00; //继电器关
}
//主函数
void main(void)
{
InitSystem();
while(1)
{
Led_Proc();
}
}
3.代码优化
/************************************************************************
实验现象:实现蜂鸣器与继电器的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,
接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指
示灯,蜂鸣器鸣叫一会后关闭,程序循环实现上述功能。
************************************************************************/
#include "reg52.h"
#include "intrins.h"
//延时函数
void Delay(unsigned int t) //延时程序,什么都不干,执行许多空的指令
{
while(t--);
while(t--); //再循环一遍
}
void HC138_state(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 InitSystem()
{
HC138_state(5);
P0=0x00; //蜂鸣器,继电器都关闭
}
void OutP0_Proc(unsigned char channel,unsigned char dat)
{
HC138_state(channel);
P0 = dat;
}
//Led控制函数
void Led_Proc()
{
unsigned char i;
for(i = 0; i < 3; i++) //让LED灯闪烁3遍
{
OutP0_Proc(4,0x00);
Delay(60000);
Delay(60000);
OutP0_Proc(4,0xff);
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++) //移位使灯依次点亮
{
OutP0_Proc(4,0xff << i);
Delay(60000);
Delay(60000);
}
OutP0_Proc(5,0x10); //继电器p04吸合 00010000
Delay(60000);
Delay(60000);
OutP0_Proc(5,0x00);//继电器关
for(i = 1; i <= 8; i++) //移位使灯依次熄灭
{
OutP0_Proc(4,~(0xff << i));
Delay(60000);
Delay(60000);
}
OutP0_Proc(5,0x40);//蜂鸣器p06开 01000000
Delay(60000);
Delay(60000);
OutP0_Proc(5,0x00);//继电器关
}
//主函数
void main(void)
{
InitSystem();
while(1)
{
Led_Proc();
}
}
另外,以下两段代码等同。
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
void HC138_state(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 HC138_state(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;
}
}
解释: