相信通过前面的学习,我们已经熟悉了单片机程序的套路,不管简单还是复杂的单片机应用系统,其程序核心都是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表示低电平。如果没有额外说明,我们用的都是正逻辑。
一灯大师:上面啰嗦了一大堆,有点像老太太的裹脚布,又臭又长。电视剧里的一灯大师可是德高望重,字字珠玑。
结尾语:故事讲到这里,又到总结的时候了。 一句话,啥也不说了,知易行难,干吧。
领取专属 10元无门槛券
私享最新 技术干货