久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

1小時(shí)c語言入門

 bmlq 2011-12-16

1小時(shí)c語言入門

(一)

    相信很多愛好電子的朋友,對(duì)單片機(jī)這個(gè)詞應(yīng)該都不會(huì)陌生了吧,。不過有些朋友可能只聽說他叫單片機(jī),,他的全稱是什么也許并不太清楚,
更不用說他的英文全稱和簡(jiǎn)稱了,。單片機(jī)是一塊在集成電路芯片上集成了一臺(tái)有一定規(guī)模的微型計(jì)算機(jī),。簡(jiǎn)稱為:?jiǎn)纹⑿陀?jì)算機(jī)或單片機(jī)
(Single Chip Computer)。單片機(jī)的應(yīng)用到處可見,,應(yīng)用領(lǐng)域廣泛,,主要應(yīng)用在智能儀表、實(shí)時(shí)控制、通信,、家電等方面,。不過這一切都沒
什么關(guān)系,因?yàn)槲遥ó?dāng)然也包括任何人)都是從不知道轉(zhuǎn)變成知道的,,再轉(zhuǎn)變成精通的?,F(xiàn)在我只想把我學(xué)習(xí)單片機(jī)的經(jīng)歷,詳細(xì)地講敘給大
家聽聽,,可能有些大蝦會(huì)笑話我,,想:那么簡(jiǎn)單的東西還在這里賣弄。但是你錯(cuò)了,,我只是把我個(gè)人學(xué)習(xí)的經(jīng)歷講述一遍而已,僅僅對(duì)那些想
學(xué)習(xí)單片機(jī),,但又找不到好方法或者途徑的朋友,,提供一個(gè)幫助,使他們?cè)趯W(xué)習(xí)過程中,,盡量少走些彎路而已!
    首先,,你必須有學(xué)習(xí)單片機(jī)的熱情,,不是說今天去圖書館看了一個(gè)下午關(guān)于單片機(jī)的書,而明天玩上半天,,后天就不知道那個(gè)本書在講什
么東西了,。還是先說說我吧,我從大二的第一個(gè)學(xué)期期末的時(shí)候才開始接觸單片機(jī),,但在這之前,正如上面所說的:我知道有種芯片叫單片機(jī),,
但是具體長(zhǎng)成什么樣子,卻一點(diǎn)也不知道,!看到這里很多朋友一定會(huì)忍不住發(fā)笑,。嘿嘿,,你可千萬別笑,,有些大四畢業(yè)的人也同樣不知道單片
機(jī)長(zhǎng)成什么樣子呢!而我對(duì)單片機(jī)的癡迷更是常人所不能想象的地步,,大二的期末考試,,我全放棄了復(fù)習(xí),,每當(dāng)室友拿著書在埋頭復(fù)習(xí)的時(shí)候,
我卻捧著自己從圖書館借的單片機(jī)書在那看,,雖然有很多不懂,,但是我還是堅(jiān)持了下來,當(dāng)時(shí)我就想過,,為了單片機(jī)值不值得我這樣去付出,,
或許這也是在一些三流學(xué)校的好處吧,,考試掛科后,,明年開學(xué)交上幾十元一門的補(bǔ)考費(fèi),應(yīng)該大部分都能過了,。于是,,我橫下一條心,堅(jiān)持看
我的單片機(jī)書和資料,。
    當(dāng)你明白了單片機(jī)是這么一回事的時(shí)候,,顯而易見的問題出來了:我要選擇那種語言為單片機(jī)編寫程序呢?這個(gè)問題,,困擾了我好久,。具
體選擇C51還是A51呢?匯編在我們大二之前并沒有開過課,,雖然看著人家的講解,,很容易明白單片機(jī)的每一時(shí)刻的具體工作情況,但是一合上
書或者資料,,自己卻什么也不知道了,,根本不用說自己寫程序了。于是,,我最終還是決定學(xué)C51,,畢竟C51和我們課上講的C語言,有些類似,,
編程的思想可以說是相通的,。而且C51還有更大的優(yōu)點(diǎn)就是編寫大程序時(shí)的優(yōu)越性更不言而喻,當(dāng)然在那時(shí),,我并沒有想的那么深遠(yuǎn),,C51的特
點(diǎn),還是在后來的實(shí)踐過程中,,漸漸體會(huì)到的,!朋友如果你選擇了C51,那么請(qǐng)繼續(xù)往下看,如果你選擇了A51,那么你可以不要看了!因?yàn)橄旅嬷v
的全是C方面的,完全在浪費(fèi)你的時(shí)間!    呵呵 ^_^
    第二,既然你想學(xué)好單片機(jī),你必須得舍得花錢,,如果不買些芯片回來自己動(dòng)手焊焊拆拆的(但是在后期會(huì)介紹給大家一個(gè)很好用的硬件
仿真軟件,并不需要你用實(shí)驗(yàn)板和仿真器了,直接在你的PC上完成,但是軟件畢竟是軟件,從某個(gè)特定的意義上來說是并不能代替硬件的),,即使
你每天捧著本書,把那本書翻爛,,也永遠(yuǎn)學(xué)不會(huì)單片機(jī)的,!剛接觸單片機(jī)的朋友,看了資料,,一定會(huì)對(duì)以下幾個(gè)詞見的比較多,,但是具體的概
念還是比較模糊,現(xiàn)作如下說明:
(1)編程器 編程器是用來燒單片機(jī)芯片的,,是把HEX或者BIN文件燒到單片機(jī)ROM里的,供單片機(jī)運(yùn)行的,。
(2)實(shí)驗(yàn)板 實(shí)驗(yàn)板是專為初學(xué)者根據(jù)某些要求而特做的板,一般上面就有一個(gè)單片機(jī)的最小系統(tǒng),,使用者只需寫好程序,,燒好芯片,放
到上面加以驗(yàn)證的這么一個(gè)工具,。有了實(shí)驗(yàn)板,,對(duì)與初學(xué)者來說,省去了焊?jìng)€(gè)最小系統(tǒng)的麻煩,。但是對(duì)于電子開發(fā)人員來說,,作用并不是很大
(3)仿真器 仿真器是直接把HEX或者BIN文件暫時(shí)放在一個(gè)芯片里,再通過這個(gè)芯片的引腳連接到實(shí)驗(yàn)板或者系統(tǒng)上工作,。這樣以來,可
以省去了來回插拔芯片帶來的不必要麻煩,。
    我一開始也不知道上面3個(gè)的概念和作用,嘿嘿,原本想買個(gè)實(shí)驗(yàn)板(不想焊板,因?yàn)椴豢赡転榱它c(diǎn)亮幾個(gè)流水燈,而去焊?jìng)€(gè)單片機(jī)的最小系統(tǒng))
