51單片機入門1
上接上最少的外圍電路元件讓單片機工作。一般只須連接晶體、VCC、GND、RST即可,一般情況下,AT89C51的31腳須接高電平。
#include
{
}
while(1)語句只是讓單片機工作在死循環(huán)狀態(tài),即一直輸出低電平。如果我們要試著點亮其他的LED,也類似上述語句。這里就不再講了。
實顯示的原理很簡單,就是讓一個LED滅后,另一個立即亮,依次輪流下去。假設我們有8個LED分別接在P1口的8個引腳上。硬件連接,在
P1_1--P1_7上再接7個LED即可。例程如下:
#include
sbit P1_0 = P1 ^ 0;
sbit P1_1 = P1 ^ 1;
sbit P1_2 = P1 ^ 2;
sbit P1_3 = P1 ^ 3;
sbit P1_4 = P1 ^ 4;
sbit P1_5 = P1 ^ 5;
sbit P1_6 = P1 ^ 6;
sbit P1_7 = P1 ^ 7;
void Delay(unsigned char a)
{
}
void main(void)
{
}
Delay函數(shù)使單片機空轉,LED持續(xù)點亮后,再滅,下一個LED亮。while(1)產(chǎn)生循環(huán)。
(三)
INTRINS.H實現(xiàn)。函數(shù)unsigned char _crol_(unsigned char a, unsigned char n) 可以使變量a循環(huán)左移n位,如果我們先給P1口賦
0000 0001那么當n為1時,便會產(chǎn)生和上面一樣的效果!
#include
#include
void Delay(unsigned char a)
{
}
void main(void)
{
}
就是KEIL2,我用的就是KEIL2,下面就來講講如何使用KEIL2這個編譯軟件!
AT89C51或AT89C2051,點確定。
話框。這樣.C文件就被加到了Source Group 1 下。
定。
表示編譯和生成HEX文件成功!接下來的就是把HEX文件燒到單片機中,或是仿真器上,看是否達到預先的目的!
了!到現(xiàn)在為止,你應該知道單片機的功能有多強大了吧,如果單純的用數(shù)字電路或模擬電路的知識去設計一個流動彩燈,可能要花點工夫
和時間才行,有了單片機,那就不一樣了,你只要寫程序控制他就行!有人說過這樣一句話,也并不無道理的,學單片機,程序思想很重要!
(四)
但是工程師們設計這么一個單片機,并不是只為了讓它做流水燈的,那樣也太浪費點了吧 ... ^_^
示器多為7段數(shù)碼管,這里我們來講講,如何用單片機讓數(shù)碼管顯示0-9。搶答器的實現(xiàn),我們放到后面再來探討,因為搶答器還涉及了鍵盤的
內(nèi)容。8段數(shù)碼管分為共陰和共陽兩種。8段數(shù)碼管是由8個LED組成(還包括一個小數(shù)點)。若為共陽,則8個LED的陽級是連接在一起的,同理
若為共陰,則陰極連接在一起。8個LED對應的標號如下:
要給某個口,賦一個值,則相應的LED段就被點亮,但是在硬件連接上要注意了:單片機可能不能直接驅動LED,所以我們可以通過控制三級管
的導通或截止,來控制LED的亮與滅!
高,以提高驅動能力。那么比如:P0 = 0X3F;則顯示為數(shù)字 0 。因為0X3F 即為2進制的 0011 1111 我們低位往高位數(shù),依次為1111 1100,
其I/O的電平分別為高、高、高、高、高、高、低、低,即對應的a--dp 為亮、亮、亮、亮、亮、亮、滅、滅,由上圖我們可以看出g和dp段不
亮其他段均亮,即為我們所看到的數(shù)字 0 字樣。其他的數(shù)字或字符,也同理可以得到。但是有些朋友就會問,那我們每取一個字模,豈不是
很麻煩?還有自己考慮高低電平什么的?^-^ 呵呵,其實網(wǎng)上有很多LED取模軟件,如果有一定計算機編程語言的朋友,也可以試著自己寫個
取模的程序,讓計算機為我們計算,諸如上述0X3F的數(shù)值。
#include
void Delay(unsigned char a)
{
}
void main(void)
{
}
數(shù)碼管,再在P1口上接個數(shù)碼管!但是,如果要顯示4位、5位的數(shù)字呢?那豈不是一塊AT8951都接不過來!難到就不能接4位或5位以上的嗎?
肯定不是的!
描顯示,那么就可以解決上面的問題,即可以顯示多個數(shù)碼管了。上面我們所說的靜態(tài)顯示把數(shù)碼管的COM腳接至VCC或GND端,其他的接至PX
口上,這樣只要PX口上輸出相應的高低電平,就可以顯示對應的數(shù)字或字符。但是如果我們采用動態(tài)掃描的方法,比如顯示6個數(shù)碼管,硬件
連接可以這樣解決:a--dp還是接至P0.0--P0.7上,還有6個COM腳再接至另外口的P2.0--P2.5。P0口作段選(控制數(shù)字字符)P2口作位選(選
通哪個數(shù)碼管導通)這樣我們控制P0和P2口就可以控制6個數(shù)碼管了。但是,細心的朋友,會問這樣的問題:P2位選,是讓數(shù)碼管一個一個亮
的,那還是不能控制6個一起亮或滅嘛??? ^_^ 想想好象是對的哦?怎么辦...難道錯了?
續(xù)的曲線或者直線!再回過頭來,仔細想想我們的數(shù)碼管!原理是一樣的,你可別忘了,我們的單片機可是一個計算機哦,計算機的運算速
度,大家可想而知吧!
單片機工作在12M晶體下,那么一個時鐘周期為:1/12微妙。一個機器周期12*1/12 = 1微妙。如果晶體為6M,時鐘周期和機器周期各是多少呢
?在匯編中,我們還要關心,指令執(zhí)行的機器周期長短不一,有1個周期、2個周期和4個周期等。
或一起滅了!
我的意思了!朋友,現(xiàn)在給你個任務,讓6個數(shù)碼管分別顯示1、2、3、4、5、6??茨阕约嚎梢愿愣ú唬磕阕约合仍囍鴮憣懣纯?..
#include
void Delay(unsigned char a)
{
}
void main(void)
{
}
(五)
你也可以把他做出來了,是不是覺得自己很有成就感呢!呵呵! ^_^
要不先不要往下看了,嘿嘿,關機吧,自己先去想想,怎么樣?
#include
unsigned char code SEG_TAB[ ] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9數(shù)字
void Delay(unsigned int a)
{
}
void main(void)
{
}
講過的P2口的位選作用!嘿嘿,沒忘記就好!
#include
unsigned char hour = 12, min = 0, sec = 0;
unsigned char code SEG_TAB[ ] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9數(shù)字
void Delay(unsigned char a)
{
}
void disp(void)
{
}
void main(void)
{
}
評論