蓝桥杯单片机之LED模块的使用(十六进制)以及关闭蜂鸣器(关闭外设)

LED模块的使用(十六进制)以及关闭蜂鸣器(关闭外设)

原理图

图片替换文本
图片替换文本
图片替换文本


根据原理图分析

  1. LED共阳接法,二极管正向导通发光,所以当Q1~Q8为低电平时,LED灯会点亮;
  2. 74HC573是一颗锁存器CMOS芯片,Y4C锁存功能,进而控制着Q端的输出,当Y4C为高电平时,锁存功能关闭,Q端根据P0端的输入进行输出。当Y4C为低电平时,锁存功能开启,Q端按照上一个状态输出;
  3. 74HC02是一颗四二输入或非门芯片(四个逻辑门,每个逻辑门2个输入,1个输出),图中显示一个输入是GND(WR根据J13跳帽连接了GND),所以输出Y4C与输入Y4相反;(若WR接VCC,则输出与输入相同);
  4. 74HC138是一颗38译码器(3输入,8输出),以 C、B、A 为逻辑顺序,CBA组成二进制数,然后转化成10进制,对应的Y输出低电平,其他均为高电平,例如:CBA=001;则Y1输出低电平,其他输出高电平。

综述:P27、P26、P25控制着74HC573是否锁存(输出的状态),即控制着Q端输出与P端输入的关系,P0输入控制LED的状态;

点亮单个LED灯代码

# include "reg52.h"
int main()
{
    while(1)
    {
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 |= 0x80;		//0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出     
        P0 = 0xfe;			//OXFE-->1111 1110, LED低电平亮,所以是第1个LED灯点亮
    }
}

代码分析

P2 &= 0x1f
&=:按位与赋值,表示两个操作数的二进制,对它们进行按位AND运算并将结果分配给变量;先进行并运算再赋值,俗称有0为0,
P2 |= 0x80
&=:按位或赋值,表示两个操作值的二进制表示,执行按位或运算,并把结果赋给变量。先进行or运算再赋值,俗称有1为1.

单个LED闪烁代码

# include "reg52.h"
# include "intrins.h"    //延时函数需要预处理的头文件
void Delay500ms()		//@12.000MHz//由STC-ISP烧录软件生成的延时函数
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main()
{
    while(1)
    {
        P2 &= 0x1f;         //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;       //0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出
        P0 = 0xfe;          //OXFE-->1111 1110, LED低电平亮,所以是第1个LED灯点亮
        Delay500ms();
        P0 = 0xff;
        Delay500ms();
    }
}

LED流水灯代码

# include "reg52.h"
# include "intrins.h"
void Delay500ms()		//@12.000MHz//由STC-ISP烧录软件生成的延时函数
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 23;
	j = 205;
	k = 120;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main()
{
    int i=0;
    while(1)
    {
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;   //0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出

        P0=0XFE;        //移位前的第一个状态,如果为0XFF,则第一个灯不会亮
        for(i=1;i<=8;i++) //移位操作的循环控制,从左到右
        {
            Delay500ms();   //延时函数,用于控制LED亮的时间
            P0=~(0x01<<i);  //移位操作,例如:~(0000 0001<<1)=~0000 0010=1111 1101左边第二个LED灯点亮
        }

        //P0=0X7F;        //0X7F-->0111 1111 ,从右往左的流水灯
        //for(i=1;i<=8;i++)
        //{
        //Delay500ms();
        //P0=~(0x80>>i); //移位操作,例如:~(1000 0000>>1)=~0100 0000=1011 1111右边第二个LED灯点亮
        //}
    }
}

关闭蜂鸣器(关闭外设)

蜂鸣器对应的原理图

图片替换文本
图片替换文本

原理图分析

  1. 该Buzzer是有源蜂鸣器,一端已经接在VCC上,当N BUZZER为低电平时,蜂鸣器会响
  2. ULN2003是一颗高耐压、大电流符合晶体管芯片,内部有7个硅NPN复合晶体管组成,在逻辑上是一个非门

综述:当P06为高电平时,蜂鸣器会响,并且根据51单片机引脚悬空时,默认输出高电平,所以上电蜂鸣器就会响,我们调试的时候响着很烦,所以我们在写代码时第一步就是关闭蜂鸣器(或者叫外设)

关闭Y5控制的外设代码