的,可是結(jié)果,確和我想的正好相反,人家出售的是編程器,。等貨物寄到后,才知道自己搞錯(cuò)了,!汗,。。,。嘿嘿?,F(xiàn)在想想實(shí)在是又氣又笑。我花
了160大樣買了個(gè)編程器(很不幸的是,,這個(gè)編程器更本用不了,,一燒芯片,芯片就燒壞了)把我給氣的,,這個(gè)編程器,,現(xiàn)在還躺在我的抽屜里
呢不過,現(xiàn)在想想,唯一讓我覺得欣慰的是,,那個(gè)老板每次能解答我的問題,,連那種超級(jí)幼稚的問題,他也能不嫌麻煩地盡量幫我解答,!這點(diǎn)讓
我很感動(dòng),!
    第三,想學(xué)單片機(jī)的必需品--PC,。因?yàn)閷懗绦?,編譯或者是仿真都是通過PC完成的。如果沒有PC,,什么也做不了?。?!有了PC最好還要可
以上網(wǎng),,因?yàn)槿绻銢]有可以和你交流單片機(jī)的人,遇到自己解決不了的問題,,一直都想不通,,那么估計(jì)你學(xué)習(xí)單片機(jī)的熱情就會(huì)隨著時(shí)間的
推移而慢慢耗盡。如果你能上網(wǎng)通過論壇或者QQ群,,問題就很快得到解決,。這樣的學(xué)習(xí)效率一定很高!真正的高手是從論壇中泡出來的,!
    有了上述3個(gè)條件后,,你就可以開始學(xué)你的單片機(jī)了。但是,,真的做起來并沒有我所說的那么簡(jiǎn)單,。你一定會(huì)遇到很多很多的問題。比如
為了讓單片機(jī)實(shí)現(xiàn)某個(gè)功能,,你可能不知道怎么去寫某個(gè)程序,。或是你看懂了資料上某個(gè)相似的程序,,你自己卻寫不出來,。遇到類似的情況,
記?。呵f不要急噪,,就行!


(二)

    說了這么多了,,相信你也看了很多資料了,,手頭應(yīng)該也有必備的工具了吧?。ú灰松厦嬷v過幾個(gè)條件的哦)。那個(gè)單片機(jī)究竟有什么
功能和作用呢,?先不要著急,!接下來讓我們點(diǎn)亮一個(gè)LED(搞電子的應(yīng)該知道LED是什么吧^_^)
    我們?cè)趩纹瑱C(jī)最小系統(tǒng)上接個(gè)LED,看我們能否點(diǎn)亮它!對(duì)了,上面也有好幾次提到過單片機(jī)最小系統(tǒng)了,所謂單片機(jī)最小系統(tǒng)就是在單片機(jī)
上接上最少的外圍電路元件讓單片機(jī)工作,。一般只須連接晶體,、VCC、GND,、RST即可,,一般情況下,AT89C51的31腳須接高電平,。
#include<reg51.h>      //頭文件定義,。或用#include<at89x51.h>其具體的區(qū)別在于:后者定義了更多的地址空間,。
    //在Keil安裝文件夾中,,找到相應(yīng)的文件,比較一下便知,!
    sbit P1_0 = P1 ^ 0;    //定義管腳
    void main (void)
{
while(1)
{
P1_0 = 0;//低電平有效,,如果把LED反過來接那么就是高電平有效
}
}

    就那么簡(jiǎn)單,我們就把接在單片機(jī)P1_0上的LED點(diǎn)亮了,,當(dāng)然LED是低電平,,才能點(diǎn)亮。因?yàn)槲覀儼袻ED的正通過電阻接至VCC,。
    P1_0 = 0; 類似與C語言中的賦值語句,,即把 0 賦給單片機(jī)的P1_0引腳,讓它輸出相應(yīng)的電平。那么這樣就能達(dá)到了我們預(yù)先的要求了,。
while(1)語句只是讓單片機(jī)工作在死循環(huán)狀態(tài),,即一直輸出低電平。如果我們要試著點(diǎn)亮其他的LED,,也類似上述語句,。這里就不再講了,。
    點(diǎn)亮了幾個(gè)LED后,,是不是讓我們聯(lián)想到了繁華的街區(qū)上流動(dòng)的彩燈。我們是不是也可以讓幾個(gè)LED依次按順序亮呢,?答案是肯定的,!其
實(shí)顯示的原理很簡(jiǎn)單,就是讓一個(gè)LED滅后,,另一個(gè)立即亮,,依次輪流下去,。 假設(shè)我們有8個(gè)LED分別接在P1口的8個(gè)引腳上。硬件連接,,在
P1_1--P1_7上再接7個(gè)LED即可,。例程如下:
#include<reg51.h>

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)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一個(gè) ; 表示空語句,CPU空轉(zhuǎn)。
}          //i 從0加到125,,CPU大概就耗時(shí)1毫秒
}

void main(void)
{
while(1)
{
P1_0 = 0;
    Delay(250);
P1_0 = 1;

P1_1 = 0;
    Delay(250);
P1_1 = 1;

P1_2 = 0;
    Delay(250);
P1_2 = 1;

P1_3 = 0;
    Delay(250);
P1_3 = 1;

P1_4 = 0;
    Delay(250);
P1_4 = 1;

P1_5 = 0;
    Delay(250);
P1_5 = 1;

P1_6 = 0;
    Delay(250);
P1_6 = 1;

P1_7 = 0;
Delay(250);
P1_7 = 1;
}
}


    sbit 定義位變量,,unsigned char a 定義無符字符型變量a,以節(jié)省單片機(jī)內(nèi)部資源,,其有效值為0~255,。main函數(shù)調(diào)用Delay()函數(shù)。
Delay函數(shù)使單片機(jī)空轉(zhuǎn),,LED持續(xù)點(diǎn)亮后,,再滅,下一個(gè)LED亮,。while(1)產(chǎn)生循環(huán),。



