目录
1、各个模块
蜂鸣器:给N BUZZ置低电平,蜂鸣器会鸣叫;反之不会鸣叫。
继电器:给N RELAY置低电平,线路1导通,RELAY-SPDT产生磁场,K1、m2连接,m2接GND,L10被点亮。
当锁存器使能端(LE)为高电平时,右侧信号与左侧信号相同,所以必须将Y5C置高电平。
ULN2003达林顿管:缓冲和驱动的作用。里面有或非门。
74HC138译码器:P27 = 1, P26 = 0, P25 = 1;选择Y5置0,然后通过或非门将Y5C置高电平。
或非门:输入低电平,输出高电平;输入高电平,输出低电平。
具体实现项目:
首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,
继电器吸合一会后断开,然后依次熄灭LED灯,蜂鸣器鸣叫一会儿后关闭
程序循环实现上述功能。
#include <REGX52.H>
#include <intrins.h>
void InitHC138(unsigned char i);//74HC138模块
void outputP0(unsigned char channel, unsigned char date);
void Delay(unsigned char t); //@12.000MHz
void LEDrunning();
void Init();
void main()
{
Init();
while(1)
{
LEDrunning();
}
}
void InitHC138(unsigned char i)
{
switch(i)
{
case 4: P2 = (P2 & 0x1f) | 0x80; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1000 0000 = 1001 1111,选择Y4置低电平,通过或非门,来将锁存器LE(使能端)打开。
case 5: P2 = (P2 & 0x1f) | 0xa0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1011 0000 = 0101 1111
case 6: P2 = (P2 & 0x1f) | 0xc0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1101 0000 = 0101 1111
case 7: P2 = (P2 & 0x1f) | 0xe0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1111 0000 = 0101 1111
}
}
void outputP0(unsigned char channel, unsigned char date)
{
InitHC138(channel);
P0 = date;
}
void Delay(unsigned char t) //@12.000MHz
{
unsigned char i, j;
while(t)
{
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
t--;
}
}
void LEDrunning()
{
unsigned int i;
//LED闪烁3遍后熄灭
for(i = 0; i <= 2; i++)
{
outputP0(4, 0x00);
Delay(500);
outputP0(4, 0xff);
Delay(500);
}
//依次点亮LED指示灯
for(i = 1; i <= 8; i++)
{
outputP0(4, (0xff << i));
Delay(500);
}
//继电器吸合一会后断开
outputP0(5, 0X10);
Delay(1000);
outputP0(5, 0X00);
Delay(1000);
//依次熄灭LED灯
for(i = 1; i <= 8; i++)
{
outputP0(4, ~(0xff << i));
Delay(500);
}
outputP0(5, 0X40);
Delay(1000);
outputP0(5, 0X00);
Delay(1000);
}
void Init()
{
InitHC138(5);
//选择Y5置低电平,通过或非门,来将锁存器LE(使能端)打开。
P0 = 0x00;//通过ULN2003变成0xff,使蜂鸣器和继电器关闭
}