本帖最后由 ETRH Studio 于 2013-11-24 11:59 编辑
目的:初步了解LED驱动原理,初步了解单片机控制I/O口方式。 内容:利用学习板上的四个LED灯,单片机控制其亮灭。 预备知识:LED工作原理,Keil C51编程方式。
LED,俗称发光二极管,发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。
上面将的有些专有名称了,如图所示,当给LED正端加上正电压,另外一端接电源负端(0),在实际设计电路中,需要考虑到LED的最大工作电流,需要串接一个电阻限流,阻值请参考LED指标。板子上面的电路如下图所示。
上图可知,LED负向端接GND,GND即0V,当另外一端接1(5V),则发光二极管亮,由此可知,当我们用单片机的I/O接到二极管的正向端,并将此端口电平设置为高电平,二极管则会亮起来了。 程序: #include <reg52.h> //´单片机头文件,定义单片机特殊功能和I/O口定义 void delay(unsigned int i); //延时程序,意思是等待多久才做下面的事情 void main()//主函数,void 无返回值 {
P1 = 0x00; //将P1口置为全低电平,此时LED灯不亮 delay(600); // 调用延时程序,延时约600毫秒 P1 = 0xff; //将P1口置为全高电平,此时LED灯亮 delay(600); //调用延时程序,延时约600毫秒 }
/*******延时函数*************/ void delay(unsigned int i) 调用延时程序,延时约i毫秒 { unsigned char j; for(i; i > 0; i--) for(j = 255; j > 0; j--); } 程序如上所示,将P1口接到P16,控制P1口的电平就可以控制LED的亮灭。 单片机是顺序执行语句,执行主函数main(),一直重复主函数里面的动作,程序里P1即代表P1口,8位(这在头文件已经定义了,暂时只做了解),需要对P1口赋值,只需将8位二进制每四位用16进制表示即可,并加上前缀0x,例如需要将P1口全部置高电平,即P1=11111111(先高位,后低位),每四位一组转为16进制,则为F F, 加上前缀 就是P1=0xFF(不区分大小写,注意P1中P必须大写,0x中的0是数字0).但如果我只需要控制P1口的第一位怎么办?在51单片机c语言编程中,可以直接对I/O口曹植,只需要在头文件下面定义下即可,例如定义P1的第一位(即P10)为LED灯控制端口,则可以这样定义,sbit LED=P1^0; 这样在主程序里面直接用LED代替对P10口的操作。例程如下:
#include <reg52.h> //´单片机头文件,定义单片机特殊功能和I/O口定义 sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
void delay(unsigned int i); //延时程序,意思是等待多久才做下面的事情 void main()//主函数,void 无返回值 {
LED0=0;LED1=0;LED2=0;LED3=0; //将LED控制口全部设为低电平,此时LED灯不亮 delay(600); // 调用延时程序,延时约600毫秒 LED0=1;LED1=1;LED2=1;LED3=1; //将LED控制口全部设为高电平,此时LED灯亮 delay(600); //调用延时程序,延时约600毫秒 }
/*******延时函数*************/ void delay(unsigned int i) 调用延时程序,延时约i毫秒 { unsigned char j; for(i; i > 0; i--) for(j = 255; j > 0; j--); }
关于延时函数,下次在说,接下来你能否完成这样的任务呢??
LED灯花样显示,广告灯?让LED灯按照你的想法亮起来?
|