(三)

    上面我們講了如何使LED產(chǎn)生流動(dòng),但是你是否發(fā)現(xiàn)一個(gè)問題:寫的太冗長(zhǎng)了,!能不能再簡(jiǎn)單點(diǎn)呢,?可以!可以使用C51的內(nèi)部函數(shù)
INTRINS.H實(shí)現(xiàn),。函數(shù)unsigned char _crol_(unsigned char a, unsigned char n) 可以使變量a循環(huán)左移n位,,如果我們先給P1口賦
0000 0001那么當(dāng)n為1時(shí),便會(huì)產(chǎn)生和上面一樣的效果,!
#include<intrins.h>
#include<reg51.h>

void Delay(unsigned char a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void main(void)
{
unsigned char b, i;
while(1)
{
b = 0xfe;
for(i = 0; i < 8; i++)
{
    P1 = _crol_(b, 1);
              b = P1;
    Delay(250);
}
}
}


    INTRINS.H函數(shù)中的unsigned char _cror_(unsigned char a, unsigned char n)右移也可以實(shí)現(xiàn)同樣的效果,!這里就不再累述。
    流水燈的花樣很多,,我還寫過那種拉幕式的流動(dòng)等,,程序很簡(jiǎn)單,有興趣的朋友,,可以自己試著寫寫,!
    對(duì)了,講了那么多,,有些朋友一定還不知道編譯軟件怎么用,?這里給大家介紹幾個(gè)吧?WAVE(偉福)大家一定聽說過吧,!還有一個(gè)
就是KEIL2,,我用的就是KEIL2,下面就來講講如何使用KEIL2這個(gè)編譯軟件,!
1.安裝軟件,,這個(gè)應(yīng)該不用再講了吧,!
2.安裝完后,啟動(dòng)KEIL軟件左擊Project-->New Project-->輸入文件名-->選擇我們所以使用的芯片(這里我們一般用到Atmel的
AT89C51或AT89C2051,,點(diǎn)確定,。
3.點(diǎn)File-->New-->輸入我們編寫的程序,保存為.C文件,。(一般情況下,,我們保存的文件名和前面的工程名一樣。)

4.展開Target 1 -->右擊Source Group 1 -->Add Files to Group 'Source Group 1'-->選擇剛才保存的.C文件點(diǎn)擊ADD后,,關(guān)閉對(duì)
話框,。這樣.C文件就被加到了Source Group 1 下。
5.右擊Target 1-->Options for 'Target 1' -->Target中填寫晶體的大小,,Output中,,在Create HEX Files 前打上鉤,點(diǎn)確
定,。
6.點(diǎn)Project-->Rebuild All Traget Files ,,若提示  
                                  creating hex file from "XXX"...
      "XXX" - 0 Error(s), 0 Waring(s).
表示編譯和生成HEX文件成功!接下來的就是把HEX文件燒到單片機(jī)中,,或是仿真器上,,看是否達(dá)到預(yù)先的目的!  
嘿嘿,!現(xiàn)在是否自己好有成就感了,,如果讓你去做個(gè)流水彩燈,開發(fā)一個(gè)簡(jiǎn)單的產(chǎn)品,,只要加上驅(qū)動(dòng)電路,,就可以做出漂亮的流動(dòng)彩燈
了!到現(xiàn)在為止,,你應(yīng)該知道單片機(jī)的功能有多強(qiáng)大了吧,,如果單純的用數(shù)字電路或模擬電路的知識(shí)去設(shè)計(jì)一個(gè)流動(dòng)彩燈,可能要花點(diǎn)工夫
和時(shí)間才行,,有了單片機(jī),,那就不一樣了,你只要寫程序控制他就行,!有人說過這樣一句話,,也并不無道理的,學(xué)單片機(jī),,程序思想很重要,!




(四)

    呵呵,,朋友,!相信你的流水燈也做的不錯(cuò)了吧,,現(xiàn)在能玩出幾種花樣了?你可能會(huì)說,,只要你想得到,,想怎么流就怎么流!呵呵,,是的,。
但是工程師們?cè)O(shè)計(jì)這么一個(gè)單片機(jī),并不是只為了讓它做流水燈的,,那樣也太浪費(fèi)點(diǎn)了吧 ... ^_^  
    學(xué)過數(shù)字電路的朋友,,一定動(dòng)手做過8路或者6路的搶答器。用純粹的數(shù)字電路知識(shí)來做,,自己設(shè)計(jì)電路,,感到比較困難!搶答器上用的顯
示器多為7段數(shù)碼管,,這里我們來講講,,如何用單片機(jī)讓數(shù)碼管顯示0-9。搶答器的實(shí)現(xiàn),,我們放到后面再來探討,,因?yàn)閾尨鹌鬟€涉及了鍵盤
內(nèi)容。8段數(shù)碼管分為共陰和共陽兩種,。8段數(shù)碼管是由8個(gè)LED組成(還包括一個(gè)小數(shù)點(diǎn)),。若為共陽,則8個(gè)LED的陽級(jí)是連接在一起的,,同理
若為共陰,,則陰極連接在一起。8個(gè)LED對(duì)應(yīng)的標(biāo)號(hào)如下:({0x3f, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9數(shù)字)
          a                                          0     1   2     3    4    5    6    7    8    9
          __                                     0011 1111,0000 0110,0100 1111,0101 1011
      f | | b     
        |__|
        |g | c
      e |__| . dp
          d
    一般情況下,,為了計(jì)算或取碼的方便,,我們把a(bǔ)-dp依次接到單片機(jī)某個(gè)口上的Px.0--Px.7上。x表示0,,1,,2,3其中的一個(gè),。這樣我們只
要給某個(gè)口,,賦一個(gè)值,則相應(yīng)的LED段就被點(diǎn)亮,,但是在硬件連接上要注意了:?jiǎn)纹瑱C(jī)可能不能直接驅(qū)動(dòng)LED,,所以我們可以通過控制三級(jí)管
的導(dǎo)通或截止,來控制LED的亮與滅,!
    如果我們把共陰的數(shù)碼管的a--dp依次接到單片機(jī)的P0.0--P0.7上,,注意:P0口需接上拉電阻,。何為上拉電阻,簡(jiǎn)單的說,,就是把電平拉
