查看: 3435|回复: 3

【课程1】 学习I/O控制,控制LED灯

[复制链接]
  • TA的每日心情
    奋斗
    2014-2-9 10:11
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-10-20 20:39:16 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 ETRH Studio 于 2013-11-24 11:59 编辑

    目的:初步了解LED驱动原理,初步了解单片机控制I/O口方式。
    内容:利用学习板上的四个LED灯,单片机控制其亮灭。
    预备知识:LED工作原理,Keil C51编程方式。

    LED,俗称发光二极管,发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。

    led.jpg



    上面将的有些专有名称了,如图所示,当给LED正端加上正电压,另外一端接电源负端(0),在实际设计电路中,需要考虑到LED的最大工作电流,需要串接一个电阻限流,阻值请参考LED指标。板子上面的电路如下图所示。

    led2.jpg


    上图可知,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灯按照你的想法亮起来?






    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-12 21:59
  • 签到天数: 647 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-10-20 21:28:27 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-12 14:30
  • 签到天数: 1730 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-10-21 08:50:05 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-10-21 09:47:33 | 显示全部楼层
    顶一个~~~~~~~~~~~~··
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 21:14 , Processed in 0.147600 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.