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 文件。
好了,喜欢的朋友点波关注 = =,后续如果朋友没有放弃的话,会陆续更新
转载请注明出处

浙公网安备 33010602011771号