1.C52单片机和LED原理图
2.思路分析
- 如何实现流水灯?
流水灯,顾名思义像水一样流过去,寄存器P2有8颗灯,按照顺序一个亮跳到下一个亮,OK ,我们先写二进制编码。
如上图所示,D1亮-延迟-其余灯灭-延迟,D2亮-延迟-其余灯灭-延迟——D8亮-延迟-其余灯灭-延迟,再次回到D1(循环),这不,主函数就来了~ 根据LED闪烁的笔记,可以直接将延迟函数复制过来直接使用。
延迟函数 主函数
3.效果展示
LED流水灯效果
4.流水灯PLUS
上面所述的是每颗灯间隔500ms依次点亮,如果想要更改间隔时间,按照之前的方法就很麻烦,要每改一次间隔时间就得重新生成函数,是否可以用一个固定的延迟函数呢?当然看可以~
把间隔时间设为一个变量xms,设置什么类型的变量呢?以下是常用数据类型👇
数的范围其实就是2^所占位数的次方-1,例如 unsigned int 所占位数为16位,2^16-1=25535,这里减一是因为0也包含在范围内。在定义这个数据类型的时候,所设置的数值不可超过范围,不然单片机无法读取数值,也不会提示错误,会出现BUG,很难找出,所以一开始设置的时候,就要考虑好。
首先,先设置个1ms的延迟函数,打开STC-ISP软件,设置以下内容,复制到Keil中
参考程序👇
为什么将xms设置为unsigned int 型?我的理解是:毫秒肯定是没有负的,那就是无符号数据类型;char 数的范围只有0-255,不够用,float long 精度很高,数的范围也很广,太浪费空间;所以int更合适。(个人理解)
哈哈~这样就可以随意更改间隔时间啦~但是要注意的是不可超过数的范围哦~
5. 结束语
其实写到这里,还是有很多问题我想去弄明白,但是我搜了好多遍,没找到我想要的答案,先把问题遗留在这里,懂了之后再来写解。
(1)软件生成的延迟函数如何运行的?
(2)C语言中的其他数据类型在什么情况下会用到?
(3)do while循环嵌套如何运用?