高,,以提高驅(qū)動(dòng)能力。那么比如:P0 = 0X3F,;則顯示為數(shù)字 0 ,。因?yàn)?X3F 即為2進(jìn)制的 0011 1111 我們低位往高位數(shù),依次為1111 1100,,
其I/O的電平分別為高,、高、高,、高,、高、高,、低,、低,即對(duì)應(yīng)的a--dp 為亮,、亮,、亮、亮,、亮,、亮、滅,、滅,,由上圖我們可以看出g和dp段不
亮其他段均亮,即為我們所看到的數(shù)字 0 字樣,。其他的數(shù)字或字符,,也同理可以得到。但是有些朋友就會(huì)問,,那我們每取一個(gè)字模,,豈不是
很麻煩?還有自己考慮高低電平什么的,?^-^ 呵呵,,其實(shí)網(wǎng)上有很多LED取模軟件,如果有一定計(jì)算機(jī)編程語言的朋友,,也可以試著自己寫個(gè)
取模的程序,,讓計(jì)算機(jī)為我們計(jì)算,諸如上述0X3F的數(shù)值。
#include<reg51.h>

void Delay(unsigned char a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void main(void)
{
P0 = 0X3F; //顯示 0  
Delay(250);//延時(shí)
P0 = 0X00;//短暫的關(guān)閉顯示,,若不關(guān)閉,,可能會(huì)造成顯示模糊不清。

P0 = 0X06; //顯示 1
Delay(250);
P0 = 0X00;

... //以下顯示數(shù)字2-F,,略。
}

    看到這里,,想必大家一定可以把0-F顯示出來了吧,!但是如果要你顯示兩位數(shù),三位數(shù)呢,?或許,,有的朋友會(huì)這么想:在P0口上接一個(gè)
數(shù)碼管,再在P1口上接個(gè)數(shù)碼管,!但是,,如果要顯示4位、5位的數(shù)字呢,?那豈不是一塊AT8951都接不過來,!難到就不能接4位或5位以上的嗎?
肯定不是的,!
    說到這里,,我們來講講數(shù)碼管的顯示方式,可分為兩種:動(dòng)態(tài)掃描和靜態(tài)顯示,。上面我們所說的即為靜態(tài)顯示,。但是如果我們采用動(dòng)態(tài)掃
描顯示,那么就可以解決上面的問題,,即可以顯示多個(gè)數(shù)碼管了,。上面我們所說的靜態(tài)顯示把數(shù)碼管的COM腳接至VCC或GND端,其他的接至PX
口上,,這樣只要PX口上輸出相應(yīng)的高低電平,,就可以顯示對(duì)應(yīng)的數(shù)字或字符。但是如果我們采用動(dòng)態(tài)掃描的方法,,比如顯示6個(gè)數(shù)碼管,,硬件
連接可以這樣解決:a--dp還是接至P0.0--P0.7上,還有6個(gè)COM腳再接至另外口的P2.0--P2.5,。P0口作段選(控制數(shù)字字符)P2口作位選(選

通哪個(gè)數(shù)碼管導(dǎo)通)這樣我們控制P0和P2口就可以控制6個(gè)數(shù)碼管了,。但是,細(xì)心的朋友,,會(huì)問這樣的問題:P2位選,,是讓數(shù)碼管一個(gè)一個(gè)亮
的,那還是不能控制6個(gè)一起亮或滅嘛!,? ^_^ 想想好象是對(duì)的哦,?怎么辦...難道錯(cuò)了?
    嘿嘿,,問你個(gè)問題,?黑夜里,拿著一支煙,,在你面前快速的晃動(dòng),,你會(huì)發(fā)現(xiàn)什么樣的現(xiàn)象?是不是原本不連續(xù)的點(diǎn)變成了一條看上去連
續(xù)的曲線或者直線,!再回過頭來,,仔細(xì)想想我們的數(shù)碼管!原理是一樣的,,你可別忘了,,我們的單片機(jī)可是一個(gè)計(jì)算機(jī)哦,計(jì)算機(jī)的運(yùn)算速
度,,大家可想而知吧,!
    這里再說說51單片機(jī)的機(jī)器周期和時(shí)鐘周期等概念。所謂機(jī)器周期就是訪問一次存儲(chǔ)器的時(shí)間,。而1個(gè)機(jī)器周期包括12個(gè)時(shí)鐘周期,。如果
單片機(jī)工作在12M晶體下,那么一個(gè)時(shí)鐘周期為:1/12微妙,。一個(gè)機(jī)器周期12*1/12 = 1微妙,。如果晶體為6M,時(shí)鐘周期和機(jī)器周期各是多少呢
,?在匯編中,,我們還要關(guān)心,指令執(zhí)行的機(jī)器周期長(zhǎng)短不一,,有1個(gè)周期,、2個(gè)周期和4個(gè)周期等。
    說著說著,,跑了這么遠(yuǎn)了...還是回到原來的話題,,如果我們把位選的P2也看作上面的“煙”一劃而過,那么我們看到的是不是6個(gè)一起亮
或一起滅了,! ^_^ 哈哈,,原來如此...      記住,在任何某一時(shí)刻,,有且只有一個(gè)數(shù)碼管能發(fā)光,。如果你能把這句話理解了,你是真明白
我的意思了!朋友,,現(xiàn)在給你個(gè)任務(wù),,讓6個(gè)數(shù)碼管分別顯示1、2,、3,、4、5,、6,。看你自己可以搞定不,?你自己先試著寫寫看咯...

#include<reg51.h>

void Delay(unsigned char a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void main(void)
{
while(1)
{
P0 = 0x06;//1的碼段
P2 = 0x01;//選通一位,,或者P2_0 = 1;  
Delay(20);//延時(shí)約20毫秒
P0 = 0X00;//關(guān)閉顯示

P0 = 0x5b;//2的碼段
P2 = 0x02; //選通一位,,或者P2_1 = 1;
Delay(20);
P0 = 0X00;

P0 = 0x4f;//3的碼段
P2 = 0x04; //選通一位,,或者P2_2 = 1;
Delay(20);
P0 = 0X00;

P0 = 0x66;//4的碼段
P2 = 0x08; //選通一位,或者P2_3 = 1;
Delay(20);
P0 = 0X00;

P0 = 0x6d;//5的碼段
P2 = 0x10;//選通一位,,或者P2_4 = 1;  
Delay(20);
P0 = 0X00;

P0 = 0x7d;//6的碼段  
P2 = 0x20;//選通一位,,或者P2_5 = 1;  
Delay(20);
P0 = 0X00;
}
}



(五)

    相信大家一定見過數(shù)字時(shí)鐘,教學(xué)樓大廳一定有吧,。每次路過,,基本上只是隨便瞟上一眼,根本沒去想過他的工作原理什么,。但是今天
你也可以把他做出來了,,是不是覺得自己很有成就感呢!呵呵,! ^_^
    接上面所講的,,我們先來做個(gè)簡(jiǎn)單的實(shí)驗(yàn):在一個(gè)數(shù)碼管上輪流顯示0--9這10個(gè)數(shù)字。還楞著干什么,,快動(dòng)手寫程序呀,!好象有點(diǎn)難哦,
要不先不要往下看了,,嘿嘿,,關(guān)機(jī)吧,自己先去想想,,怎么樣,?
#include<reg51.h>

unsigned char code SEG_TAB[ ] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9數(shù)字

void Delay(unsigned int a) //unsigned int 定義為無符整形,取值范圍為0--32768
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void main(void)
{
unsigned char i;
while(1)
{
for(i = 0; i < 10; i++)
{
    P0 = SEG_TAB[ i ]; //取SEG_TAB數(shù)組中的值
    P2 = 0X01;
    Delay(1000);
}
}
}

    是不是顯示從0--9,,跳動(dòng)顯示,,你的心是不是也跟著一起跳呀,離我們的目標(biāo)又邁進(jìn)了一步!不錯(cuò),,繼續(xù)努力,!
    上面只顯示了一個(gè)數(shù)碼管的數(shù)字0--9,但是怎么樣要讓他顯示6個(gè)數(shù)字呢,?這樣我們就可以做個(gè)時(shí)鐘出來玩玩了,!還記不記得我們前面
講過的P2口的位選作用!嘿嘿,,沒忘記就好,!
#include<reg51.h>

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)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void disp(void)
{
P0 = SEG_TAB[ sec % 10 ];//顯示秒的個(gè)位
P2 = 0X01;
Delay(15);
P2 = 0;

P0 = SEG_TAB[ sec / 10 ];//顯示秒的十位
P2 = 0X02;
Delay(15);
P2 = 0;

P0 = SEG_TAB[ min % 10 ];//顯示分的個(gè)位
P2 = 0X04;
Delay(15);
P2 = 0;

P0 = SEG_TAB[ min / 10 ];//顯示分的十位
P2 = 0X08;
Delay(15);
P2 = 0;

P0 = SEG_TAB[ hour % 10 ];//顯示時(shí)的個(gè)位
P2 = 0X10;
Delay(15);
P2 = 0;

P0 = SEG_TAB[ hour / 10 ];//顯示時(shí)的十位
P2 = 0X20;
Delay(15);
P2 = 0;
}

void main(void)
{  
while( 1 )
{
disp( );
}
}  
    編譯燒錄芯片后,觀察運(yùn)行現(xiàn)象,。矣...怎么一直顯示12:00:00,,難道是時(shí)鐘沒有啟動(dòng)?還是,,另外的原因呢,? 哦,原來是3個(gè)變量
sec,min,hour初始化后,,其值一直沒有改變,!那我們?cè)趺礃硬拍茏屗淖償?shù)值呢?有的朋友一定會(huì)這么認(rèn)為:讓秒個(gè)位延時(shí)1秒,,后加1,,
而秒十位延時(shí)10秒后,再加1,,一直加到6,,分個(gè)位加1,依次類推...這樣的想法是不錯(cuò),,但是朋友你有沒有想過C語言的一般延時(shí)(除非你
把他放到中斷里)極不精確,!這樣累計(jì)下來,一天24小時(shí)的誤差,,肯定很大很大,,我曾經(jīng)也用延時(shí)的方法寫過時(shí)鐘,1個(gè)小時(shí)誤差8秒,,那是
個(gè)什么概念,!一天24小時(shí)就要24*8=192,約為3分鐘,,一個(gè)月就是10分鐘...有沒有其他的方法可以改進(jìn)些呢,?有!這里就要涉及到單片機(jī)中
另一個(gè)比較重要的核心部分:?jiǎn)纹瑱C(jī)的中斷和定時(shí)器的運(yùn)用,!想寫出比較精確(這里說的只的相對(duì)前面的做法而言比較精確而已,,如果要做
更加精確的時(shí)鐘,,用時(shí)鐘芯片比較好點(diǎn),常用的有DS12887和DS1302等)的時(shí)鐘程序,,就一定要調(diào)用中斷和定時(shí)器,。還是大家先看看教材和書
吧,畢竟人家出的書,,肯定比我要寫的系統(tǒng)多了,,下面我們?cè)賮砗?jiǎn)單的講講!


