51單片機學(xué)習之2-流水燈
講解了74HC573使用方法,我在《51單片機復習筆記1(更新)》有記錄。這里略。
本文引用地址:http://dyxdggzs.com/article/201611/323852.htm講解了Keil的仿真方法。比較有用的內容是可以用它來(lái)測試一段代碼所使用的時(shí)間,例如延時(shí)函數,在需要精確延時(shí)又不想使用定時(shí)器的時(shí)候可以使用該方法。至于其他的,個(gè)人認為還是直接下載到單片機中觀(guān)察實(shí)際情況會(huì )比較直觀(guān)。
第六集
51最小系統
復位原理:
51單片機是高電平脈沖復位,在RST引腳。復位脈沖的高電平寬度必須大于2個(gè)機器周期。為了方便計算,我們假設晶振頻率為12M,那么它的時(shí)鐘周期為1/12us(微秒)。它的一個(gè)機器周期是12*(1/12)=1us(微秒)。復位脈沖高電平寬度必須大于2個(gè)機器周期即2us,那么就要保證RST引腳高電平的時(shí)間大于2us單片機即可自動(dòng)復位。
上電復位:
當通電時(shí),開(kāi)關(guān)是斷開(kāi)的,那么電流從VCC→電容→RST、R32→GND。剛上電的時(shí)候,電容開(kāi)始充電,充滿(mǎn)電后相當于斷路,在電容充電到充滿(mǎn)的過(guò)程中電壓逐漸從高到低(從5V到0V)。也就是說(shuō)一上電,RST端得到就是高電平,當這個(gè)時(shí)間超過(guò)2us時(shí)單片機復位,電容快充滿(mǎn)到充滿(mǎn)后RST得到是低電平,電源不斷那么RST就一直是低電平而不會(huì )一直復位。RST高電平持續的時(shí)間取決于電容充電時(shí)間.。(這個(gè)電容要取多大?怎么計算的?)
手動(dòng)復位:
通電之后,RST會(huì )自動(dòng)復位一次,當單片機在運行的過(guò)程中我們需要它復位時(shí)可以斷電使之上電復位?;蛘甙聪耂W0開(kāi)關(guān)也能實(shí)現復位。當SW0開(kāi)關(guān)按下時(shí)電流從VCC→R33→RST、R32→GND形成回路。為方便計算R33假設為300歐即0.3K,我們可以先計算R33得到的電壓是5V*(0.3k/(4.7k+0.3k))=0.3VR32得到的電壓為5V*(4.7k/(4.7k+0.3k))=4.7VRST端的電壓也為4.7V,那么4.7對于單片機來(lái)說(shuō)也算高電平,當按下手動(dòng)按下SW按鈕到松開(kāi)肯定超過(guò)2us,所以單片機自動(dòng)復位。
晶振電路:
兩個(gè)電容一定要相等,取值范圍為20-50pf越大啟動(dòng)越慢。
自己搭建最小系統要注意的地方:
EA引腳一定要接高電平即VCC,這是最容易忽略的。這個(gè)引腳是用來(lái)選擇是用片內存儲器還是用片外存儲器。51內部存儲器一般都夠我們使用。在以前的單片機需要外擴存儲器。我們燒錄的程序就是存在片內存儲器。
要將P0組引腳當普通IO用時(shí),需要接10K的上拉電阻。P1-P3里面都有上啦電阻。
1做地址/數據總線(xiàn)時(shí)和做輸入I/O口時(shí),p0口不用接上拉電阻。
2但當做輸出I/O口時(shí),p0口必須要接上拉電阻才可以。
P0口是集電極開(kāi)路輸出,也就是OC門(mén),這種結構沒(méi)有輸出高電平的能力就相當于一個(gè)一端接地的開(kāi)關(guān),按下去就輸出低電平0V,斷開(kāi)就沒(méi)有電壓,是懸空狀態(tài)。
至于用不用上拉電阻,取決于外部電路,如果要輸出高電平控制一個(gè)器件,而這個(gè)器件本身又沒(méi)有內置上拉,就必須自己接一個(gè)上拉電阻,如果要用低電平控制一個(gè)器件,則可以不用加上拉。
第七集
一、流水燈的設計
流水燈就是讓八個(gè)小Led的依次亮滅。先看看流水燈的電路圖。
這是我的實(shí)驗板的流水燈電路圖。其中74HC573的D輸入引腳DB1—DB8接在單片機的P1組引腳。74HC573的LE接在P2.5引腳。
程序設計思路:
我實(shí)驗板上有8個(gè)Led燈,正極接在VCC,負極接在單片機的P1引腳(這里不使用74HC573鎖存功能所以L(fǎng)E一直保存高電平,相當于Led直接接在單片機的IO口)。要讓Led燈亮只需要把對應的端口設為低電平,那么Led燈亮。依次讓P1的八個(gè)引腳給高低電平那么Led燈也會(huì )跟著(zhù)暗亮。由于51單片機執行的速度很快,所以L(fǎng)ed燈的閃爍速度也會(huì )很快,我們肉眼無(wú)法看到,所以要在電平切換時(shí)適當的延時(shí)一下。
流水燈的程序設計有很多種方法,如按位置位、數組、函數_cror_()_crol()等,我本來(lái)我是比較喜歡用函數的方法,但后來(lái)看了一下AVR的,貌似用的最多的是與、或、非、異或這些運算符來(lái)操控IO口,所以我就用這種方式吧,練熟一些方便以后學(xué)習。
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
//用來(lái)延時(shí)
voiddelay(ucharx)
{
uinty;
for(;x>0;x--)
for(y=500;y>0;y--);
}
voidmain()
{
ucharTmp;
uchari;
while(1)
{
Tmp=0xFE;//在流之前先讓第一個(gè)燈亮11111110
for(i=0;i<8;i++)
{
P1=Tmp;
Tmp=Tmp<<1;//左移動(dòng)一位0xFE=11111110<<1=11111100
Tmp=Tmp|0x01;//將最后一位置111111100|00000001=11111101
delay(100); //讓燈亮一段時(shí)間
}
}
}
評論