×
单片机 > 单片机程序设计 > 详情

51单片机学习之陆 —— 1.3 流水灯的花样玩法

发布时间:2020-06-19 发布时间:
|

上一次我们点亮了一个流水灯 LED1,其实仅仅点亮一个流水灯还是有些单调的。

这一次让我们试着尝试些别的花样

1 多个流水灯的点亮

   a 打开keil 将原来的c文件关掉

左边的也删掉,因为我并不像重新创建工程

按照昨天的方法新建一个c文件,并添加到工程中(以后也这样,所以请有自己的命名规则,否则都分不清了,而我这里命名的是LED1.1)

 

 

b 将代码写上。(假如你要点亮1357这几个流水灯)

#include
sbit LED1 = P1^0;
sbit LED3 = P1^2;
sbit LED5 = P1^4;
sbit LED7 = P1^6;
void main()
{
LED1 = 0;
LED3 = 0;
LED5 = 0;
LED7 = 0;
}

以上为代码,

 

 

c 和上一次一样,接上usb,烧写程序(记得冷启动哦)

这里说明下,因为是在同一个工程中,所以hex文件的名字还是不变的。

这是就可以看到1 3 5 7 流水灯点亮了哦。

手机像素不太好,不过你应该能在板子上看的十分清晰。

2  流水灯的点亮和熄灭

  流水灯一直点亮也有些无聊,来我们让他们动起来吧

  我们已经知道,LED1 = 0; 置于低电平 点亮,

         LED1 = 1; 置于高电平 熄灭

  那如何让一个流水灯点亮一段实践熄灭一段时间呢?

  这里可以用一个延时函数做到。在延时函数中,不做任何事情。

  新建一个c文件,注意你的命名,最好不要出现中文,形成自己的命名规则

  a 写下代码

说明下:

  #define uint unsingned int 是宏定义,c语言中学过

  // 是单行注释 

  /*  是多行注释 */

  for(i=1000; i>0; i--) ;

    for(j=110; j>0; j--);

  1 为什么用两个for循环?

    应为一个for循环延时时间不够,无法让人有察觉所以用了两个for循环嵌套。这样就有明显的人眼察觉了

  2 为什么第二个for循环后直接是分号

    直接分号,就是不执行任何代码的意思,单纯做延时用。

 

  b 烧写程序

  c   观察流水灯

     仔细观察流水灯,第一个流水灯会点亮一定时间,然后熄灭一定时间,又点亮如此循环下去

     应为有一个while(1)这样的循环,其中为1,即真会一直执行while循环中的语句。

     这也是很重要的一点,很多单片机程序中都有while(1)这样一个循环,

     这是各中单片机自身决定的。有的单片机程序内如果没有循环程序,那它会从头执行到最后,然后返回最开始继 续执行。一直重复。而有的单片机再执行一次之后,就会停止。有的则是执行完后可能会进入无序运行状态,就只不知道程序跑哪里去了! 所以,在写单片机程序的时候,最好是加上while循环,即便你的程序只运行一次,也要在最后加上while(1);使其一直指向这个语句而不会出现误操作。

     还有,这里是不精确的延时,因为一些原因这里无法做到很精确的延时。

 

3  流水灯来回点亮

   我们将流水灯点亮了,但如何将这些流水灯依次点亮呢?

  a 有些同学会想到这样的方法

   其实这样写也是可以的,你会看到流水灯从1 到 4 依次点亮

   这里写了 P1 = 0xff  这里是说当4个流水灯全部点亮后 ,将整个P1口8为全置1

   即全部熄灭。这样的话,就能看到流水灯依次点亮,全部熄灭,又依次点亮

   其实还有另外一种方法。

 

  b    头文件intrins的函数使用

      intrins 是一个是一个包含了很多函数的头文件,这里介绍其中的两个函数

      _crol_ 字符循环左移

      _cror_ 字符循环右移

      以_cror_为例

      我们都知道P1口控制流水灯 P1 有八位

      默认状态下 P1 = 0xff // 1111 1111 

      假如写下以下代码

      首先,想要使用_cror_函数,首先需要头文件intrins

      语句为 #include

      这里定义了一个temp=0x7f // 0111 1111

      P1 = temp 所以最开始是第八个流水灯亮

      

      for循环表示重复8此该操作

      temp = _cror_(temp,1);

      上面语句的意思是P1口循环右移一位

      

      所以第七个流水灯就亮了,其他的为1 熄灭。

      这里还有一点,定义了一个延时函数,delay 是一个无返回值的函数

      定义方法有两种,与c语言中一致。

      然后你就会看到。流水灯先亮第八个,然后依次往上点亮,而其他的确熄灭。

      好了,_crol_的用法也是一样的 除了依次点亮,也可以间隔一个点亮

      temp = _cror_(temp,2);只要将1改为2即可

      


关键字:51单片机  流水灯  花样玩法

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式