单片机C语言流水灯花样编程,51单片机学习之陆 —— 1.3 流水灯的花样玩法

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

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

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

1 多个流水灯的点亮

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

961957157a2eafcfd46819f5d3e48664.png

cb70234a90a23a49993e15afacbe9b51.png

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

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

aeb7cc48bdfeb6d01ec821856476968d.png

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

#

sbit LED1 = P1^0;

sbit LED3 = P1^2;

sbit LED5 = P1^4;

sbit LED7 = P1^6;

main()

{

LED1 = 0;

LED3 = 0;

LED5 = 0;

LED7 = 0;

}

以上为代码,

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

364a252724455b0d89d21d99ed9ec209.png

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

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

c69ba199d2a13c3683754cf4422b5bdb.png

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

2 流水灯的点亮和熄灭

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

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

LED1 = 1; 置于高电平 熄灭

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

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

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

a 写下代码

dac90bf84940b418346a03f0cd8fc71c.png

说明下:

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

// 是单行注释

/* 是多行注释 */

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

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

65feb7be88eb3e8aa1399fc98c89fe32.png

1 为什么用两个for循环?

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

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

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

b 烧写程序

c 观察流水灯

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

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

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

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

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

3 流水灯来回点亮

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

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

b58234a4f1aa6e52a483569f6f6ed9a8.png

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

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

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

其实还有另外一种方法。

b 头文件intr的函数使用

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

_crol_ 字符循环左移

_cror_ 字符循环右移

以_cror_为例

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

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

假如写下以下代码

bbf0ce38dfb75e35b66e045b83e4cccf.png

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

语句为 #include

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

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

e718f5cf226ff5413c5f86327d56cf55.png

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

temp = _cror_(temp,1);

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

f16a7d5ea20c54578e46f3dcd8895dad.png

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

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

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

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

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

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

4f2d5412cd82cd7eedd3658214715980.png

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值