- 51單片機典型項目實戰全能一本通(C語言版)(視頻版)
- 張毅剛
- 958字
- 2019-10-23 18:00:35
第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>”。