(六)

    什么是中斷呢,?講個(gè)比較通俗的例子:比如你正在家中看電視,,突然電話響了,你的第一反應(yīng)是什么,?是不是先跑過去接電話,!接完電話
后,繼續(xù)看電視,。這就是個(gè)中斷的例子,,中斷是由電話引起了,你跑過去就是響應(yīng)中斷,,接電話就是中斷的處理,!接完電話后,,接續(xù)看電視,,
即恢復(fù)中斷,等待下個(gè)中斷的到來,!
    但是這個(gè)好象和單片機(jī)沒什么聯(lián)系呀,?有的朋友或許會(huì)這樣疑問。是的,。單片機(jī)當(dāng)然不會(huì)看電視了,,也不會(huì)接電話了 ! ^_^ 但是,,類
比一下:比如單片機(jī)正在執(zhí)行某個(gè)任務(wù),,突然要有更重要的事件,要求單片機(jī)響應(yīng),,單片機(jī)就會(huì)應(yīng)答響應(yīng),,去執(zhí)行更為重要的任務(wù)(中斷處理
),原來的任務(wù)就繼續(xù)等待(現(xiàn)場(chǎng)的保護(hù)),。執(zhí)行完更重要的任務(wù)后,,回到中斷的入口處,繼續(xù)執(zhí)行原來的任務(wù)(現(xiàn)場(chǎng)中斷的恢復(fù)),。51系列
的單片機(jī)共有5個(gè)中斷源,,分別為:外中斷0 ,、定時(shí)器T0中斷、外中斷1,、定時(shí)器T1中斷,、串口中斷。     
    或許,,有些朋友已經(jīng)大概領(lǐng)會(huì)了其中的意思,,有些朋友還迷迷糊糊。不過不要緊,,我們繼續(xù)往下看,,下面我們來講講單片機(jī)的定時(shí)器是什
