LED+继电器+蜂鸣器
边学编写的,看了 小蜜蜂 老师的教学视频,自己尝试模仿写了一下,根据自己的理解加了一些注释,更容易读懂程序。
下面是原理图
#include"reg52.h"
#include"intrins.h" //包含循环函数等
typedef unsigned char u8;
typedef unsigned int u16;
//74HC138译码器
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
//延时函数
void delay1MS(u16 n)
{
u16 i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//38译码器选择
void InitHc138(u8 n)
{
switch(n)
{
case 4:
P2=(P2 & 0x1f)|0x80; //P2输出 1000 0000 即打开Y4
break;
case 5:
P2=(P2 & 0x1f)|0xa0; //P2输出 1010 0000 即打开Y5
break;
case 6:
P2=(P2 & 0x1f)|0xc0; //P2输出 1100 0000 即打开Y6
break;
case 7:
P2=(P2 & 0x1f)|0xe0; //P2输出 1110 0000 即打开Y7
break;
}
}
void OutPutP0(u8 channel, u8 dat)
{
InitHc138(channel);
P0=dat;
}
void LEDruning()
{
u8 i;
for(i=0; i<3; i++)
{
OutPutP0(4,0x00); //138译码器Y4口输出 0 控制Y4C输出 1 打开HC573锁存器,P0口输出0点亮所有led
delay1MS(999);
delay1MS(999);
OutPutP0(4,0xff); //138译码器Y4口输出 0 控制Y4C输出 1 打开HC573锁存器,P0口输出1点亮所有led
delay1MS(999);
delay1MS(999);
}
for(i=1; i<=8; i++)
{
OutPutP0(4,(0xff << i)); //138译码器Y4口输出 0 控制Y4C输出 1 打开HC573锁存器,P0口由低至高循环输出0依次点亮所有led
delay1MS(999);
}
OutPutP0(5,0x10); //138译码器Y5口输出 0 控制Y5C输出 1 打开HC573锁存器,P0输出0001 0000,锁存器Q5输出 1 经过ULN2003后RELAY接收 0 继电器打开;
delay1MS(999);
OutPutP0(5,0x00); //关闭继电器
for(i=0; i<=8; i++)
{
OutPutP0(4,~(0xff << i)); //138译码器Y4口输出 0 控制Y4C输出 1 打开HC573锁存器,P0口由低至高循环输出0依次 关闭 所有led
delay1MS(999);
}
OutPutP0(5,0x40); //138译码器Y5口输出 0 控制Y5C输出 1 打开HC573锁存器,P0输出0100 0000,锁存器Q7输出 1 经过ULN2003后BUZZ接收 0 蜂鸣器打开;
delay1MS(999);
OutPutP0(5,0x00); //关闭蜂鸣器
}
//初始化
void IntSystem()
{
OutPutP0(5,0x00);
}
void main()
{
IntSystem();
while(1)
{
LEDruning();
}
}