首先让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();
}
}
根据题目继电器要吸合然后断开,看电路图:
当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();
}
}
来源:CSDN
作者:......Oops
链接:https://blog.csdn.net/qq_44892126/article/details/103106181