页面加载中,请稍候
来源:电子工程专辑发布时间:2023-03-051409浏览
询问 AI

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

当初,为了钱,从嵌入式转到了互联网,面试准备得还可以,没啥问题。不过转行的头几个月,还是挺痛苦呢,很多东西要学。
虽然,现在工作与单片机硬件软件完全无关,却喜欢偶尔弄下这些玩意儿,体会下程序直接(无操作系统)运行在硬件上的感觉。
下图是我曾经的单片机,其型号是STC89C52,有点爱不释手的感觉,每次整理房间都要去擦擦它的灰尘,然后再观摩一番:

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

Lab Center Electronics公司做出了proteus软件,可以仿真和调试单片机。用Keil生成hex后,直接导入到单片机中。
请注意,8051单片机是一个系列,包括很多型号,比如上面提到的STC89C52单片机,比如下面的AT89C51单片机:
下面,我们用C语言编写程序,来控制8051单片机。先来看用单片机点亮灯泡,其实就是置高电平操作,C语言程序如下:
#include<reg51.h>这个C程序很好理解,不需要过多解释。用Keil软件编译后,生成hex文件,然后塞入到如下单片机中,proteus仿真动图为:
void main(){ while(1) { P1 = 1; }}
可以看到,D1的右端被程序设置为高电平,而左边是低电平,D1自然就亮了。用单片机点亮一个灯泡,是学习单片机的起点。#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这两个值中轮流变化,所以灯泡闪烁,动图如下:
#include<reg51.h>delay函数是为了延时, while中那段代码是为了让8个灯泡循环亮,形成流水灯效果,这应该是很好理解的。我们用Keil软件编译上述的C语言程序,生成hex文件,然后塞入到如下的单片机中,proteus仿真的动图如下:
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; } }}
我们已经写了流水灯的C语言程序,下面,我们来看看其对应的机器语言程序(以十六进制显示)和汇编语言程序:
可见,与C语言相比,汇编语言繁杂冗余太多了。我有点搞不懂,为什么很过高校还用汇编语言来写单片机程序。
本文很简单,但能在20分钟内把上述流水灯做出来,还是小小开心,毕竟有很久没玩了。嵌入式宝刀,依旧不老。
最后,想说一下,学这些东西,一定要多实践多调试。在结束本文之前,我手绘流水灯玩一下,烘托出节日气氛。


👆长按图片,扫码申请👆
新闻来源:电子工程专辑,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-06-26