C51编程入门(七):一灯的故事(中)

上节我们学习了单片机连接发光二极管的电路,以及如何编程实现点灯。

在开始继续一灯的故事前,先让我们做个练习。

图1为一个发光二极管的驱动电路,请判断电路连接是否正确。

图1 LED驱动电路

电路分析(全选可见):

由图1可知。发光二极管D1的正极接VCC,负极通过一个220欧姆的限流电阻连接到单片机的P3.0引脚。

我们假设D1导通电压是2V,工作电流是10mA,VCC为5V,则算得限流电阻Rmax = (5V-2V)/10mA=300Ω。

图中R2为220Ω,满足要求。因此电路正确。

由正正的正,负负得正,单片机P3.0输出低电平,D1点亮; P3.0输出高电平,D1熄灭(不满足正向导通)。

本节,我们将让D1灯动起来,类似下面的手电筒,亮->灭->亮....

我们知道,P3.0输出低电平,D1亮;P3.0输出低电平,D1灭。 如果P3.0输出电平保持,则D1状态也会保持。

为此,得到程序核心算法如下:

P3.0输出低电平,点亮D1;

P3.0状态保持低电平一定时间。

P3.0输出高电平,熄灭D1。

P3.0状态保持高电平一定时间。

重复步骤1~4。

P3.0输出高电平和低电平很简单,如下:

sbit led = P3^0;

led = 1; //输出高电平

led = 0; //输出低电平

但如何能让P3.0保持电平状态呢?

境由心生。 记住,P3.0是输出端口,只要输出内容不变(1-高电平,0-低电平),则其输出电平将会保持。根据核心算法,大致代码如图2所示。

图2 大致代码

因此,要在10行和12行,使电平保持一段时间。还记得《

C51编程入门(四):延时函数

》,该它登场了。

延时函数用来消耗CPU的时间,即执行空语句(C51是空语句,但实际指令是循环、跳转),

使9行语句和11行语句没那么快执行,因此P3.0状态能保持。

图3 亮>灭>亮实现代码

代码分析:

第9行:led=0, P3.0输出低电平,点亮D1;

第10行:delayMS(1000); 延时1000毫秒,消耗CPU,P3.0维持低电平不变,D1保持亮。

第9行:led=1, P3.0输出高电平,熄灭D1;

第10行:delayMS(1000); 延时1000毫秒,消耗CPU,P3.0维持高电平不变,D1保持熄灭。

执行第10行后,由于while(1)循环,重新回到第9行执行。

注意,初学者容易忘记写第12行如下,结局就是led=1;执行后,P3.0仅仅保持了1-2us左右,肉眼难以分辨出来。

图4 错误代码-忘记了高电平也要保持

图5是图1和图3代码的Proteus仿真

图5 Proteus仿真

写到这里,好像我们已经实现了亮->灭->亮,但是,我们做事情应该是think smart, do more。

我们可以把亮->灭->亮用一个函数封装起来,如下。

#include "reg51.h"

sbit led = P3^0; //P3.0接口

void delayMS(unsigned int x); //delayMS函数声明

void led_flash();

void main()

{

while(1)

{

led_flash();

}

}

/****************************

函数:delayMS@12MHz

功能:ms级延时函数

参数: x:unsigned int, 延时时间,单位:ms

返回值:无

****************************/

void delayMS(unsigned int x) //delayMS函数实现

{

unsigned int i,j;

for(i=0;i

for(j=0;j

}

/****************************

函数:led_flash

功能:使P3.0连接的LED亮1s,灭1s

参数: 无

返回值:无

****************************/

void led_flash()

{

led = 0; //输出低电平,点亮D1

delayMS(1000);//保持低电平1s

led = 1; //输出高电平, 熄灭D1

delayMS(1000);//保持高电平1s

}

main函数看起来非常简洁。

到这,大功告成。 大家以后应该习惯定义函数,调用函数,不管是自己写的,还是别人写的(库函数)。

*********************************************************************************************************

本节主题还是一灯大师的故事,下面继续八卦一灯大师。

一灯大师,原名段智兴,又称南帝,是《天龙八部》段誉的孙子。

一灯大师本是皇帝,武痴,与周伯通、瑛姑、慈恩(裘千仞)之间存在恩恩怨怨,还与李莫愁有十年之约..

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G01XEP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券