新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 初步認識51單片機

        初步認識51單片機

        作者: 時間:2016-11-21 來源:網絡 收藏
        前面我們學會了如何操作一個MCU的管腳(P1.0),讓它設置為低電平(sbit LED= P1^0; LED=0),那么我們很容易的就能想到如何將MCU的管腳設置成高電平. 這一講,我們就來討論如何控制單片機的IO口,也就是輸入輸出端口(input and output port)

        2.1單片機IO口操作與延時

        本文引用地址:http://www.104case.com/article/201611/319542.htm

        既然我們學會了如何控制P1.0,那么同樣的方式我們就能控制P1.1,P1.2, ... P1.7了。很奇怪,為什么單片機的引腳從P1.0開始到P1.7,為什么不是從P1.1到P1.8?基本上你所見到的控制芯片都是以0為起始的。我們把P1.0到P1.7叫做P1端口。那么這樣的端口有多少個呢,在STC89C52中,一共有4組這樣的端口,分別是P0,P1,P2,P3. 每個端口都有8個管腳,這樣很快,我們應該知道操作這4組共32個管腳了。我相信寫到這里,每個人都已經知道了如何使用這32個任意一個管腳來控制LED。

        既然我們學會了如何控制一個LED,那么如何控制兩個LED?很容易的能猜到代碼如下:

        #include

        sbit LED1 = P1^0;

        sbit LED2 = P1^1;

        sbit LED3 = P2^1;

        void main(void)

        {

        while(1)

        {

        LED1=0;

        LED2=0;

        LED3=0;

        }

        }

        通過以上方式我們能用任意的IO端口來點亮LED。這里就不再贅述了。

        既然我們學會了如何點亮一個LED,相信熄滅一個LED也會了,并且你能很快的寫出代碼:

        #include

        sbit LED = P1^0;

        void main(void)

        {

        while(1)

        {

        LED = 0;

        LED = 1;

        }

        }

        這樣對不對?是對的。LED=0,燈亮了,LED=1燈滅了。程序確實是沒有問題,LED也是這樣操作的。問題是人的肉眼分辨不出來,為什么呢?這里就涉及到了單片機的運行速度以及人眼的分辨間隔。下面我們來分析從LED=0(亮)到LED=1(滅),中間的間隔是多長時間?這個涉及到單片機的執行速度與時鐘周期,機器周期,指令周期相關,我們暫且不討論。現在我們通過keil軟件調試的方法找到從LED=0到LED=1這個過程花了多長時間。

        (1) 打開keil軟件,新建一個工程,并將以上代碼拷入led.c文件

        (2) 點擊Project->options for Target Target1...

        (3) 在彈出的對話框中選擇target, Xtal選擇11.0592,然后點擊OK

        (4) 點擊debug圖標,紅色方框所示

        (5) 彈出來的界面比較糟糕,可以自己調節,如何調節?這里舉一個例子,比如我想移動Register這個窗口,用鼠標左鍵點擊Register窗口的標題欄(窗口的藍色部分),按住鼠標不松開并拖動。

        此時界面如上圖所示,四個紅色方框內的方框表示四個方向。此時將鼠標不松開繼續拖動到右邊紅色方框中(注意是要把鼠標放到方框內),結果如下:

        此時右邊區域會變為藍色,該區域表示Register即將存放的區域,然后松開鼠標,拖動結束。

        點擊Register窗口中Auto hide圖標,如下圖紅色方框所示,將Register窗口自動隱藏。

        其他窗口的調整方法類似。

        (6) 插入斷點。如下圖所示,在紅色方框位置雙擊鼠標,則自動插入斷點,并且出現紅色斷點標志。

        這里我們插入兩個斷點如圖所示

        點擊紅色方框(1)中的RST,然后點擊紅色方框(2)中的run,此時黃色箭頭會跳到紅色方框(3)處,記錄紅色方框(4)中的時間t1=0.00042209s

        點擊方框(2)中的run,此時黃色箭頭會跳到紅色方框(5)處,記錄紅色方框(4)中的時間t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,

        表示LED從點亮到熄滅只用了2.17微秒,而人眼的最小分辨時間間隔大約為0.27s(270000微秒),因此感知不到燈的亮滅過程。你可以將這個程序下載到單片機中做做實驗,你會發現LED很暗。事實上以上程序將導致LED循環亮滅,由于變化時間太快,幾個微秒,我們無法感知,因此給人的感覺就是燈很暗。現在我們如何設置延時,讓我們能更清楚的觀察燈的亮滅過程?思路很簡單,讓單片機點亮LED后,去干點別的事情,然后再熄滅LED。這個就好比你坐火車時,提前到了一個小時,你可以看看書,玩玩手機。目的是坐火車,看書,玩手機只起到消磨時間的作用。那么同樣,在本例中,我們讓單片機干什么事情呢?可以選擇休眠(我們后面講到),或者讓它去數數。比如從1數到10000等等。這種方式就叫做軟件延時。

        #include

        sbit LED = P1^0;

        void main(void)

        {

        unsigned int i;

        while(1)

        {

        LED = 0;

        for(i=0;i<40000;i++);

        LED = 1;

        for(i=0;i<40000;i++);

        }

        }

        將以上代碼復制到led.c文件中并保存。該段代碼中,通過去做別的事情來達到延時的作用。我們再次調試看看LED熄滅和點亮時間的間隔,設置斷點如下:

        以上可以看出,1.60636393s-0.00042318s 大約1.6s,遠遠大于人的分辨時間。

        既然我們能控制一個LED的亮滅了,那么同理可知,我們當然知道如何控制并延時其他LED了,這樣我們就學會如何操作單片機的IO端口以及如何通過軟件延時了。

        下面我們來看看就這兩招能干什么事情?



        關鍵詞: 初步認識51單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 库伦旗| 浮梁县| 印江| 平阴县| 金溪县| 出国| 曲水县| 南陵县| 太仆寺旗| 闸北区| 沙湾县| 兴文县| 阳城县| 大庆市| 中山市| 收藏| 横山县| 桦川县| 金寨县| 岱山县| 来凤县| 三明市| 荣成市| 龙门县| 万盛区| 永城市| 栖霞市| 福州市| 忻州市| 新和县| 咸丰县| 五原县| 木里| 临朐县| 周至县| 重庆市| 金山区| 江门市| 鹿泉市| 泰安市| 定南县|