1. I/O 口的結(jié)構(gòu)及特點(diǎn)
Atmega8 有23 個(gè)I/O 引腳,分成3 個(gè)8 位的端口B、C 和D,其中C 口只有7 位
Atmega8 采用3個(gè)8位寄存器來(lái)控制I/O端口,它們分別是:方向寄存器DDRx、數(shù)據(jù)寄存器PORTx、輸入引腳寄存器PINx
x為B或C 或D,分別代表B口、C口或D 口;
n為0~7,代表寄存器中的位置;
其中DDRx 和PORTx 是可讀寫(xiě)寄存器,而PINx 為只讀寄存器;
每個(gè)I/O引腳內(nèi)部都有獨(dú)立的上拉電阻電路,可通過(guò)程序設(shè)置內(nèi)部上拉電阻是否有效。
方向寄存器DDRx中的每個(gè)位用于控制I/O口一個(gè)引腳的輸入輸出方向,即控制I/O口的工作模式為輸出模式還是輸入模式。
當(dāng)DDRxn=1 時(shí),I/O 的Pxn 引腳處于輸出模式。此時(shí)
若PORTxn=1時(shí),I/O引腳呈高電平,同時(shí)可提供輸出20mA 的電流;
若PORTxn=0時(shí),I/O引腳呈低電平,同時(shí)可吸收20mA 的電流。
當(dāng) DDRxn=0 時(shí),I/O 的Pxn 引腳處于輸入模式。此時(shí)
引腳寄存器PINxn 中的數(shù)據(jù)就是外部引腳的實(shí)際電平;
此時(shí)可通過(guò)PORTxn 的設(shè)置可控制內(nèi)部的上拉電阻使用或不使用。
注意事項(xiàng):
使用AVR的I/O 口,首先應(yīng)正確設(shè)置其工作模式(輸入模式還是輸出模式),設(shè)置DDRx;
當(dāng)I/O工作在輸入模式(DDRxn=0)時(shí),讀取引腳上的電平應(yīng)取PINxn的值,而不是PORTxn的值;
當(dāng)I/O口工作在輸入模式(DDRxn=0)時(shí),應(yīng)根據(jù)實(shí)際情況設(shè)置內(nèi)部上拉電阻,利用內(nèi)部上拉電阻可以節(jié)省外部上拉電阻;
將I/O空工作模式由輸出模式設(shè)置為輸入模式后,必須等待一個(gè)時(shí)鐘周期后才能正確的讀到外部引腳的值
2. 跑馬燈程序控制發(fā)光二極管
我們選擇用PD0~PD7來(lái)控制8個(gè)發(fā)光二極管循環(huán)點(diǎn)亮,從而實(shí)現(xiàn)“跑馬燈”
所以電路圖如圖所示:
問(wèn):如果改變 delay_ms 的時(shí)間會(huì)變的怎樣呢?
=> 跑馬燈的變換速度改變。
問(wèn):如果直接讓 PORTD = ( 1<
=>PORTD = ~( 1<
=>PORTD = ( 1<
問(wèn):能不能添加或修改程序,改變燈亮的順序和時(shí)間呢?
=> 改變循環(huán)條件就可以改變亮燈的順序,如把i++改為i+=2,即可實(shí)現(xiàn)隔一盞燈亮一個(gè);
=> 亮燈時(shí)間改變延遲時(shí)間delay_ms()的傳入?yún)?shù)即可。
3. 單個(gè)LED數(shù)碼管練習(xí)
給數(shù)碼管的a、b、c、d、e、f、g七個(gè)發(fā)光二極管加不同的電平,二極管顯示不同亮暗的組合就可以顯示不同的字形;
以1為高電平,0為低電平,給出字形碼表:
即0x3F表示的就是字型‘0’,0x06表示的就是字型‘1’......;
所以直接把這種對(duì)應(yīng)關(guān)系存到一個(gè)Char型數(shù)組里(一個(gè)Char型是8位);
想要對(duì)應(yīng)的a、b、c、d、e、f、g七個(gè)發(fā)光二極管展示亮與暗,我們選用PD0~7這8位來(lái)控制;
如:想要展示字型‘0’=>‘0’對(duì)應(yīng)字形碼是0x3F=>其中發(fā)光二極管的a~f均為亮狀態(tài)=>PD0~5均為低電平(低電平亮燈)。
我們用一個(gè)LED數(shù)碼管顯示數(shù)字0~9,仍然使用PD口控制,循環(huán)顯示數(shù)字
電路圖如圖所示:
了解理論知識(shí)后便可以開(kāi)始編程:(延時(shí)函數(shù)與上面相同)
單個(gè)LED數(shù)碼管
問(wèn):想顯示A~F 怎么辦呢?
=> num[] 數(shù)組再添加多幾個(gè)元素,分別是A~F對(duì)應(yīng)的字形碼。
問(wèn):能不能顯示像H,L 一類的字母呢?
=> 能,想要顯示字母H,只需要二極管的b、c、e、f、g亮即可;
=> 想要顯示字母L,只需要二極管的d、e、f亮即可。
問(wèn):改變了delay_ms 函數(shù)的延時(shí)時(shí)間會(huì)怎樣呢?
=> 數(shù)字之間的顯示間隔邊長(zhǎng)。
問(wèn):要顯示小數(shù)點(diǎn)我們應(yīng)該怎么辦呢?
=> 在字形碼表中可以看出,最高位h是沒(méi)有作用的,所以可以用h位來(lái)控制小數(shù)點(diǎn),當(dāng)最高位為1時(shí)小數(shù)點(diǎn)亮,為0時(shí)不亮;
=> 如0x5B表示‘2’,那么0x5B + 0x80表示‘2.’。
4.多個(gè)LED數(shù)碼管實(shí)驗(yàn)
靜態(tài)顯示:3小節(jié)的內(nèi)容便是靜態(tài)展示
動(dòng)態(tài)顯示:采用各數(shù)碼管循環(huán)輪流的顯示的方法,當(dāng)循環(huán)頻率較高時(shí),利用人眼的暫留特性,感覺(jué)不到數(shù)碼管的閃爍,就像看到數(shù)碼管在同時(shí)發(fā)光一樣,類似電影的原理。
兩者對(duì)比:動(dòng)態(tài)顯示比靜態(tài)顯示占用資源少,耗電少;但是穩(wěn)定性卻差,程序設(shè)計(jì)也更為復(fù)雜,MCU負(fù)擔(dān)重。
動(dòng)態(tài)顯示需要一個(gè)接口完成字形碼的輸出,另外一個(gè)接口完成各數(shù)碼管的輪流顯示;
我們要實(shí)現(xiàn)從“000.0”到“999.9”的數(shù)字變化顯示過(guò)程;
用PB口做字形碼的輸出口,用PC0~PC3控制數(shù)碼管的輪轉(zhuǎn)流顯示;
從左數(shù)起,其中PC0表示第0個(gè)數(shù),PC1表示第1個(gè)數(shù),PC2表示第3個(gè)數(shù)(該數(shù)顯示小數(shù)點(diǎn)),PC3表示第4個(gè)數(shù);所以只有第三個(gè)數(shù)是特殊的;
參考原理圖如下:
編程實(shí)現(xiàn)代碼
編輯:hfy
-
發(fā)光二極管
+關(guān)注
關(guān)注
13文章
1214瀏覽量
67343 -
led數(shù)碼管
+關(guān)注
關(guān)注
2文章
73瀏覽量
22478
發(fā)布評(píng)論請(qǐng)先 登錄
發(fā)光二極管的問(wèn)題(有償問(wèn)答)
1310 nm和1550 nm超輻射發(fā)光二極管SLD

Aigtek功率放大器應(yīng)用:驅(qū)動(dòng)線圈點(diǎn)亮發(fā)光二極管

二極管和發(fā)光二極管的工作原理和有什么區(qū)別

基于51單片機(jī)的多模式音樂(lè)跑馬燈

評(píng)論