【软件工程师学硬件】之 让LED闪烁起来

很多人尤其是刚入门的硬件工程师比较纠结选择什么mcu芯片,比如做个闪烁的LED,是用at89c51还是pic16f887,甚至有人想到要用stm32或者esp8266等等。实际上完全没有那个必要,如果仅仅是兴趣或者是学习知识,玩哪种mcu都一样,就和你学习java和c#一样,都是语言,你不能说java比c#更牛x,java能做到的,c#也差不多能够做到,那硬件也是这样,不必要纠结这个,如果纠结这个,反而耽误时间。但是如果是项目或者是做产品,那就不是一回事了,虽然同类的芯片可能都能实现某个功能,但是涉及到成本、性能、包装等等因素,就需要好好斟酌一下,这就好比学个c#玩玩可以,但是真正到项目的时候,得要看项目的实际要求了,有的项目以前一直是java开发的,而且服务器也是linux的,并且老板也不愿意多掏钱,什么都要开源的,那还是改用java吧。
啰嗦了几句话,进入正题,上次我们做了一个第一个硬件程序,点亮一个led,点亮led的实质就是将单片机的某个引脚(严格说是某个端口的某个位)置位。at89c51有P0、P1、P2、P3四个端口,每个端口有8只引脚,其他类型的单片机也差不多。
但是上次的程序里led一直亮着,那要是让它闪烁,就是一亮一灭,就像彩灯那样的。实际上很简单,上次说了,置0就是亮,那要是置1呢?对了,就是灭掉。就这么简单。
但是有一个问题,因为单片机程序运行非常快,指令的运行时间都是微秒级的,1秒等于1000毫秒,1毫秒等于1000微秒,你就想象一下,如果一亮一灭两个指令连续运行,会是什么结果?我们根本感觉不到闪烁,感觉到的就是一直亮着。所以啊我们得想办法将两个指令分开一段时间,就是先亮一会儿,比如亮个两秒钟,再让它灭个两秒钟,这样我们的眼睛就能明显感觉到亮和灭了。这样说的话,就需要加个延时程序,就是我们软件程序里面的sleep,但是这个硬件里可没有sleep,我们得自个儿写延时程序。
好了,按照上面的思路,我们给出完整的程序如下,有一些不明白的我已经加上注释:

#include <reg51.h>
#include <stdio.h>
sbit P10=P1^0; //定义P10

void main(void)

while(1) 
{
unsigned int i; 
for(i=0; i <30000; i++) 
P10=0; //注意:是低电平点亮led
for(i=0; i <30000; i++) 
P10=1;
}
}

猜你喜欢

转载自blog.csdn.net/wwwmagic/article/details/91792569