登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 用C语言编程实现单片机8个流水灯循环

[复制链接]
发表于 2018-1-25 19:14:42 | 显示全部楼层 |阅读模式
学习笔记
学习科目: STC12C5A60S2单片机
学习安排: 《手把手教你学51单片机》第四章
开始时间: 2018-01-24
结束时间: 2018-01-25
在我第一次发的贴子里,我介绍到了如何使用C语言程序实现单片机8个LED小灯中的其中一个点亮且闪烁。当时用到的程序是这个 QQ图片20180125140443.png ,如果有人没有看过的话,可以去看一下,方便今天的学习内容理解。那么今天主要来给大家讲解如何实现单片机上8个LED灯流水点亮。首先,我先带大家了解一下什么是单片机的IO口,IO口就是输出、输入口,单片机的IO口是双向的,既可作输入也可作输出。那么我们对单片机的控制其实就是对IO口的控制 QQ截图20180125135304.png ,上面的图片是我百度的结果,我们可以清楚的知道51单片机共有4个8位IO口,通过我的第一个帖子可以知道,我们实现控制小灯主要是通过P0这个IO口来完成的。控制引脚 P0.0 经过 74HC245 控制了 DB0, P0.1 控制DB1......P0.7 控制 DB7。我们还学到一个字节是 8 位,我们如果写一个 P0,就代表了 P0.0到 P0.7 的全部 8 个位。比如我们写 P0 = 0xFE;转换成二进制就是 0b11111110,所以可以点亮做右边的第八个小灯。我们下边要进行依次亮和灭,怎么办呢?从这里就可以得到方法了,如果想让单片机流水灯流动起来,依次要赋给 P0 的数值就是: 0xFE、 0xFD、 0xFB、 0xF7、 0xEF、 0xDF、 0xBF、0x7F
知道原理之后,依照上次的那个程序,我们可以很简单的写出这个程序 QQ截图20180125151940.png ,虽然这样可以达到我们预期的效果,但是这样的程序写起来过于繁琐,怎么可以变得简单呢?这就要用到C语言中一个重要的符号<<或者>>,左移和右移,其中<<代表的是左移, >>代表的是右移。比如a = 0x01<<1;就是 a 的结果等于 0x01 左移一位。大家注意,移位都是指二进制移位,那么移位完了,本来在第 0 位的 1 移动到了第一位上,移动完了低位是补 0 的。所以 a 的值最终是等于 0x02。还要学习另外一个运算符~,这个符号是按位取反的意思,同理按位取反也是针对二进制而言。比如 a = ~(0x01); 0x01 的二进制是 0b00000001,按位取反后就是 0b11111110,那么a 的值就是 0xFE 了。
学会了这两个符号后,我们就可以把流水灯的程序写出来,先把程序贴上。 QQ截图20180125181104.png 这个程序明显就比上一个要简单的多了,这里我们解释一下程序的内容,程序中 cnt 是 count 的缩写,计数的意思,是非常常用的一个变量名称。当 cnt 等于 0 的时候, 1 左移 0 位还是 1,那么写成二进制后就是 0b00000001,对这个数字按位取反就是0b11111110,亮的是最左边的小灯。当 cnt 等于 7 的时候, 1 左移 7 位就是 0b10000000,按位取反后是 0b01111111,亮的是最右边的小灯。在这个程序的循环体中i等于0,当i小于60000的时候程序进行循环,循环结果为空(用来延时),当单次循环60000次后,cnt会加一,让下一个小灯变亮,然后再循环体最后加入一个条件语句,如果cut大于等于8的时候,这时cnt会重新归0,小灯会重新从最左边依次亮起来。
最后,给大家一个让小灯从左到右再从右到左依次循环的程序代码 QQ截图20180125191259.png ,大家可以看的懂么,欢迎来评论区讨论=-=






好懒~~不想说~~~
发表于 2018-1-28 21:54:09 | 显示全部楼层
P11直接写=0;就行
好懒~~不想说~~~
 楼主| 发表于 2018-1-28 23:11:23 | 显示全部楼层
逍遥范 发表于 2018-1-28 21:54
P11直接写=0;就行

我以前就是让把p1.1赋值给ENLED就没什么问题啊
好懒~~不想说~~~
发表于 2018-1-29 18:36:25 | 显示全部楼层
若水三千饮 发表于 2018-1-28 23:11
我以前就是让把p1.1赋值给ENLED就没什么问题啊

这个没问题的,根据板子上写成ENLED还方便后期程序检查
。。。
 楼主| 发表于 2018-1-30 00:39:27 | 显示全部楼层
Hero丶 发表于 2018-1-29 18:36
这个没问题的,根据板子上写成ENLED还方便后期程序检查

但是他不亮,不知道哪错了
好懒~~不想说~~~
发表于 2018-1-30 17:25:57 | 显示全部楼层
若水三千饮 发表于 2018-1-30 00:39
但是他不亮,不知道哪错了

你不能写 sbit led = P00 ;  只能写 sbit led = P0^0
。。。
 楼主| 发表于 2018-1-30 18:23:57 | 显示全部楼层
Hero丶 发表于 2018-1-30 17:25
你不能写 sbit led = P00 ;  只能写 sbit led = P0^0

我就是这样写的啊,你看清楚了么
好懒~~不想说~~~
 楼主| 发表于 2018-1-30 18:27:08 | 显示全部楼层
Hero丶 发表于 2018-1-30 17:25
你不能写 sbit led = P00 ;  只能写 sbit led = P0^0

他是亮的。不亮的是另一个帖子,我看错了
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表