么?如何工作的,?定時(shí)器,,大家從字面上就可以看出其大概的意思吧?簡(jiǎn)單的說:就是起定時(shí)作用,!也就是讓單片機(jī)計(jì)數(shù),。定時(shí)器分為:方式
0方式1、方式2和方式3等4種工作方式,。有些朋友一定會(huì)問:定時(shí)器如何啟動(dòng),?風(fēng)扇的定時(shí)器,相信大家一定都用過吧,!但是單片機(jī)的定時(shí)器,,
該如何啟動(dòng)呢?總不該也用手一擰定時(shí)器吧! ^_^ 當(dāng)然不是,,我們只要給單片機(jī)一些指令,,就可以啟動(dòng)定時(shí)器了!下面我們就定時(shí)器0,,來說

說怎么啟動(dòng)定時(shí)器0,。

TMOD = 0X01;//設(shè)置定時(shí)器0 工作方式0
TH0 = (65536 - 5000) / 256;//載入高8位初值
TL0 = (65536 - 5000) % 256;//載入低8位初值
TR0 = 1;        //啟動(dòng)定時(shí)器

    ^_^,簡(jiǎn)單吧,,這樣我們就可以把定時(shí)器啟動(dòng)了,。其中TMOD為T/C方式控制寄存器:

D7 D6 D5 D4 D3 D2 D1 D0
    _      _
      GATE C/T    M1    M0    GATE C/T M1 M0

        |_________    __________| |_________    __________|
|        T/C1          | |        T/C0          |

    C/T就是counter(記數(shù)器)和timer(定時(shí)器)的選擇位,若值為1,,則作計(jì)數(shù)器用,。為0,則為定時(shí)期用,!GATE為門控位,。M1和M0工作方
式的選擇:若M1=0;M0=0 則為方式0:13位定時(shí)/記數(shù)器,。若M1=0,;M0=1則為方式1,,16定時(shí)/記數(shù)器。若M1=1,;M0=0則為方式2,,自動(dòng)裝載8位
定時(shí)/記數(shù)器。若M1=1,;M0=1則為方式3,,只適用于T/C0,2個(gè)8位定時(shí)/記數(shù)器,。
    說了一大堆,,感到有點(diǎn)困惑了吧。那我們還是來說說上面的,。TMOD= 0X01,;//至于為什么是0X01,大家看:我們選擇的是定時(shí)器0方式0,,
所以T/C1全為0,,而T/C0的M1為0。M0為1,,所以D0-D7為0X01,;0X01表示的是16進(jìn)制數(shù),這個(gè)大家應(yīng)該都知道吧,!還有D0-D7表示的是2進(jìn)制數(shù),。
還需要轉(zhuǎn)換一下!
    TH0 = (65536 - 5000) / 256;//載入高8位初值,。若在12M晶體下,,定時(shí)5000微秒,,即為5毫秒,;但是如果不是在12M下,那又該怎么計(jì)算
了呢,?如果是11.0592M呢,?還記不記得,我們前面講過的機(jī)器周期和時(shí)鐘周期的概念,? ^_^忘了,,還是看看前面吧!呵呵,!沒事,,學(xué)習(xí)嘛,忘
了再翻翻書,,看看就可以了,!其實(shí)上訴的5000 = 1 * C 很顯然C=5000,,但是如果是11.0592M那么就不是1了,應(yīng)該是1.085了,,那么5000 =  
1.085 * C,,則C就為5000 / 1.085 = ? 具體多少,大家自己去算算吧,?同理TL0也是一樣的,! 但是,細(xì)心的朋友會(huì)發(fā)現(xiàn)網(wǎng)上或者是資料上的
TH0,,TL0并不是和上面一樣的,,而是直接TH0 = 0XEC;TL0 = 0X78 是不是和上面的一樣的,,別忘了單片機(jī)也是計(jì)算機(jī)的一種哦,。用C的話,直
接寫上計(jì)算公式就行,,計(jì)算就交給單片機(jī)完成,。
    TR0 = 1;這句就是啟動(dòng)定時(shí)器0,,開始記數(shù),!哦,還有一點(diǎn),,有些朋友會(huì)問,,你是65536是哪里來的呢?呵呵你可別忘了:設(shè)置定時(shí)器0  
工作方式0是16位的(2的16次方是多少,,自己算算就知道了)簡(jiǎn)單吧,?但是如何和中斷一起使用呢?請(qǐng)繼續(xù)看下面的講解,!

TMOD = 0X01;//設(shè)置定時(shí)器0 工作方式0
TH0 = (65536 - 5000) / 256;//載入高8位初值
TL0 = (65536 - 5000) % 256;//載入低8位初值
TR0 = 1;        //啟動(dòng)定時(shí)器
     
EA = 1,;//開總中斷
ET0 = 1;//開定時(shí)器中斷,。若為0則表示關(guān)閉,!
    這樣我們,就初始化定時(shí)器T0和中斷了,,也就是定時(shí)器滿5毫秒后,,產(chǎn)生一次中斷。產(chǎn)生中斷后,,我們?cè)趺刺幚砟??嘿嘿!仔?xì)想想,?
^_^
每次中斷后,,我們可以讓一個(gè)變量自加1,,那么200次中斷后,不就是1秒的時(shí)間了嗎,?比起上面我們說的延時(shí)來出來是不是更加精確多了呢,?
那是肯定的!但是想想1秒種的時(shí)間就讓單片機(jī)產(chǎn)生那么多次的中斷,,單片機(jī)會(huì)不會(huì)累著呢,?恩,那么不好,。如果在12M的晶體下,,T0每次中
斷不是可以產(chǎn)生最多65.336毫秒的時(shí)間嗎?那么我們讓他每50毫秒中斷一次好了,!這樣我們就20次搞定一秒的時(shí)間了,! ·爽·
    好了,講了那么多,,現(xiàn)在我們來寫個(gè)時(shí)間的程序吧,! ^_^


#include<at89x51.h>

#define HI    ((65536 - 50000) / 256)
#define LO    ((65536 - 50000) % 256)
#define _TH0_TL0_          (65536 - 50000)
#define M    20            //(1000/25)