int main()
{
	int i=0;
	
	P2 = ((P2 & 0x1f) | 0xa0);      //关闭Y5控制的全部外设  
	P0 = 0x00;  
	P2 &= 0x1f;
	P2 = (P2 & 0x1f) | 0xe0;        //同理关闭数码管
	P0 = 0xff;  
	P2 &= 0x1f;
	
	while(1)
	{
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;		//0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出
        P0=0XFE;
        for(i=1;i<=8;i++)
        {
            Delay500ms();
            P0=~(0x01<<i);
	}
}

版权声明:本文为CSDN博主「专属熊熊先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46074226/article/details/122313215

LED模块的使用(十六进制)以及关闭蜂鸣器(关闭外设)

原理图

图片替换文本
图片替换文本
图片替换文本


根据原理图分析

  1. LED共阳接法,二极管正向导通发光,所以当Q1~Q8为低电平时,LED灯会点亮;
  2. 74HC573是一颗锁存器CMOS芯片,Y4C锁存功能,进而控制着Q端的输出,当Y4C为高电平时,锁存功能关闭,Q端根据P0端的输入进行输出。当Y4C为低电平时,锁存功能开启,Q端按照上一个状态输出;
  3. 74HC02是一颗四二输入或非门芯片(四个逻辑门,每个逻辑门2个输入,1个输出),图中显示一个输入是GND(WR根据J13跳帽连接了GND),所以输出Y4C与输入Y4相反;(若WR接VCC,则输出与输入相同);
  4. 74HC138是一颗38译码器(3输入,8输出),以 C、B、A 为逻辑顺序,CBA组成二进制数,然后转化成10进制,对应的Y输出低电平,其他均为高电平,例如:CBA=001;则Y1输出低电平,其他输出高电平。

综述:P27、P26、P25控制着74HC573是否锁存(输出的状态),即控制着Q端输出与P端输入的关系,P0输入控制LED的状态;

点亮单个LED灯代码

# include "reg52.h"
int main()
{
    while(1)
    {
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 |= 0x80;		//0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出     
        P0 = 0xfe;			//OXFE-->1111 1110, LED低电平亮,所以是第1个LED灯点亮
    }
}

代码分析

P2 &= 0x1f
&=:按位与赋值,表示两个操作数的二进制,对它们进行按位AND运算并将结果分配给变量;先进行并运算再赋值,俗称有0为0,
P2 |= 0x80
&=:按位或赋值,表示两个操作值的二进制表示,执行按位或运算,并把结果赋给变量。先进行or运算再赋值,俗称有1为1.

单个LED闪烁代码

# include "reg52.h"
# include "intrins.h"    //延时函数需要预处理的头文件
void Delay500ms()		//@12.000MHz//由STC-ISP烧录软件生成的延时函数
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main()
{
    while(1)
    {
        P2 &= 0x1f;         //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;       //0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出
        P0 = 0xfe;          //OXFE-->1111 1110, LED低电平亮,所以是第1个LED灯点亮
        Delay500ms();
        P0 = 0xff;
        Delay500ms();
    }
}

LED流水灯代码

# include "reg52.h"
# include "intrins.h"
void Delay500ms()		//@12.000MHz//由STC-ISP烧录软件生成的延时函数
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 23;
	j = 205;
	k = 120;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main()
{
    int i=0;
    while(1)
    {
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;   //0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出

        P0=0XFE;        //移位前的第一个状态,如果为0XFF,则第一个灯不会亮
        for(i=1;i<=8;i++) //移位操作的循环控制,从左到右
        {
            Delay500ms();   //延时函数,用于控制LED亮的时间
            P0=~(0x01<<i);  //移位操作,例如:~(0000 0001<<1)=~0000 0010=1111 1101左边第二个LED灯点亮
        }

        //P0=0X7F;        //0X7F-->0111 1111 ,从右往左的流水灯
        //for(i=1;i<=8;i++)
        //{
        //Delay500ms();
        //P0=~(0x80>>i); //移位操作,例如:~(1000 0000>>1)=~0100 0000=1011 1111右边第二个LED灯点亮
        //}
    }
}

关闭蜂鸣器(关闭外设)

蜂鸣器对应的原理图

图片替换文本
图片替换文本

原理图分析

  1. 该Buzzer是有源蜂鸣器,一端已经接在VCC上,当N BUZZER为低电平时,蜂鸣器会响
  2. ULN2003是一颗高耐压、大电流符合晶体管芯片,内部有7个硅NPN复合晶体管组成,在逻辑上是一个非门

综述:当P06为高电平时,蜂鸣器会响,并且根据51单片机引脚悬空时,默认输出高电平,所以上电蜂鸣器就会响,我们调试的时候响着很烦,所以我们在写代码时第一步就是关闭蜂鸣器(或者叫外设)

关闭Y5控制的外设代码

int main()
{
	int i=0;
	
	P2 = ((P2 & 0x1f) | 0xa0);      //关闭Y5控制的全部外设  
	P0 = 0x00;  
	P2 &= 0x1f;
	P2 = (P2 & 0x1f) | 0xe0;        //同理关闭数码管
	P0 = 0xff;  
	P2 &= 0x1f;
	
	while(1)
	{
        P2 &= 0x1f;     //0x1F-->0001 1111, 前三位P27,P26,P25清零,防止锁存器出错
        P2 =P2| 0x80;		//0X80-->1000 0000, 100-->4,即打开Y4对应的锁存器,使Q端按照P端的输入进行输出
        P0=0XFE;
        for(i=1;i<=8;i++)
        {
            Delay500ms();
            P0=~(0x01<<i);
	}
}

版权声明:本文为CSDN博主「专属熊熊先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46074226/article/details/122313215

生成海报
点赞 0

专属熊熊先生

我还没有学会写个人说明!

暂无评论

相关推荐

蓝桥杯单片机总结

蓝桥杯单片机总结 参赛历程 就在大二上学期,刚好实验室要报名蓝桥杯,实验室里面的大部分人都选择了蓝桥杯单片机,只有几个同学报了蓝桥杯嵌入式,当然我对自己是没有那么自信的,