I O輸出 例項1 LED點亮 入門版

2021-08-18 02:43:16 字數 4220 閱讀 5132

i/o輸出——

例項1:led點亮-入門版

一、例項目的

通過本例項,我們應:

1. 了解發光二極體(led)驅動電路的原理;

2. 掌握微控制器i/o控制led的程式設計;

3. 掌握c51程式的結構;

4. 會編寫軟體延時函式。 

提示:本例項屬於入門級,初學者應該熟練掌握,即在學完本課程後,不看資料就能畫出電路圖和編寫出程式並驗證。

二、led驅動原理

點亮led通常是微控制器初學者的第乙個程式,如同學習c語言的第乙個程式永遠是列印「hello world」一樣,亙古不變。

要點亮乙個led,需要用到微控制器的io輸出口,輸出乙個高電平(數字1)或低電平(數字0),至於是高電平還是低電平,這取決於led驅動電路。led驅動電路通常有兩種,如圖1所示。圖中,r為限流電阻。

圖1 led驅動電路

發光led的正嚮導通電壓一般在2.0v上下,不同材質和顏色的導通電壓不同。led的工作電流一般為ma級別(10~20ma),電流越大led越亮。限流電阻r計算公式如下:

r = (vcc-ud)/id

取ud=2.0v, vcc=5v, id=10ma,代入公式得:r=300ω。通常限流電阻為幾百歐,過大則可能達不到導通電壓,無法點亮led,過小led工作電流大,可能燒掉led,或影響壽命。

注意,51微控制器的i/o驅動能力只有幾百ua,採用方式2是無法直接點亮乙個led的。因此只能採取方式1來驅動led。

三、led驅動電路設計

假設通過8051微控制器p1口驅動8只led,p2.1管腳驅動乙隻led。電路圖如圖2所示。

圖2 led驅動電路例項

參考「keil基本操作

",使用proteus isis畫出以上電路圖。

四、led驅動程式設計

(一)程式設計實現d1~d4和d9點亮,d5~d8熄滅。

根據圖2所示的電路,可知led控制管腳輸出低電平時,led點亮;輸出高電平時,led熄滅。根據led與i/o的連線關係,得到表1。

表1  led與微控制器i/o連線及驅動電平

ledd9

d8

d7

d6

d5d4

d3

d2

d1

i/op2.1

p1.7

p1.6

p1.5

p1.4

p1.3

p1.2

p1.1

p1.0電平0

1111

0000

根據表1,p0輸出1111_0000,即十六進製制的0xf0,p2.1輸出0即可滿足要求。

//樣例一

#include//包含微控制器標頭檔案,51系列微控制器為reg51.h,51系列為reg52.h

#define led1 p1           // 定義巨集led1,值為p1暫存器,編譯時先使用p1替換所有的led1

sbit led2 = p2^1;        //定義sbit變數led2,指向p2.1,^符號取位符

void main()                  //main()函式為微控制器程式入口,無返回值,即void型別

}試一試:將以上**編譯生成.hex,匯入proteus電路圖進行**,進行驗證。

(二)程式設計實現d1~d8和d9閃爍,即全亮->全滅->全亮,如此反覆。閃爍間隔不限。

為了實現閃爍,必須引入延時函式。延時函式的編寫方法有軟體延時函式和定時器延時。關於定時器延時,在學習到定時器再介紹。下面先介紹軟體延時的原理及延時函式的編寫。

微控制器指令系統裡有一條nop指令,即空指令。執行一條nop指令,微控制器僅僅是將pc加一,cpu不作其它操作,空指令因此得名。nop指令消耗乙個機器週期,如果採用12mhz的晶體,則執行一條nop指令的耗時是1us。執行n條nop指令,理論耗時n×1us。因此,延時函式就是通過迴圈執行nop指令達到延時的目的。 

常見的 c51的軟體延時函式如下。不管延時函式如何變化,都是採用迴圈指令空語句(;)實現。注意,由於迴圈初值設定和迴圈遞增都會消耗機器週期,延時函式的延時時間並不精確,迴圈次數的選取一定程式上取決於經驗值(一般通過**或實測得到)。

/******************************

*函式:delayms

*功能:ms級延時函式@12mhz

*引數:ms:unsigned int,最大延時約65.535s

*返回值:無

*******************************/

void delayms(unsigned int ms)

//樣例二(a)

#include//包含微控制器標頭檔案,51系列微控制器為reg51.h,51系列為reg52.h

#define led1 p1           // 定義巨集led1,值為p1暫存器,編譯時先使用p1替換所有的led1

sbit led2 = p2^1;        //定義sbit變數led2,指向p2.1,^符號取位符

/******************************

*函式:delayms

*功能:ms級延時函式@12mhz

*引數:ms:unsigned int,最大延時約65.535s

*返回值:無

*******************************/

void delayms(unsigned int ms)

void main()                  //main()函式為微控制器程式入口,無返回值,即void型別

}試一試: 將以上**編譯生成.hex,匯入proteus電路圖進行**,進行驗證。

在樣例二(a)中,delayms()函式是先宣告且實現(定義)後才呼叫。c語言嚴格要求函式必須先宣告,後呼叫,當然函式的宣告和實現可以分開。如樣例二(b) 。在程式設計時,可以靈活運用。

//樣例二(b)

#include//包含微控制器標頭檔案,51系列微控制器為reg51.h,51系列為reg52.h

#define led1 p1           // 定義巨集led1,值為p1暫存器,編譯時先使用p1替換所有的led1

sbit led2 = p2^1;        //定義sbit變數led2,指向p2.1,^符號取位符

void delayms(unsigned int ms); //delayms()函式宣告 

void main()                  //main()函式為微控制器程式入口,無返回值,即void型別

}// delayms實現

/******************************

*函式:delayms

*功能:ms級延時函式@12mhz

*引數:ms:unsigned int,最大延時約65.535s

*返回值:無

*******************************/

void delayms(unsigned int ms)

五、試一試

1. led閃爍控制**使用了6條語句,如下所示。你可以只使用四條語句完成相同功能嗎?

led1 = 0x00;          //d1~d8全亮

led2 = 0;               //d9亮

delayms(1000);    //延時約1s

led1 = 0xff;          //d1~d8全滅

led2 = 1;               //d9亮

delayms(1000);    //延時約1s

2.本例項通過i/o(p0、p2.1)控制led,掌握i/o口輸出程式設計非常重要且必須。試說出i/o輸出和並口特殊功能暫存器的關係,寫出i/o輸出相關的**。

linux裝置模型 (1) led裝置

乙個簡單的led驅動裝置模型demo 以三星s5pc100的n類引腳的最低一位作為乙個led燈裝置 開發環境 宿主機fedora13,交叉編譯工具arm linux gcc4.3.2 處理器 s5pc100 先建乙個工程資料夾 home led device 下放led裝置有關檔案 s5pc100 ...

linux驅動 1 LED驅動 dev led

led linux驅動程式 測試平台 xunlong orange pi zero 驅動程式以及makefile如下 include include include include include include static struct class sun8i opizero led class...

STM32點亮LED(學習IO口配置輸出)

點亮led實際上是為了學習如何配置io口使其輸出高低電平。這一節的內容相當於學習c c 時的hello world 在keil5工程根目錄新建資料夾hardware。在新建的資料夾中新建檔案led.h和led.c。同時需要將上述檔案以及相應的fwlib下的檔案加入工程,這裡不再贅述。根目錄下各檔案的...