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

第3章 單片機I/O口應用——點亮發光二極管與開關檢測

例3-1 單片機控制點亮發光LED案例1

由于P0口大多作為總線端口使用,但是點亮發光二極管時,是作為通用I/O口使用的,必須接上拉電阻。由于P1~P3口內部已有30kΩ左右的上拉電阻,因此要注意P0口作為通用I/O口使用時,與P1~P3口的差別。下面討論P1~P3口與LED發光二極管的連接驅動問題。

使用單片機并行端口P1~P3直接驅動發光二極管,有兩種連接方法,電路如圖3-1所示。P1、P2、P3口與P0口相比,P1~P3口每一位的驅動能力只有P0口的一半,即每位驅動4個LSTTL負載。當P1~P3口的某位為高電平時,可提供200μA的拉電流;當某位為低電平(0.45V)時,可提供1.6mA的灌電流,為什么拉電流要比灌電流小許多,這是因為P1~P3口內部有30kΩ左右的上拉電阻,如果為圖3-1(a)所示的高電平輸出,則從P1、P2和P3口輸出的拉電流Id僅為幾百μA,驅動能力較弱,亮度較差。如果端口引腳為低電平,能使灌電流Id從單片機的外部流入內部,將大大增加流過的灌電流值,如圖3-1(b)所示。所以,8051單片機任何一個端口要想獲得較大的驅動能力,要采用低電平輸出。如果一定要高電平驅動,可在單片機與發光二極管之間加驅動電路,如74LS04、74LS244等。

圖3-1 發光二極管與單片機并行口P1~P3的連接

制作一個流水燈,原理電路如圖3-2所示,8個發光二極管LED0~LED7經限流電阻分別接至P1口的P1.0~P1.7引腳上,陽極共同接高電平VCC。編寫程序來控制發光二極管由上至下反復循環,把流水燈點亮,每次點亮一個發光二極管。

圖3-2 單片機控制的流水燈電路

本例參考程序如下。

  #include <reg51.h>
  #include <intrins.h>        //包含移位函數_crol_(  )的頭文件intrins.h 
  #define uchar unsigned char     
  #define uint unsigned int   
  void  delay(uint i)          //延時函數 
  { 
      uchar t; 
      while (i--) 
      {  
          for(t=0;t<120;t++);  
      } 
  } 
   
  void  main(  )               //主程序 
  {  
      P1=0xfe;                 //向P1口送出點亮P1.0的數據 
       while (1)               //反復循環 
       {     
          delay( 500 );        //500 為延時參數,可根據實際需要調整 
          P1=_crol_(P1,1) ;    //函數_crol_(P1,1)把P1中的點亮數據循環左移1位 
       } 
  }

程序說明如下。

(1)關于while(1)的兩種用法。

? “while(1);”:while(1)后面如果有個分號,表示程序停留在這條指令上。

? “while(1){……;}”:是反復循環執行花括號內的程序段,這是本例的用法,

即控制流水燈反復循環顯示。

(2)本例中用到了C51函數庫中的循環移位函數,循環移位函數包括循環左移函數“_crol_”和循環右移函數“_cror_”。本例使用的是循環左移函數“_crol_(P1,1)”,括號中第1個參數為循環左移的對象,即對P1中的內容循環左移;第2個參數為左移的位數,即左移1位。在編程中一定要把移位函數的頭文件intrins.h包含在內,例如,程序中的第2行“#include <intrins.h>”。

主站蜘蛛池模板: 松桃| 兴化市| 图片| 灵寿县| 舞阳县| 雅安市| 兰州市| 鄯善县| 鄂托克前旗| 佳木斯市| 德安县| 镇平县| 兴安盟| 新巴尔虎左旗| 安丘市| 呼伦贝尔市| 阿图什市| 紫阳县| 贞丰县| 黄梅县| 静乐县| 同心县| 和田县| 高密市| 禄丰县| 广丰县| 武定县| 忻州市| 绵阳市| 武强县| 天门市| 灵武市| 逊克县| 安岳县| 托克托县| 永州市| 原平市| 台前县| 鄂伦春自治旗| 佛山市| 保靖县|