51单片机 闪灯

上一篇写了点亮一个灯,这一篇写一下闪一个灯

首先,流水灯实现起来就是一个一个点灯,中间加入一个延时就行了

我们先实现闪一个灯,从上一个代码添加一些代码即可完成

最重要的就是这个延时函数的实现,我们是通过不精准延时,单片机啥也不干在计数实现

这里同时可以再讲讲while的用法

unsigned int count = 0;

while(count <= 50000)
{
    count = count + 1;
}

这样就是通过单片机不停计数来实现延时(具体延时多久,不用太在意)

 加入到代码实现闪灯

#include "reg52.h"

sbit D1 = P2^0;
unsigned int count = 0;

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        while(count <= 50000)
        {
            count = count + 1;
        }
        
        D1 = 1;//灯灭
        while(count <= 50000)
        {
            count = count + 1;
        }
    }
}

这样就能实现闪灯了吗?想想应该可以,下载进去看下效果

这里说道下载就要提一下,生成下载hex文件

点击魔法棒点击选项卡output,勾选上,点击确定

然后最重要的是要在编译一次,下面输出这个

创建了hex文件到工程目录的\Objects\led.hex这个文件了,下载就不说了

下载进去发现,咦,怎么不行,仔细看一下就能分析出来是变量没有清零了 = =!改一改

#include "reg52.h"

sbit D1 = P2^0;
unsigned int count = 0;//unsigned int 范围0到65535

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        count = 0;
        while(count <= 50000)
        {
            count = count + 1;
        }
        
        D1 = 1;//灯灭
        count = 0;
        while(count <= 50000)
        {
            count = count + 1;
        }
    }
}

下载进去发现可以了,这里我们举一反三,如果要实现灭灯是亮灯时间的一半怎么写?只要稍微改改一个数就行了,主要是根据需求来,这个清零是根据需求决定的,并不一定就要清零(应该明白我的意思吧)

#include "reg52.h"

sbit D1 = P2^0;
unsigned int count = 0;//unsigned int 范围为0到65535

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        count = 0;
        while(count <= 50000)
        {
            count = count + 1;
        }
        
        D1 = 1;//灯灭
        count = 25000;
        while(count <= 50000)//这里因为初始值是从25000开始的所以时间是灯亮的一半时间
        {
            count = count + 1;
        }
    }
}

 这里发现这个地方有重复的语句,重复的语句可以用函数写下来,直接调用,会更加简单

上一章讲了函数是酱紫的,我们就来确定这些东西

返回值 函数名(参数)
{
  函数体
}
首先我们来确定最难的函数名,就叫delay吧,函数名和变量名尽量取得有意义一点,一看就明白是干嘛的
返回值和参数都先为空就void咯
然后把重复的东西复制到函数体里面
void delay(void)
{
    count = 0;
    while(count <= 50000)
    {
        count = count + 1;
    }
}
总体就是
#include "reg52.h"

sbit D1 = P2^0;
unsigned int count = 0;

void delay(void)
{
    count = 0;
    while(count <= 50000)
    {
        count = count + 1;
    }
}

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        delay();
        D1 = 1;//灯灭
        delay();
    }
}
这样就实现了延时,但是如果我要实现我后面那个功能呢(灭灯是亮灯时间的一半)
这里有很多种方法,我就随便举例两种
一种是修改delay函数的赋值语句,在主函数里面赋值
一种是函数带参数逇形式,这种是最为简便的
自己比较一下
第一种:
#include "reg52.h"

sbit D1 = P2^0;
unsigned int count = 0;

void delay(void)
{
    
    while(count <= 50000)
    {
        count = count + 1;
    }
}

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        count = 0;
        delay();
        D1 = 1;//灯灭
        count = 25000;
        delay();
    }
}
第二种:
#include "reg52.h"

sbit D1 = P2^0;

void delay(unsigned int count)
{
    unsigned int i = 0;
    while(i <= count)
    {
        i = i + 1;
    }
}

void main(void)
{
    while(1)
    {
        D1 = 0;//灯亮
        delay(50000);
        D1 = 1;//灯灭
        delay(25000);
    }
}

一比较就知道第二种代码更加简洁,而且想要计数多少都行

这里牵扯到变量的作用域,一个是全局函数一个是局部函数,也讲一讲吧【喷血】

局部变量

定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的

全局变量

在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。

 

好了,喜欢的朋友点波关注 = =,后续如果朋友没有放弃的话,会陆续更新

转载请注明出处


posted @ 2019-03-26 14:20  只因在风中  阅读(459)  评论(1)    收藏  举报