蓝桥杯单片机程序设计部分零基础个人分享2——蜂鸣器&继电器控制

一、宗旨

        从零到一、循序渐进、不讲废话、通俗易懂、个人实践

二、功能需求与效果

1、功能需求

        1.1、继电器循环独立开关

        1.2、蜂鸣器循环独立开关

        1.3、继电器蜂鸣器交替循环开关

2、效果展示(打开小喇叭,调低音量效果更佳)

三、原理图分析

         蜂鸣器&继电器控制其实和LED控制都是一样滴,只有细微差别,如果已经掌握了LED控制方法,那么这个就完全是手拿把掐了。

原理图-1

        原理图-1中右边两个就分别是蜂鸣器(下)与继电器(上),不难看出他俩的正极都已经连接上了,VCC那么就剩负极给咋们操作了 。这两负极引脚很明显是由左边这一坨东西控制的,在LED控制那篇文章中已经简单介绍了Dn=Qn,这里与LED控制不同的地方就是多了个ULN2003这个东西简单直白的说就是个取反的,INn和OUTn中间是通过一个非门连接的,所以咋们就只要晓得OUTn=!INn就够用了。经过这个中间商这么一搞,我们想控制蜂鸣器和继电器开/关,就需要控制P04和P06引脚输出1/0信号了。与LED控制中所讲的一样,Dn和Qn能不能连起来还要看Y5C的脸色,下面就讲讲怎么贿赂Y5C给咋们行个方便(与LED控制中所讲相同,可跳过)。

原理图-2

        原理图-2中的74HC02或非门和74HC138三八译码器具体是个啥我就不介绍了,咋们现在就关注Y5C引脚要咋个输出1。由或非门特性只有当两输入引脚同时输出0时才输出1,故而问题又转移为如何让Y5引脚输出0。让Y5引脚输出低电平的关键在于74HC138三八译码器的三个输入引脚ABC,当A=0,B=1,C=1时,Y5引脚就能输出0,此时便可通过P25~7引脚控制Y5C输出。

(以上描述,纯个人通俗理解,有诸多省略,详情请君自查)

四、功能实现思路

1、获取蜂鸣器&继电器控制权

        要想控制蜂鸣器&继电器就先得拿到控制权,也就是将Y5C置为1。如何将其置为1的方法在上述原理图分析中已经解释过了,直接控制P25~7引脚便可。

P2 &= 0X1F;  P2 |= 0XA0;

2、控制操作蜂鸣器&继电器

        拿到控制权打通Dn和Qn之间的桥梁后,便可以直接通过控制P06和P04两个I/O来操作蜂鸣器和继电器了

P04 = s;         //继电器控制
P06 = s;         //蜂鸣器控制

3、功能封装

        最后将零散的代码,稍作组合封装,以便日后的调用。

void Controls_Buzzer(bit s){
	P2 &= 0X1F;
	P06 = s;P2 |= 0XA0;
	P2 &= 0X1F;
}

void Controls_Relay(bit s){
	P2 &= 0X1F;
	P04 = s;P2 |= 0XA0;
	P2 &= 0X1F;
}

五、源代码

#include <STC15F2K60S2.H>

#define uint  unsigned int
#define uchar unsigned char
#define FLOG  2

void Delay(uint t);
void Controls_LED(uchar date);
void Controls_Relay(bit s);
void Controls_Buzzer(bit s);

int main (void){
	Controls_LED(0X00);
	Controls_Buzzer(0);
	Controls_Relay(0);
	while(1){
#if FLOG == 0
		Controls_Relay(1);
		Delay(500);
		Controls_Relay(0);
		Delay(500);
#elif FLOG == 1
		Controls_Buzzer(1);
		Delay(500);
		Controls_Buzzer(0);
		Delay(500);
#else
		Controls_Relay(0);
		Controls_Buzzer(1);
		Delay(500);
		Controls_Relay(1);
		Controls_Buzzer(0);
		Delay(500);
#endif
	}
}

void Delay(uint t){
	uint i,j;
	for(i = 0; i < t; i++)
	for(j = 0; j < t; j++);
}
void Controls_LED(uchar date){
	P2 &= 0X1F;
	P0 = ~date;P2 |= 0X80;
	P2 &= 0X1F;
}
void Controls_Buzzer(bit s){
	P2 &= 0X1F;
	P06 = s;P2 |= 0XA0;
	P2 &= 0X1F;
}
void Controls_Relay(bit s){
	P2 &= 0X1F;
	P04 = s;P2 |= 0XA0;
	P2 &= 0X1F;
}

上述均为个人观点,不喜勿喷!如有纰漏,望君指正!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值