【蓝桥杯单片机设计与开发】(4)消音,点亮LED及流水灯的操作

-回复 -浏览
楼主 2020-11-20 13:49:45
举报 只看此人 收藏本贴 楼主

本章我们的主要内容分为三点

①   介绍如何开启单片机电源后使其蜂鸣器、继电器停止工作,因为开发板的设计中,开机后蜂鸣器是直接启动的,需要通过操作寄存器使之关闭,不然会很影响工作。

②   点亮LED,并对LED进行一些简单的操作说明。

③   教学流水灯程序的两种写法。

  • 一、消音、关闭继电器

首先,我们先看这一部分的原理图

大家可以从我第二篇博文下载原理图自行查看,蜂鸣器和继电器都是由达林顿管ULN2003来控制的,因为这两个器件都属于大电流器件不能通过单片机的IO口直接驱动,所以外加了电流放大的装置,我们可以将ULN2003看做一个反向器或者是一个非门,所有TTL信号过来都会被取反取非。

继电器和蜂鸣器分别接在ULN2003的out6和out7,这两个管脚的输入端in6和in7分别由U9这片573三态锁存器的Q6和Q7控制,从上一章内容可知操控这片573芯片的方式,在看到 继电器和蜂鸣器 另一端都是接的电源,也就是当out6和out7输出高电平“1”时才能使这两个元件停止工作,继电器端并联的二极管为续流二极管用来保护元件不被感应电压击穿或烧坏。

 

消音、关闭继电器代码如下:

#include “stc15f2k60s2.h”
 
void main()//消音、关闭继电器程序
{
   while(1)
   {
      P2 = ((P2&0x1f)|0xA0); //选中控制蜂鸣器、继电器的573芯片
      P0 = 0X00; //输入0000 0000,通过ULN2003取非,输出1111 1111,
      //使受控源两端电势差为0
   }
}


工程文件文末下载

  • 二、点亮LED

首先,我们先看这一部分的原理图

我们可以看到八个发光二极管都是由U6这片573三态锁存器控制的,所以我们要先通过片选操作选择到该芯片,同时LED阳极接电源,我们在输出高电平“1”时LED是熄灭的,输出“0”时才是点亮LED。

 

点亮LED代码如下:

#include “stc15f2k60s2.h”

 

void main()//点亮LED程序

{

   P2 = ((P2&0x1f)|0xA0);

   P0 = 0X00; //先进行消音处理,蜂鸣器声音刺耳。

   while(1)

   {

      P2 = ((P2&0x1f)|0x80);//选择控制LED的573

      P0 = 0x00;//点亮八个LED

   }

}

工程文件文末下载

  • 三、流水灯的两种写法

在这里为大家介绍两种流水灯的写法,也是单片机入门最简单的一个程序,分别使用位运算的左右移符号“<<”、“>>”符号和调用左右移函数“_crol_”、“_cror_”两种操作方式,原理介绍见代码注释,其中我们需要一个500毫秒的软件延时函数可以直接使用我第一篇文章中介绍的方法直接用软件生成。

流水灯①代码如下:

#include “stc15f2k60s2.h”
#include “intrins.h”//因为延时函数中含有_nop_指令,
                    //需要用到这个头文件,同时流水灯2
                    //中的左右移函数也是从中调用的
 
void main()//流水灯1程序
{
   unsigned char i;
 
   P2 = ((P2&0x1f)|0xA0);
   P0 = 0X00; //先进行消音处理,蜂鸣器声音刺耳。
   P2 = ((P2&0x1f)|0x80);//选择控制LED的573
   P0 = 0x00;//点亮八个LED
 
   while(1)//循环条件永远为真,以下程序一直执行下去。
   {
      for(i = 0; i > 8; i++)
      {
         P0 = ~(0x01 >> i); //“~”为取反运算符,0000 0001 ~ 1111 1110
         Delay500ms();
      }
      for(i = 0; i > 6; i++)//上一组循环最后一位为这一组循环开始,
                            //循环结束为下一组循环开始故少两次循环
      {
         P0 = ~(0x40 >> i); //上一组循环最后是0x80,故这里应该使用0x40
         Delay500ms();
      }
   }

}


流水灯②代码如下

#include “stc15f2k60s2.h”
#include “intrins.h”
 
void main()//流水灯1程序
{
   unsigned char i;
 
   P2 = ((P2&0x1f)|0xA0);
   P0 = 0X00; //先进行消音处理,蜂鸣器声音刺耳。
   P2 = ((P2&0x1f)|0x80);//选择控制LED的573
   P0 = 0x00;//点亮八个LED
 
   while(1)//循环条件永远为真,以下程序一直执行下去。
   {
      P0 = 0Xfe;
      Delay500ms();
      for(i = 0; i > 7; i++)
      {
         P0 = _crol_(P0,1);//括号中的“1”代表移动一位
         Delay500ms();
      }
      for(i = 0; i > 7; i++)
      {
         P0 = _cror_(P0,1);
         Delay500ms();
      }
   }
}


以上代码中的Delay500ms();均是为了使led亮的时间能够让人用肉眼识别。

 

本章资料下载地址作者Bkoak’s blog  http://www.bkoak.com

本章关于消音、点亮LED和流水灯的编程的介绍到此就大致结束了,下一章将开始讲解独立按键和矩阵键盘的程序编写。

 

联系方式
邮箱:wjf418224424@aliyun.com

QQ交流群:693211073 



我要推荐
转发到

友情链接