一、要求
在CT107D单片机训练平台上实现蜂鸣器与继电器的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指示灯,蜂鸣器鸣叫一会后关闭,不断循环此过程。
(重点:学会对74HC138译码器和74HC573编码器的控制)
二、芯片介绍
关于74HC138译码器和74HC573锁存器的相关认识,可以参考以下这篇博文:【蓝桥杯—单片机学习笔记(一)】LED指示灯的基本控制_Backlight__的博客-CSDN博客
uln2003芯片—复合晶体管阵列:
该芯片的输出与输入极性相反,在进行程序设计时要注意!uln2003具体情况可以参考: uln2003有什么作用_引脚图及功能_工作原理及驱动应用电路-电子发烧友网 (elecfans.com)
三、硬件电路分析
如下图所示,蜂鸣器和发光二极管并不是直接与单片机的IO口相连,而是经过了一个uln2003复合晶体管和74HC573锁存器再与单片机的IO口相连。而驱动74HC573工作的使能端口LE的使能信号是来自Y5C,继续往前推,即可得到要想驱动锁存器进行工作,则需要译码器Y5输出为低电平(控制译码器的输入引脚CBA状态决定输出哪一路)。
由以上分析知:我们在进行编程时,要控制的单片机IO口就是P2.5~P2.7和P0口。
四、程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
void delay_ms(uchar xms) //@11.0592MHz
{
uchar i,j;
while(xms)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
xms--;
}
}
void channel(uchar n) //74HC138输出通道选择
{
switch(n)
{
case 4 :
P2 = (P2 & 0x1f) | 0x80; //获取P2口状态(不理解的可以参看:https://blog.csdn.net/weixin_52901292/article/details/119959975?spm=1001.2014.3001.5501)
break;
case 5 :
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6 :
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7 :
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void mode(uchar n, uchar m) //n-通道,m-P0口状态
{
channel(n); //选择通道
P0 = m; //对P0口赋值
}
void led_control()
{
uchar i;
for(i = 0; i < 3; i++)//连续亮灭三次
{
mode(4, 0x00);
delay_ms(1000);
mode(4, 0xff);
delay_ms(1000);
}
//控制继电器和蜂鸣器
mode(5, 0x10);
delay_ms(1000);
mode(5, 0x00);
delay_ms(1000);
//控制LED灯
for(i = 0;i < 8;i++)//逐个点亮
{
mode(4, 0xff << i);
delay_ms(1000);
}
for(i = 0;i < 9;i++)//逐个熄灭
{
mode(4, ~(0xff << i));
delay_ms(1000);
}
//控制继电器和蜂鸣器
mode(5, 0x40);
delay_ms(1000);
mode(5, 0x00);
delay_ms(1000);
}
void system_init() //系统初始化,关闭蜂鸣器继电器
{
mode(5, 0x00);
}
void main()
{
system_init();
while(1)
{
led_control();
}
}