官术网_书友最值得收藏!

1.2 I/O引腳驅動LED

LED(發光二極管)是51單片機系統中最常見的一種指示型外部設備,是半導體二極管的一種,可以把電能轉化成光能;其主要結構是一個PN結,具有單向導電性,常常用于指示某個開關量的狀態。LED的實物如圖1.2所示。

圖1.2 紅色的發光二極管實物

說明:發光二極管有紅、黃、綠等多種不同顏色及不同的大小(直徑),還有高亮等型號,它們主要的區別是封裝、功率和價格。

1.2.1 LED的工作原理

發光二極管LED和普通二極管一樣,具有單向導電性,當加在發光二極管兩端的電壓超過了它的導通電壓(一般為1.7~1.9V)時就會導通,當流過它的電流超過一定電流(一般為2~3mA)時則會發光。51單片機系統中發光二極管的典型應用電路如圖1.3所示。

圖1.3 51單片機系統中LED的典型應用電路圖

圖1.3中P1端口上的LED驅動方式稱為“拉電流”驅動方式,當51單片機I/O引腳輸出高電平時,發光二極管導通發光;當51單片機I/O引腳輸出低電平時,發光二極管截止。圖1.3中P3端口上的LED驅動方式稱為“灌電流”驅動方式,當51單片機引腳輸出低電平時,發光二極管導通發光;當51單片機引腳輸出高電平時,發光二極管截止。

圖1.3中的電阻均為限流電阻,當電阻值較小時,電流較大,發光二極管亮度較高;當電阻值較大時,電流較小,發光二極管亮度較低。一般來說該電阻值選擇范圍為1~10kΩ,具體電阻的選擇與該型號單片機的I/O口驅動能力、LED的型號及系統的功耗有關。

說明:P1端口不直接用I/O引腳驅動LED,而是外加了VCC,原因是51單片機I/O口的驅動能力有限;同理,P3中的電阻值不宜過小,因為51單片機I/O口吸收電流的能力也有限,過大的電流容易燒毀單片機。

1.2.2 應用實例——LED閃爍和流水燈

1. LED閃爍實例

LED閃爍實例中使用51單片機控制8個LED間隔亮、滅,形成閃爍效果,這種效果常常用于指示單片機系統的運行狀態。

圖1.4是LED閃爍實例的電路圖,8個LED使用灌電流的驅動方式連接在51單片機的P1端口上,表1.2是實例使用的典型器件說明。

表1.2 LED閃爍實例器件列表

圖1.4 LED閃爍實例電路圖

在實例中,51單片機通過一個軟件延時程序控制P1端口輪流輸出高電平和低電平,驅動發光二極管發光和熄滅,【例1.1】是LED閃爍實例的代碼。

【例1.1】 代碼使用兩個嵌套的for循環語句來控制延時,當到達延時之后使P1輸出電平翻轉。

        #include <AT89X52.h>
        main()
        {
          unsigned char i,j;
          P1 =0x00;                     //初始化P1 輸出,LED全亮
          while(1)
          {
            for(i=0;i<200;j++)      //for循環軟件延時
            {
              for(j=0;j<50;j++);
            }
            P1 =~P1;                   //P1 端口輸出的電平翻轉,形成閃爍
          }
        }

2. 流水燈實例

流水燈實例使用51單片機控制8個LED輪流點亮,常常用于指示單片機系統的工作進程,或者用于構造特殊效果。例如,用紅、綠、黃三種顏色來制造舞臺效果等。

流水燈實例的電路圖和LED閃爍實例相同,如圖1.4所示,【例1.2】是流水燈實例的代碼。

【例1.2】 與LED閃爍實例類似,51單片機使用兩個嵌套的for循環語句來進行軟件延時,當延時完成之后使用“<<”移位語句將當前輸出高電平的P1端口引腳向高位移動一位,由于“<<”語句不帶進位功能(即到達最高位之后不會自動循環到最低位),所以需要用一個判斷語句將點亮端口位移動到最低位。

        #include <AT89X52.h>
        main()
        {
          unsigned char i,j;
          unsigned char LED;
          LED=0x01;                          //最低位LED點亮
          P1 =~LED;                         //灌電流驅動
          while(1)
          {
            for(i=0;i<250;i++)           //軟件延時
            {
              for(j=0;j<250;j++);
            }
              if(LED==0x80)
        //判斷是否到最高位,如果流水到頭,則折返到最低位點亮
              {
                LED=0x01;
              }
              else
              {
                LED=LED <<1;               //移位,行程流水
              }
              P1 =~LED;
          }
        }
主站蜘蛛池模板: 贵定县| 兴义市| 大渡口区| 峡江县| 西畴县| 库车县| 休宁县| 定南县| 太仆寺旗| 固镇县| 杭州市| 黄山市| 满城县| 新龙县| 五大连池市| 洞头县| 应用必备| 正安县| 宜黄县| 兰溪市| 博野县| 蕉岭县| 双辽市| 车致| 华池县| 荆州市| 襄汾县| 鹤庆县| 吉水县| 明水县| 措勤县| 仪征市| 新兴县| 博野县| 南靖县| 潞西市| 贺兰县| 临泉县| 舒城县| 新余市| 莆田市|