首先让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();
}
}
|