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下的檔案加入工程,這裡不再贅述。根目錄下各檔案的...