搞了个单片机2:进阶led控制(亮灭和两种流水控制方式)、延时时间控制、蜂鸣器。(蓝桥杯单片机速成)(零基础!超详细!小白速成!教你跑遍单片机例程!)
前言:如果有软件不会使用的,可以参考官方的给出的资源包里面的软件使用,里面不仅包含了如何安装软件也涵盖了一些例程的演示
LED的简单亮灭
我们先来操控LED的简单亮灭,然后再来控制亮灭的时间。
上节课,我说过,用总线控制法来写下一个程序,现在,根据上节课的基础,我来写一个程序
#include<reg52.h>
void main(void)
{
P2 = ((P2&0x1f)|0x80);
P0 = 0xfe;
P2 &= 0x1f;
}
操控的时候,要格外注意大小写,为什么P0、P2要大写呢?其实,在reg52.h里面,定义了P0、P2口,所以,我们要按照规范来。否则会出现未定义的情况。上面的程序是控制第一个LED灯亮。P07-P00的二进制是1111 1110,给低电平就是亮了,具体原因在上一篇博客中。
好,现在还只是亮,下面,我先写一个循环和简易的延时来控制亮灭进程。
#include<reg52.h>
void main(void)
{
unsigned int a;
while(1)
{
a = 65535;
P2 = ((P2&0x1f)|0x80);
P0 = 0xfe; //open LED
P2 &= 0x1f;
while(a--);
a = 65535;
P2 = ((P2&0x1f)|0x80);
P0 = 0xff;//close LED
P2 &= 0x1f;
while(a--);
}
}
视频点这里观看
目前为止,这还是个简陋的亮灭程序,下面,我们来研究更方便控制的延时。
- 这里插入一个小知识点,keil里面的宏定义格式 :
#define 自定义的名字 原本的规范名字
例如:#define uint unsigned int
现在,我考虑用for循环来试一试,你们也可以用do while循环,而且在官方例程上,我们可以看到do while循环,目前,我采用for循环。
#include<reg52.h>
#define uint unsigned int
void delay(uint k)
{
uint i = 0;
uint j = 0;
for(i=700;i>0;i--)
{
for(j=0;j<k;j++)
{
;
}
}
}
void main(void)
{
while(1)
{
P2 = ((P2&0x1f)|0x80);
P0 = 0xfe; //open LED
P2 &= 0x1f;
delay(500);
P2 = ((P2&0x1f)|0x80);
P0 = 0xff;//close LED
P2 &= 0x1f;
delay(500);
}
}


这个我也录制了视频, 视频点这里观看.
蜂鸣器的使用
老样子啊,我们需要先观看原理图,这里我先告知一下,蜂鸣器的英语单词:

好,知道了这个单词之后,我们来找原理图上面的蜂鸣器

这里可以类比LED,给0。想要关闭蜂鸣器,那就在我图中标识的地方,给高电平,也就是给1。
接下来,我们再找这个N_BUZZ连的是哪里

我给大家连起来了,这样观赏比较直观,再接着,我们又看到这个蜂鸣器的左端寄存器和LED很像,那么我们要根据左端的Y5C找到对应的Y5口

再接着找Y5连在哪里

左端的寄存器,是否似曾相识?没错!就是也控制LED的那个,原理我已经在上一篇文章中叙述过了
那么此时,我们需要给Y5一个低电平也就是0,使电流通过。

我们需要P27-5的控制是这个结果,你可以直接转换成16进制 赋值给P2,也可以按照我之前说的,为了方便查看,按照官方例程来,先给P2的高三位初始化,这个步骤也在我上一篇文章中说过了,下面,我直接通过蜂鸣器的信号来控制了,你也可以采用总线控制,但我觉得位控制比较方便:
sbit BUZZ = P0^6;
void cbuzz(uint c)
{
P2 = ((P2&0x1f)|0xA0);
BUZZ = c;
P2 &= 0x1f;
}
为什么是P0^6?这就是原因:

