点亮LED

点亮LED主要原理

关闭蜂鸣器

代码

void cls_buzz(void)
{
     
	P2 = (P2&0x1F|0xA0);
	P0 = 0x00;
	P2 &= 0x1F;
}


原理图

点亮LED_第1张图片

蜂鸣器上端为VCC(供电),下端为N_buzz端口;
说明在N_buzz给一个低电平(在这里1为高电平,0为低电频),蜂鸣器开始响;
电路逻辑结构:138译码器–或非门–573寄存器–达林顿管ULN2003–蜂鸣器

蜂鸣器上对应的端口Nbuzz在元器件ULN2003中Nbuzz对应(ULN叫做达林顿管,里面是非门,例如输入0,就输出1)要关闭蜂鸣器就要给N_buzz一个高电平,此时找到74HC573锁存器,LE为控制端口,P0为输入端口,要让Nbuzz为1,Y5C就要输入0,Y5C对应下面的或非门,Y5C要为0,输入端Y5就要为1在74HC138译码器中P25、P26、P27端口控制Y5.

74HC138译码器

三八译码器:三个输入控制八路互斥的低有效输出
点亮LED_第2张图片
1 0 0 Y4
1 0 1 Y5
1 1 0 Y6
1 1 1 Y7
(对应其二进制)
//P2 = (P2&0x1F|0xA0);将P27-P25清零,再定位Y5C(Y5为1,经或非门变化后Y5C为1)
//P0 = 0x00;P0端口清零
//P2 &= 0x1F;//P27~P25清零
//P0总共有8个端口,分别对应8位二进制数字0x1F转为二进制为0001 1111而0xA0对应的二进制1010 0000
在P2端口中P25 P26 P27为高三位,即0001 1111,经过代码或变为1011 1111,取高三位101,即为对应的端口P25 P26 P27
1010 0000
经过真值表(H高电平,L低电平,X任意值),输出的Y5为1
蜂鸣器关闭

控制LED灯

主函数

void main(void)
{
     
	cls_buzz();
    while(1)
    {
     
        P2 = ((P2&0x1f)|0x80);          //P27~P25清零,再定位Y4C,原理图是Y4C控制的LED
		P0 = 0xff;  //LED关
		P2 &= 0x1f;//P27~P25清零
        delay();
        
        P2 = ((P2&0x1f)|0x80);
		P0 = 0x00;  //LED开
		P2 &= 0x1f;
        delay();
    }
}

74HC573锁存器

*八路3态输出的非反转透明锁存器
*当锁存器使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存器使能变时,符合建立时间和保存时间的数据会被锁存

点亮LED_第3张图片

LED指示灯电路原理

点亮LED_第4张图片

要使LED灯中的某一个点亮,即使其对应的输出端口Qx为低电平即可,对应的输入端P0x也应为低电平0。Y4C就要输入1使P0口的数据透传过去,Y4C对应下面的或非门,Y4C要为1,Y4就要为0,在74HC138译码器中P25、P26、P27端口就为100.

#P2 = ((P2&0x1f)|0x80);//先高三位清零,在定位Y4C,使其控制LED
#P0 = 0x00; //LED开,由电路图可知,LED灯1为灭,0为亮
# P2 &= 0x1f;//高三位清零

流水灯控制

void main(void)
{
     
    unsigned char i;
	
	cls_buzz();
    
    while(1)
    {
     
		for(i=0; i<8; i++)
		{
     
			P2 = ((P2&0x1f)|0x80);
			P0 = ~(0x01<<i);  //左移i位,按位取反
			P2 &= 0x1f;
			delay();
		}
    }
}

//P0 = ~(0x01< 0x01转化为二进制0000 0001,无符号位左移0000 0010按位取反1111 1101
//0x1=0000 0001 ~0x01=1111 1110点亮第一个,0x02=0000 0010 ~0x02=1111 1101点亮第二个灯,0x04=0000 0100 ~0x04=1111 1011点亮第三个,LED以0.2S为间隔流水操作

LED位移控制

void main(void)
{
     
    unsigned char i;
	
	cls_buzz();
    
    while(1)
    {
     
		for(i=0; i<8; i++)
		{
     
			P2 = ((P2 &0x1f)|0x80);
			P0 = 0xfe<<i;           //把fe的值往左移i位  ,1111 1110
			P2 &= 0x1f;
			delay();
		}
    }
}

// P0 = 0xfe< //0xfe=1111 1110 <1=0xfd=1111 1100 <1=0xf8=1111 1000,<1=0xf0=11110000 <1 0xe0=1110 0000 <1<0xd0=11000000 <1 0x80=1000 0000

你可能感兴趣的:(http)