/**********************************************************************************************/
unsigned hou = 12, min = 0, sec = 0;

unsigned char SEG_TAB_B[ ] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9數(shù)字
unsigned char SEG_TAB_A[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0.-9.數(shù)字

/*********************************************************************************************/
void Delay(unsigned char a)//延時(shí)程序a*1MS
{
unsigned char j;  
while(a-- != 0)
{
for (j = 0; j < 125; j++);
}
}

/*********************************************************************************************/
void Disp(void)//數(shù)碼管顯示
{
P2_0 = 1;
P1 = SEG_TAB_B[ hou / 10 ];  
Delay(5);
P2_0 = 0;

P2_1 = 1;
P1 = SEG_TAB_A[ hou % 10 ];
Delay(5);
P2_1 = 0;

P2_2 = 1;
P1 = SEG_TAB_B[ min / 10 ];  
Delay(5);  
P2_2 = 0;

P2_3 = 1;
P1 =S EG_TAB_A[ min % 10 ];  
Delay(5);
P2_3 = 0;

P2_4 = 1;
P1 = SEG_TAB_B[ sec / 10 ];  
Delay(5);  
P2_4 = 0;

P2_5 = 1;
P1 = SEG_TAB_B[ sec % 10 ];  
Delay(5);  
P2_5 = 0;
}

/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1    //定時(shí)50ms
{
static unsigned char count = 0; //定義靜態(tài)變量count

count++;
if(count == M)
{
count = 0;  
sec++;  
if(sec == 60)
{
min++;
sec = 0;
if(min == 60)
{
    hou++;
    min = 0;
    if(hou == 24)
    {
    hou = 0;
    }
}//if
}//if
}//if
}

/******************************************************************************************/
void Timer0Init(void) //定時(shí)器0
{
TMOD = 0x01;

TH0 = HI;
TL0 = LO;
TR0 = 1;

ET0 = 1;
EA = 1;

}

/******************************************************************************************/
void main(void) //主函數(shù)
{
Timer0Init();

while(1)
{
Disp();
}
}


   

    簡(jiǎn)單吧,還是有點(diǎn)看不懂哦,,那你自己慢慢體會(huì)吧,,如果你自己能寫個(gè)時(shí)鐘程序來,那么你的51單片機(jī)也就學(xué)了80 % 了,。中斷和
定時(shí)/記數(shù)器器,,是個(gè)很重要的東西,幾乎用到單片機(jī)的地方都會(huì)涉及到中斷和定時(shí),!所以大家要好好掌握哦,! ^_^  
    哈哈,趕緊編譯HEX文件,,搭好硬件,,燒入單片機(jī),上電看看效果先,!呵呵,,現(xiàn)在你應(yīng)該有成就感了吧,想不到一個(gè)時(shí)鐘居然那么
簡(jiǎn)單,, 嘿嘿!但是問題來了,!時(shí)鐘雖然做出來了,,但是他的精度怎么樣呢?一兩個(gè)小時(shí),,或許看不出什么誤差,,但是一天或者一年呢,?
暈,我的天呀,,要是按年來算的話,,那這個(gè)時(shí)鐘根本沒有實(shí)用價(jià)值!人家都說用C寫不出,,精度高的時(shí)鐘程序來的?。?!是不是有點(diǎn)后悔
了,,去學(xué)匯編吧!但是既然選擇了C,,那么就不要后悔,!嘿嘿,想想C的高級(jí)語言,,怎么會(huì)輸給匯編呢 ^_^ 呵呵,!看下面這段代碼:


static unsigned char count = 0;

TR0 = 0;
      TL0 += (_TH0_TL0_ + 9) % 256;
      TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
      TR0 = 1;

count++;
    在中斷處理服務(wù)程序中,我們加入上面的代碼,。 TR0 = 0; 先關(guān)閉定時(shí)器T0,,然后重新給TH0和TL0 賦值,再開啟 TR0 = 1;燒入單片
機(jī)看看效果,,怎么樣,,你第一次精確多了吧。但是還是有誤差,!郁悶,!為什么呢?那是硬件造成的誤差,,我們可以用軟件來彌補(bǔ),!我們先
把時(shí)鐘點(diǎn)亮,讓他走上幾個(gè)小時(shí)或者是幾天,,看看到底誤差是多少,!取個(gè)平均值。(這里比如我們10小時(shí)快1秒)那么可以通過以下語句
if(hour % 10 = 0)
{
sec--;
}
來彌補(bǔ),!這樣可能會(huì)出現(xiàn)這樣的現(xiàn)象:秒直接跳變,!我們可以再通過細(xì)分來實(shí)現(xiàn),不要10小時(shí)那么大,,小些的就行,!具體的操作還是留給
朋友們吧!


(七)

    這回我們來講講鍵盤,大家肯定見過銀行柜員機(jī)吧,,取錢輸入密碼就要用到鍵盤,,超市購物取回寄存物品要輸入密碼,還有你現(xiàn)在在
用的PC機(jī)的鍵盤,。但是鍵盤的是怎么工作的呢,?一般有2種方式:(1)掃描法,不斷掃描鍵盤的狀態(tài),,送CPU判斷并處理,。如果鍵盤數(shù)目一
大的話,顯然不適合(2)線反轉(zhuǎn)法,,通過行列狀態(tài)的改變來判斷有無鍵被按下,!
    現(xiàn)在我們?cè)赑1口接個(gè)4*4的鍵盤,P1.0--P1.3接行,P1.4---P1.7接列,再接4個(gè)4K7的上拉電阻至VCC,。代碼如下:

//----鍵盤掃描法程序-------
//----用數(shù)碼管顯示相應(yīng)的鍵值-----
//P1.0--P1.3接行-------
//P1.4---P1.7接列-------
#include<reg51.h>

unsigned char code tab[ ]={0x3F,0x06,0x5B,0x4F,
        0x66,0x6D,0x7D,0x07,
        0x7F,0x6F,0x77,0x7C,
      0x39,0x5E,0x79,0x71};//0到F的16個(gè)鍵植

/******************************************************************************/
void Delayt(unsigned char t)//延時(shí)函數(shù)
{
unsigned char i;
for(t=0;i<=t;t++)
    for(i=0;i<255;i++);
}