这个蜂鸣器函数封装好了,我们只需要调用就好了,下面是目前的总程序:
#include<reg52.h>
#define uint unsigned int
sbit BUZZ = P0^6;
void cbuzz(uint c)
{
P2 = ((P2&0x1f)|0xA0);
BUZZ = c;
P2 &= 0x1f;
}
void delay(uint k)
{
uint i = 0;
uint j = 0;
for(i=700;i>0;i--)
{
for(j=0;j<k;j++)
{
;
}
}
}
void main(void)
{
while(1)
{
P2 = ((P2&0x1f)|0x80);
P0 = 0xfe; //open LED
P2 &= 0x1f;
cbuzz(0);
delay(500);
P2 = ((P2&0x1f)|0x80);
P0 = 0xff;//close LED
P2 &= 0x1f;
cbuzz(1);
delay(500);
}
}
来吧!!展示!

视频点这里观看.
流水灯走起!
终于到了这个环节了,接下来,我手把手教你们跑流水灯,通过库函数,和操作符两种方法,完成流水灯的设计
顺流流水灯
①库函数的方法
首先,我们要知道2个库函数:crol 还有cror


这个原理解释清楚了,那么cror的原理就不难理解了吧。r是right也就是右的意思,l是left也就是左的意思。
好,现在我们可以知道这两个函数的用途了,我们先体验一下这crol这个函数,cror就留给你们自己体验看成果。
代码如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
sbit BUZZ = P0^6;
void cbuzz(uint c)
{
P2 = ((P2&0x1f)|0xA0);
BUZZ = c;
P2 &= 0x1f;
}
void delay(uint k)
{
uint i = 0;
uint j = 0;
for(i=700;i>0;i--)
{
for(j=0;j<k;j++)
{
;
}
}
}
void main(void)
{
uint temp = 0;
temp = 0xfe;
P0 = temp;
while(1)
{
P2 = ((P2&0x1f)|0x80);
temp = _crol_(temp,1);
P0 = temp;
P2 &=0x1f;
cbuzz(0);
delay(500);
cbuzz(1);
delay(500);
}
}

来吧!展示!

视频点击这里观看.
②操作符的方法:

代码如下:
#include<reg52.h>
#define uint unsigned int
sbit BUZZ = P0^6;
void cbuzz(uint c)
{
P2 = ((P2&0x1f)|0xA0);
BUZZ = c;
P2 &= 0x1f;
}
void delay(uint k)
{
uint i = 0;
uint j = 0;
for(i=700;i>0;i--)
{
for(j=0;j<k;j++)
{
;
}
}
}
void main(void)
{
uint temp = 0;
temp = 0xfe;
P0 = temp;
while(1)
{
P2 = ((P2&0x1f)|0x80);
//temp = _crol_(temp,1);
P0 = temp;
temp <<= 1;
P2 &=0x1f;
cbuzz(0);
delay(500);
cbuzz(1);
delay(500);
}
}
来吧!!展示!!!

视频点击这里观看
其实这个是有缺陷的,它最后会停在全亮的状态,所以我们需要将代码完善一下
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
sbit BUZZ = P0^6;
void cbuzz(uint c)
{
P2 = ((P2&0x1f)|0xA0);
BUZZ = c;
P2 &= 0x1f;
}
void delay(uint k)
{
uint i = 0;
uint j = 0;
for(i=700;i>0;i--)
{
for(j=0;j<k;j++)
{
;
}
}
}
void main(void)
{
uint temp = 0;
temp = 0xfe;
P0 = temp;
while(1)
{
while(temp != 0x00)
{
P2 = ((P2&0x1f)|0x80);
//temp = _crol_(temp,1);
P0 = temp;
temp <<= 1;
P2 &=0x1f;
cbuzz(0);
delay(500);
cbuzz(1);
delay(500);
}
temp = 0xfe;
}
}
来吧!展示!!!

视频点击这里观看
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
目前的课程到此为止!!!我们下期再见!

浙公网安备 33010602011771号