![]() |
發(fā)布時間: 2020-5-2 23:40
正文摘要:本帖最后由 happy2058 于 2020-5-3 15:03 編輯 一直沒搞好,睡都睡不好,這個板把我都快搞瘋了 單片機(jī)IO不夠5V 加了上拉電阻發(fā)現(xiàn)不行。試過1K和10K 然后發(fā)現(xiàn)以下問題點。 1,不管P1還是P2,單獨給0x ... |
happy2058 發(fā)表于 2020-5-4 10:39 這個應(yīng)該考慮電源供電的穩(wěn)定性,是不是電源供電不足? 另外在跑程序時,IO會不斷變化,測出的電壓是不準(zhǔn)的。 如果檢測都沒有問題,可以考慮用電平轉(zhuǎn)換器,而不是在三極管基級加電阻,這個無論怎么加,都不會有任何作用 |
在上圖中,應(yīng)將10k電阻器放在左側(cè)5V電源下方,然后連接到IO和晶體管的基極,注意,在連接IO之前,添加一個1k電阻器。 在晶體管發(fā)射極和右側(cè)5V之間,添加一個300 ohm的電阻器以限制LED電流。 IO被拉低以點亮LED,電流計算如下:在發(fā)射器上,(5V-1V)/ 300 ohm〜13.3mA; 在基極上,Vb = 5-1-0.3 = 3.7V,IO電流I = 3.7V-0.2 / 1k = 3.5mA,上拉電阻器電流I_pull_up =(5-3.7)/ 10k = 0.13mA,晶體管 基本電流Ib = 3.5mA-0.13mA = 3.37mA,LED電流I_LED = 13.3mA-3.37mA = 9.93mA; |
odfggf 發(fā)表于 2020-5-3 16:25 謝謝你哦 |
星際塵埃 發(fā)表于 2020-5-3 17:27 嗯,謝謝你,我好好理解一下 |
odfggf 發(fā)表于 2020-5-3 16:00 謝謝你,之前不太明白,只知道為了得到一個電壓才接電阻 |
上拉電阻:+5V---電阻---IO口。 圖一:IO 0V。竄兩電阻至5V。先當(dāng)于兩個電阻(10K,1K)分壓,1K電阻分到的電壓驅(qū)動三極管,也就是三極管E和B之間的電壓為5*(1/11)約0.5V,三極管不導(dǎo)通。所以led不亮。 圖二:三極管e極和B極電壓降約5V,三極管導(dǎo)通,LED亮。 其它的圖同理。就不分析了。 至于圖3會亮。應(yīng)該是8550有關(guān)。8550的EB壓降只要達(dá)到1.2V就會導(dǎo)通。 最后,如果要加上拉電阻,避免出現(xiàn)LED在單片機(jī)待機(jī)狀態(tài)下信號錯誤。就在10K電阻的另一端直接接+5V就行。這樣,10K就是上拉電阻。你那個1K的電阻是并聯(lián)在三極管BE極之間的。起到的是分壓作用。不是上拉作用。 |
單片機(jī)輸出低電平時,通過IC內(nèi)部下拉到地。當(dāng)輸出高電平時,由內(nèi)部上拉至vcc。三極管導(dǎo)通電壓Vbe一般0.5到0.8v之間。 1/4.電流經(jīng)上拉通過IC內(nèi)部回流到地。vbe電壓為上拉電阻電壓,不考慮IC內(nèi)部下拉分壓時。粗略計算Vbe也無法滿足導(dǎo)通電壓,因而截至。 2/3.Vbe足以滿足導(dǎo)通電壓,因而不論高低電平都回導(dǎo)通。 5.就更不必說了。 |
本帖最后由 odfggf 于 2020-5-3 16:56 編輯 PNP導(dǎo)通的條件就是B級低于E級,5張圖說的其實是PNP的偏置電阻。偏置電阻用1K,和10K串聯(lián)分壓,B級電壓高于4.3V,不夠PNP導(dǎo)通條件。 圖中這幾個10K電阻,是PNP的B級限流電阻,取值1K---4.7K,都足以滿足3極管的開關(guān)2種狀態(tài),點亮數(shù)碼管。在單片機(jī)數(shù)字電路當(dāng)中,只需要考慮3極管的開關(guān)2種狀態(tài),放大等別的狀態(tài)不需要,所以只需要給b級接一個限流電阻就行了,別的不需要 |
![]() |
程序如下 #include <reg52.h> // 0 1 2 3 4 5 6 7 8 9 unsigned char LED8DATA_One[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 段選高位 底位 unsigned char LED8DATA_Two[4] = {0xef, 0xdf, 0xbf, 0x7f}; //unsigned char LED8DATA_Two[4] = {0xff, 0xff, 0xff, 0xff}; // 測試用全給1 unsigned char led[4] = {0x00}; int minute=60 ,sec=0; //60分鐘 unsigned int Counter=0; void LEDDATA(unsigned char MM, unsigned char jj) { P0 = MM; P2= jj; } void Time1_Init() //定時器1中斷 1毫秒 { TMOD |= 0X10; TMOD &= 0XDF; //TMOD = 0X10; TH1 = 0XFC; TL1 = 0X66; TR1 = 1; } void int_Init() { ET1 = 1; EA = 1; } void main() { unsigned char k=0; Time1_Init(); int_Init(); while (1) { led[3] = sec % 10; led[2] = sec / 10 % 10; led[1] = minute % 10; led[0] = minute / 10 % 10; if (k < 4) { k++; } else { k = 0; } LEDDATA(LED8DATA_One[led[k]],LED8DATA_Two[k]); if (500 < Counter) LEDDATA(LED8DATA_One[led[k]]^0X80,LED8DATA_Two[k]); //時鐘顯示 } } void interrupt_time_1() interrupt 3 //60分鐘倒數(shù)中斷 { TH1 = 0XFC; TL1 = 0X66; Counter++; if (1000 == Counter) { Counter = 0; sec--; if(sec<0) { sec=59; } if (sec == 59) { minute--; } } } |
Powered by 單片機(jī)教程網(wǎng)