蓝桥杯单片机学习日记1-LED 蜂鸣器 继电器 数码管的简单驱动

  此片文章用于记录蓝桥杯单片机的学习。

  LED 蜂鸣器 继电器 数码管 这些都是比赛时常用的外设,如下原理图:

 LED部分:

 蜂鸣器和继电器部分(图中还有步进电机部分):

 数码管部分:

 可见,上述外设都是通过P0口控制74HC573锁存器控制,而锁存器信号Y4C,Y5C,Y6C,Y7C,来源与74LS138译码器和或非门控制,如下所示:

   则针对以上外设的使用,只需先控制P25,P26,P27三个口输出地址信号来选中外设:

(在实际选外设地址过程中,由于只改变P2口的高三位,即P25,P26,P27,不改变低五位,采取先与在或的写法控制改变P2口的高三位)
 

LED蜂鸣器和继电器四位数码管的位选四位数码管的段选
相关地址0x800xa00xc00xe0

  现在我们把这些整个外设封装成一个.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版权协议,转载请附上原文出处链接和本声明。