此片文章用于记录蓝桥杯单片机的学习。
LED 蜂鸣器 继电器 数码管 这些都是比赛时常用的外设,如下原理图:
LED部分:
蜂鸣器和继电器部分(图中还有步进电机部分):
数码管部分:
可见,上述外设都是通过P0口控制74HC573锁存器控制,而锁存器信号Y4C,Y5C,Y6C,Y7C,来源与74LS138译码器和或非门控制,如下所示:
则针对以上外设的使用,只需先控制P25,P26,P27三个口输出地址信号来选中外设:
(在实际选外设地址过程中,由于只改变P2口的高三位,即P25,P26,P27,不改变低五位,采取先与在或的写法控制改变P2口的高三位)
LED | 蜂鸣器和继电器 | 四位数码管的位选 | 四位数码管的段选 | |
相关地址 | 0x80 | 0xa0 | 0xc0 | 0xe0 |
现在我们把这些整个外设封装成一个.C和.H文件:
(我使用的是STC15的头文件,也可使用52的头文件,略微改动即可)
74LS138.h:
#ifndef _74LS138_H_
#define _74LS138_H_
#define NONE_ADDRESS 0x00 //不选中任何地址 000 00000
#define LED_ADDRESS 0x80 //选中LED的地址 100 00000
#define BUZZER_ADDRESS 0xa0 //选择蜂鸣器 继电器 电机的地址 101 00000
#define TUBE1_ADDRESS 0xc0 //选中数码管位选地址 110 00000
#define TUBE2_ADDRESS 0xe0 //选中数码管段选地址 111 00000
void Select_ls138(unsigned char address); //选相关外设地址
void Control_buzzer(unsigned char signal); //控制蜂鸣器开关
void Control_relay(unsigned char signal); //控制继电器开关
void init_ls138(); //关闭所有外设
void Show_tube(unsigned char site,unsigned char number); //控制数码管显示数字
#endif
74LS138.C:
#include <STC15F2K60S2.H>
#include "74LS138.h"
code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90 };
//数码管显示0-9
void Select_ls138(unsigned char address) {
P2 &= 0x1f;
P2 |= address;
}
void Control_buzzer(unsigned char signal) // 1打开 0关闭
{
P2 &= 0x1f;
P2 |= BUZZER_ADDRESS;
if (signal == 1) {
P06 = 1;
} else {
P06 = 0;
}
P2 &= 0x1f;
}
void Control_relay(unsigned char signal) // 1打开 0关闭
{
P2 &= 0x1f;
P2 |= BUZZER_ADDRESS;
if (signal == 1) {
P05 = 1;
} else {
P05 = 0;
}
P2 &= 0x1f;
}
void init_ls138() // 关闭所有外设 上电先运行一次
{
Select_ls138(LED_ADDRESS);
P0 = 0xff;
//关闭LED外设
Select_ls138(BUZZER_ADDRESS);
P0 = 0x00;
//关闭蜂鸣器 继电器 电机等外设
Select_ls138(TUBE1_ADDRESS);
P0 = 0xff;
Select_ls138(TUBE2_ADDRESS);
P0 = 0xff;
//关闭数码管外设
Select_ls138(NONE_ADDRESS);
}
void Show_tube(unsigned char site, unsigned char number) //控制数码管显示 site:控制第几个数码管亮(0-7) number:控制显示几(0-9)
{
Select_ls138(TUBE1_ADDRESS);
P0 = 0x01 << site;
Select_ls138(TUBE2_ADDRESS);
P0 = tab[number];
Select_ls138(NONE_ADDRESS);
}
在以后的外设调用中,直接使用封装好函数的即可。
简单的试一下:
#include <STC15F2K60S2.H>
#include "intrins.h"
#include "74LS138.h"
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do {
do {
while (--k)
;
} while (--j);
} while (--i);
}
void main() {
init_ls138();
// 上电关闭所有外设
Select_ls138(LED_ADDRESS);
//选中LED的地址
P0 = 0x00;
//全亮
Delay500ms();
Select_ls138(LED_ADDRESS);
P0 = 0xff;
// 全灭
Delay500ms();
Control_buzzer(1);
//蜂鸣器响
Delay500ms();
Delay500ms();
Control_buzzer(0);
//蜂鸣器灭
Show_tube(0, 6);
// 第一个数码管显示6
while (1) {
}
}
现象就是灯先全亮然后灭,然后蜂鸣器先响和不响,最后数码管第一个显示6。
版权声明:本文为m0_63493062原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。