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

相信通过前面的学习,我们已经熟悉了单片机程序的套路,不管简单还是复杂的单片机应用系统,其程序核心都是main( )函数。闭上眼,回忆下套路的写法。

从这节开始,由一灯替换main函数作为男一号,他将为我们演示上乘武功一阳指。而我们,通过一灯大师的一阳指来学习单片机的I/O输出,并实现点灯。

在正式开始之前,让我们先欣赏一灯大师与李莫愁的激战——

正所谓一阳指一出,李莫愁变成鬼也愁。

又见一灯吹桃花,只闻莫愁冰魄银针碎.......

欣赏了电视剧里帅帅的一灯,下面让我们认识一下单片机里的灯:D1和D2,如图1所示。

图1 发光二极管驱动电路

一灯大师:都来看一看,瞧一瞧了,图1中D1和D2的电路有啥区别呢?

D1负极通过电阻R2连接到单片机P3.0引脚,D1正极接到电源VCC。

D2正极接单片机的P3.7口,D2负极通过电阻R3接到地GND。

那么,重点来了,单片机要点亮或熄灭灯D1和D2下需要哪些功夫呢?

说到此,先和大家透露一阳指的两点秘密:

一阳指,要想指哪打哪,一定得是手指输出某种神秘力量,输入的那是吸星大法。

一阳指,要想打抱不平,惩恶扬善,驱除黑暗(点亮灯),一定得正正得正,负负得正。

简要地说,单片机要控制灯(D1、D2),一是I/O(手指)输出电平(力量),

二是输出电平与灯(发光二极管)的极性对应,正极对应高电平(1),负极对应低电平(0)。

专业地讲,就是发光二极管要正向导通,D1/D2两端要电压要达到导通电压(一般是1.5V~2.2V左右),还有就是流过二极管的电流不能太大,

电流过大了发光二极管受不了,发热,寿命缩短,更坏结果就是烧掉。

单片机点亮D1和D2时,电路分析如图2所示。单片机P3.0引脚在内部接到了地GND。

单片机P3.7引脚在内部通过一个内置的上拉电阻Rpu接到电源VCC。

发光二极管的工作电流一般为10mA-20mA。Rd称为限流电阻。Ud一般为1.5V~2.2V左右。

Rd = (5V-Ud)/Id,假设Ud=2V,Id=10mA,则Rd=300Ω。

取Rd=200,则Id=15mA,比Rd=200mA更亮。限流电阻不能太大(Ud小),也不能太小(Id大)。

发光二极管的亮度与Id成正关系,电流越大越亮。

图2发光二极管驱动电路

一灯大师:下面让我们写出点灯程序,代码如下:

#include "reg51.h"

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

sbit LED1 = P3^7; //P3.7接口

void main()

{

while(1)

{

LED0 = 0; //输出低电平,将0赋值给P3.0锁存器,P3.0输出低电平

LED1 = 1; //输出高电平, 将1赋值给P3.7锁存器,P3.0输出高电平

}

}

sbit用于定义并口的I/O接口,每个I/O对应相应并口特殊功能寄存器的特定位,以P3口为例,见表1。

表1 并口特殊功能寄存器P3

P3为8位寄存器,可以存储8位二进制数,即一个字节,左边为最高位MSB,右边为最低位LSB。

P3又称为并口锁存器,其字节地址为B0H,可以被8整除,每一位都支持位寻址。

以下两行代码分别定义了sbit变量用于寻址P3.0和P3.7,其中^为取位符号,表示取P3寄存器的第i位,i=0~7。

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

sbit LED1 = P3^7; //P3.7接口

一灯大师:朋友,请记住,以后要定义一个并口I/O接口(不管是输入还是输出),直接套用以上格式就可以。

变量名称自定义,但是不要与其他的重复。如定义LED3来访问(读/写)P3.2,则:

sbit LED3 = P3^2;

P3.2要输出高电平,赋值1给LED3就可以。输出低电平,则赋值0。

记住,在数字电路系统的正逻辑,1表示高电平,0表示低电平。如果没有额外说明,我们用的都是正逻辑。

一灯大师:上面啰嗦了一大堆,有点像老太太的裹脚布,又臭又长。电视剧里的一灯大师可是德高望重,字字珠玑。

结尾语:故事讲到这里,又到总结的时候了。 一句话,啥也不说了,知易行难,干吧。

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

扫码关注云+社区

领取腾讯云代金券