一、宗旨
从零到一、循序渐进、不讲废话、通俗易懂、个人实践
二、功能需求与效果
1、功能需求
1.1、继电器循环独立开关
1.2、蜂鸣器循环独立开关
1.3、继电器蜂鸣器交替循环开关
2、效果展示(打开小喇叭,调低音量效果更佳)
三、原理图分析
蜂鸣器&继电器控制其实和LED控制都是一样滴,只有细微差别,如果已经掌握了LED控制方法,那么这个就完全是手拿把掐了。
![](https://img-blog.csdnimg.cn/direct/6aa0fb3a47b24797b395f39f9ae5f622.png)
原理图-1中右边两个就分别是蜂鸣器(下)与继电器(上),不难看出他俩的正极都已经连接上了,VCC那么就剩负极给咋们操作了 。这两负极引脚很明显是由左边这一坨东西控制的,在LED控制那篇文章中已经简单介绍了Dn=Qn,这里与LED控制不同的地方就是多了个ULN2003这个东西简单直白的说就是个取反的,INn和OUTn中间是通过一个非门连接的,所以咋们就只要晓得OUTn=!INn就够用了。经过这个中间商这么一搞,我们想控制蜂鸣器和继电器开/关,就需要控制P04和P06引脚输出1/0信号了。与LED控制中所讲的一样,Dn和Qn能不能连起来还要看Y5C的脸色,下面就讲讲怎么贿赂Y5C给咋们行个方便(与LED控制中所讲相同,可跳过)。
![](https://img-blog.csdnimg.cn/direct/fa0ede97f1db4f7285703bdd1f0ae932.png)
原理图-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;
}
上述均为个人观点,不喜勿喷!如有纰漏,望君指正!