昨晚,做了一次电灯泡
来源:电子工程专辑 发布时间:2023-03-05 分享至微信


昨晚出去玩了一下,街边树上的灯好漂亮,营造了一丝浪漫的氛围,五颜六色,变幻多姿。这种电灯泡,就是流水灯

然而,对于电子专业出身的我来说,看到的不仅是美景,还想到了这些电灯泡是怎么做的,毕竟以前做过这种电灯泡。

昨晚回家后,打算再做一次这种电灯泡。于是找出尘封已久的单片机,20分钟编写并调完程序,烧录后,跑起来,看动图

一. 单片机那些往事

当初,为了钱,从嵌入式转到了互联网,面试准备得还可以,没啥问题。不过转行的头几个月,还是挺痛苦呢,很多东西要学。

虽然,现在工作与单片机硬件软件完全无关,却喜欢偶尔弄下这些玩意儿,体会下程序直接(无操作系统)运行在硬件上的感觉。

下图是我曾经的单片机,其型号是STC89C52,有点爱不释手的感觉,每次整理房间都要去擦擦它的灰尘,然后再观摩一番:

下图是我曾经玩的单片机开发板,好久不玩这些东西了。这些玩意儿,我还是挺熟悉的。很喜欢用程序直接控制硬件的感觉。

Keil公司在2005年被ARM公司收购,其Keil软件,真是业界良心之作,各种调试工具很齐全,它可以把C语言程序编译为hex文件:

Lab Center Electronics公司做出了proteus软件,可以仿真和调试单片机。用Keil生成hex后,直接导入到单片机中。

请注意,8051单片机是一个系列,包括很多型号,比如上面提到的STC89C52单片机,比如下面的AT89C51单片机:

二. 单片机点亮灯泡

下面,我们用C语言编写程序,来控制8051单片机。先来看用单片机点亮灯泡,其实就是置高电平操作,C语言程序如下:

#include<reg51.h>
void main(){ while(1) { P1 = 1; }}
这个C程序很好理解,不需要过多解释。用Keil软件编译后,生成hex文件,然后塞入到如下单片机中,proteus仿真动图为:
可以看到,D1的右端被程序设置为高电平,而左边是低电平,D1自然就亮了。用单片机点亮一个灯泡,是学习单片机的起点。

三. 单片机闪烁灯泡

我们来写C语言程序,让灯泡闪烁起来。思路是让灯泡的一端在高低电平之间做转换,从而控制灯泡的亮灭,C语言程序如下:
#include<reg51.h>
void delay(int n){ int i = 0; int j = 0; for(i = n; i > 0; i--) { for(j = 110; j > 0; j--) { ; } }}
void main(){ P1 = 1; while(1) { P1 = 1 - P1; delay(1000); }}

delay函数的作用是延时, main函数中 P1 = 1 - P1 的作用是让D1右边的电平在0和1这两个值中轮流变化,即对应高低电平。

用Keil编译程序,生成hex文件,塞到单片机中。显然,由于P1循环在0和1这两个值中轮流变化,所以灯泡闪烁,动图如下:

四. 单片机玩流水灯

面,我们来玩更多的花样, 让一系列的灯泡循环亮起来,也就是所谓的流水灯,大家在街道上应该见过来看看实现流水灯的C语言程序:
#include<reg51.h>
void delay(int n){ int i = 0; int j = 0; for(i = n; i > 0; i--) { for(j = 110; j > 0; j--) { ; } }}
int a[8] = {1, 2, 4, 8, 16, 32, 64, 128};
void main(){ int i = 0; P1 = 1; while(1) { P1 = a[i++]; delay(1000); if(i == 8) { i = 0; } }}
delay函数是为了延时, while中那段代码是为了让8个灯泡循环亮,形成流水灯效果,这应该是很好理解的。
我们用Keil软件编译上述的C语言程序,生成hex文件,然后塞入到如下的单片机中,proteus仿真的动图如下:
我们已经写了流水灯的C语言程序,下面,我们来看看其对应的机器语言程序(以十六进制显示)和汇编语言程序:

可见,与C语言相比,汇编语言繁杂冗余太多了。我有点搞不懂,为什么很过高校还用汇编语言来写单片机程序。


本文很简单,但能在20分钟内把上述流水灯做出来,还是小小开心,毕竟有很久没玩了。嵌入式宝刀,依旧不老

最后,想说一下,学这些东西,一定要多实践多调试。在结束本文之前,我手绘流水灯玩一下,烘托出节日气氛。





END



评测中心免费申请


👆长按图片,扫码申请👆

[ 新闻来源:电子工程专辑,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!