/******************************************************************************/
bit pkey(void)//判斷鍵的否被按下,,通過返回值確定
{
P1=0xf0;
if(P1!=0xf0)
    {
    Delayt(25);
      if(P1!=0xf0)
      return 1;
      else  
      return 0;
    }
else
      return 0;
}

/******************************************************************************/
void main(void)//主函數(shù)
{
unsigned char key,j,k,s;
while(1)
{
    if(pkey()==1)
    {  
      P1=0xfe;
    k=0xfe;
      for(j=0;j<4;j++)
          {  
                  s=P1&0xf0;
        switch(s)
    {
    case 0xe0: key=4*j+0; break;  
        case 0xd0: key=4*j+1; break;
      case 0xb0: key=4*j+2; break;
      case 0x70: key=4*j+3; break;
      default: break;  
    }
    k=(k<<1)|0x01;
    P1=k;
                }//for
    }//if
//if((P1&0xf0)==0xf0)
        P0=tab[key];
P2=1;
Delayt(50);
}//while
}


    還有一種就是線反轉(zhuǎn)法,實(shí)現(xiàn)如下:
1.和掃描法相同,,把列線置低電平,,行置高,讀行狀態(tài)
2.與1相反,,把行置低,,列置高,讀列狀態(tài)
3.若有鍵按下,,則為2次所讀狀態(tài)的結(jié)果即為鍵所在的位置,,這樣2次輸出和2次讀入可以完成鍵的識(shí)別!??!

    子函數(shù)如下:
unsigned char key_vscan(void)
{
    unsigned char row, col;
    P1 = 0xF0;
    row = P1&0xF0;
    row = row&0xF0;

    P1 = 0x0F;
    col = P1&0x0F;
    col = col&0x0F;

    return(key_val(row|col));
}


    下面我們?cè)賮斫榻B介紹一鍵多能的程序,即按下一個(gè)鍵,,可以執(zhí)行不同的命令,!

void main (void)
{

unsigned char b = 0;
while( 1 )
{
if(P1_0 == 0)
    {
Delay(10);
      if(P1_0 == 0)
{
    b++;  
    if( b == N )//N為鍵的功能數(shù)目
    {
    b = 0;
    }
      while(P3_2 == 0);//等待鍵松開
}
    }
switch( b )
    {
      case 1: P2_0 = 0xFE;
              break;
      case 2: P2_1 = 0xfd;
      //..............add your code here!
    }
}
}



(八)//以上的文字寫于2005年5月,由于時(shí)間關(guān)系,一直未能將此完成,最近閑著無聊又接著寫了些文字,以下寫于2006年6月5日!
    在這里我想對(duì)上面一點(diǎn),作個(gè)簡(jiǎn)單的說明,,如果你是剛學(xué)單片機(jī),,那么你寫的代碼是VERY GOOD的,但是如果把上面的代碼應(yīng)用于產(chǎn)品的話,,那么我可以告訴你,,上面所寫的按鍵識(shí)別代碼全部是垃圾代碼,^_^,這下傻了吧,,呵呵,。為什么,?我的按鍵不是可以正常工作嗎,?
    請(qǐng)看這里:
if(P1_0 == 0)
{
Delay(10);//問題就在這里,,你讓CPU在這里空轉(zhuǎn)?
    if(P1_0 == 0)
{
//...add your code here.
}
}
進(jìn)入第1個(gè)if判斷語句后,,就進(jìn)入了Delay(10);再看Delay函數(shù),,完全讓CPU執(zhí)行(;空語句),,所以在做大的產(chǎn)品或者代碼時(shí),,這個(gè)是非常耗費(fèi)單片機(jī)內(nèi)部資源的。有什么辦法嗎,?呵呵,,那是肯定的。
    解決方法大致有如下2種:
1.將延時(shí)函數(shù)放在中斷中,,在中斷里查詢延時(shí)的標(biāo)志位,。/*不僅僅用于鍵盤識(shí)別,亦可以用于其他的延時(shí)代碼,見EX1*/
2.直接在中斷中查詢按鍵的標(biāo)志位.//見EX2,。
     
EX1:
unsigned char Delaytime;

void Delay(unsigned char Delaytime)//
{
while(Delaytime !=0 );//等在這里,,直到Delaytime為0。
}

void Timer0_interrupt(void) interrupt 1 using 2
{
if(Delaytime != )
Delaytime--;

//...add your other code here
}

Delay函數(shù)具體延時(shí)多長(zhǎng)時(shí)間,,就要看你設(shè)定的T0定時(shí)器中斷和Delaytime的乘積,,比如你的定時(shí)器中斷為50MS,Delaytime為20的話,,那么50MS*20=1S,。

EX2:
#define Press_key = P2 ^ 7;//定義按鍵的I/O

void P_key(void)
{
char new_value,old_value;

new_value = Press_key;

if(new_value && !old_value)//識(shí)別按鍵。
{
Turn_On_LEd( );
//...add your other code here.
}
old_value = new_value;
}

void Timer0_interrupt(void) interrupt 1 using 2
{
P_key();

// ...add your other code
}

當(dāng)然在實(shí)際過程當(dāng)中,,并不是如此簡(jiǎn)單簡(jiǎn)潔的,,還希望大家能夠舉一反三哦... ^_^。


(九)

寫了這么多了,,大家也看了這么多了,,感覺怎么樣?大家也覺得不難吧,。其實(shí)51也就那么簡(jiǎn)單,,真的很希望大家看完這篇文字以后,很自信的說,,51單片機(jī)也已經(jīng)入門,。這是對(duì)我寫怎么多文字最好的回答。時(shí)隔13個(gè)月之久再來繼續(xù)寫這些東西,,沒有以前的激_情和熱情,,所以就草草了事結(jié)尾,希望大家不要在背地里罵我哦,^_^。當(dāng)然以上講的只是最簡(jiǎn)單的一些東西,,單片機(jī)的功能非常之強(qiáng)大,,只要你能想得到,就一定可以用單片機(jī)來實(shí)現(xiàn)的,。
當(dāng)然單片機(jī)和外部其他的芯片還有很多,,比如數(shù)字溫度傳感器DS18B20,實(shí)時(shí)時(shí)鐘芯片DS1302,,還有比如訪問AT24CXX的EEPROM存儲(chǔ)器等,,更多的電路,還要靠大家在平時(shí)的學(xué)習(xí)過程當(dāng)中,,慢慢掌握,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多