蓝桥杯 01:蜂鸣器、继电器、LED的使用

前言

报名了3月份的蓝桥杯比赛,特地写博客来记录自己的学习。

开发工具

开发板:CT107D+
编译环境:Keil5

原理简介

在以前学习51单片机的时候,可以通过置1(高电平)和0(低电平)的方式来使LED、蜂鸣器工作。但在CT107D+开发版上还需一些初始化

蜂鸣器原理图 :可知给 BUZZ 这个IO口置0低电平)就能完成蜂鸣器的使用。

再看 BUZZ 连接在单片机的那个 GPIO 口

在这里插入图片描述
清楚看见 BUZZ 连接在 P0^6 ,但有一个锁存器(74HC573)和 ULN2003 挡在中间.
我们使用蜂鸣器的思路为:

打开锁存器,使得 P0^6(D7)控制Q7输入到IN7然后输出到OUT7端口即BUZZ端口。

如何打开锁存器呢?因为OE端口已共地,我们只需控制LE端口,即当LE = 1,锁存器打开,即此时 Q7电平受到D7影响 即:P0^6(D7) = Q7(电平状态),若LE = 0 ,则 Q7的电平状态不受D7影响,即Q7等于上一个锁存器关闭时的电平状态。

我们现在需要给Y5CLE)端口置1(高电平)以此来打开锁存器
再翻开发板原理图找:
在这里插入图片描述
74HC02 是个非门电路,即 Y5C = ! (Y5 || WR) ,WR端口有跳线帽共地,WR为低电平。

(!:代表非运算,0变1, 1变0; ||:或运算, 1 || 0 =1, 0 || 0 = 0;)

要使 Y5C = 1,即 !(Y5 || WR) = 1, 所以 (Y5 || WR)= 0, 又因为WR = 0, 所以 Y5 = 0。

所以我们需要使Y5 端口的电平为 低电平。

又通过原理图可知:Y5的输出由P2端口的高三位控制在这里插入图片描述
翻阅74HC138译码器的芯片手册可知

A B C Y1 Y2…和原理图上的标号对应端口一致 X:不用在意 L: 低电平 H:高电平
在这里插入图片描述
看不懂没关系,我们去学长博客那边偷图:
在这里插入图片描述
可知P2的高三位不同的电平排序,代表了不同的电平输出
我们想控制 Y5 为低电平, 即P27 = 1, P26 = 0, P25 = 1;P2口的低五位的电平不影响Y5低电平的输出 。
我们的原理部分大致讲的差不多了。
再来理一下思路:
在这里插入图片描述

蜂鸣器程序代码

蜂鸣器部分:

sbit BEEP = P0^6;  //蜂鸣器接口


void BEPP_init()
{
    
    
	P2 = (P2&0X1F)| 0XA0;   // 1f , a0 均为16进制编码,可用计算器计算得出
    /* 打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平).
    再使上三位等于1 0 1 (置1采用或运算),操控Y5 */

	BEEP = 0;   //初始化,关闭蜂鸣器
}

继电器

根据原理图可知:在锁存器打开的情况下 继电器由 P0^4 端口控制。
其原理与蜂鸣器原理大致相同。
在这里插入图片描述

在这里插入图片描述
和蜂鸣器相同,同样是通过译码器使 Y5 = 0, 再经过非门操作打开锁存器
在这里插入图片描述
代码

sbit RELAY = P0^4;  //继电器接口

void RELAY_init()
{
    
    
	P2 = (P2&0X1F)| 0XA0;  //原理一样,同样操控Y5
	RELAY = 0;  //初始化,关闭继电器

}

LED

原理图:在锁存器打开的情况下,P0口直接操控 LED灯,刚好都是八位。
在这里插入图片描述
在这里插入图片描述

和蜂鸣器不同的是,通过P2高三位操控译码器使 Y4 = 0, 再经过非门操作打开锁存器

代码

void LED_init()
{
    
    
	P2 = (P2&0X1F) | 0X80; 
	/*打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平)	
    再使上三位等于1 0 0 (置1采用或运算),操控Y4 */	
   
   
    P0 = 0XF0;  //初始化,点亮一半的灯

}

完整工程代码

#include <reg52.h>


sbit BEEP = P0^6;  //蜂鸣器接口
sbit RELAY = P0^4;  //继电器接口

void BEPP_init();  //蜂鸣器初始化
void LED_init();   //LED初始化
void delay(unsigned int m);  //简单的延时函数 
void RELAY_init();    //继电器初始化


void main()
{
    
    
	BEPP_init();  
	LED_init();
	while(1)
	{
    
    
		BEEP = 1;   
    delay(500);
		BEEP = 0;
    delay(500);
	}
}

void BEPP_init()
{
    
    
	P2 = (P2&0X1F)| 0XA0;    //打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平),再使上三位等于1 0 1 (置1采用或运算),操控Y5
	BEEP = 0;   //初始化,关闭蜂鸣器
}

void RELAY_init()
{
    
    
	P2 = (P2&0X1F)| 0XA0;
	RELAY = 0;  //初始化,关闭继电器
}

void LED_init()
{
    
    
	P2 = (P2&0X1F) | 0X80;  //打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平),再使上三位等于1 0 0 (置1采用或运算),操控Y4
	P0 = 0XF0;  //初始化,点亮奇数灯

}
void delay(unsigned int m)  //简单的延时函数
{
    
    
  unsigned int i;
	unsigned int j;
	for(i=0;i<m;i++)
		for(j=0;j<309;j++);
}

猜你喜欢

转载自blog.csdn.net/songsong233/article/details/112886878
今日推荐