搞了个单片机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;
		}	
}

来吧!展示!!!
在这里插入图片描述
视频点击这里观看

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
目前的课程到此为止!!!我们下期再见!

posted @ 2021-02-08 21:11  zbossz  阅读(217)  评论(0)    收藏  举报