單片機小白學步系列(二十一) IO口:基本的LED和按鍵操作

本篇我們先介紹最基礎的幾個IO口操作。學完本篇,大家要能自己獨立完成下面幾個實驗。

1、點亮LED

2、一個按鍵控制LED,按下燈亮,釋放燈滅

3、兩個按鍵控制一個LED,一個鍵開燈,一個鍵關燈

實驗一

點亮LED的例子前面入門篇已經講過了,程序寫起來很簡單,Keil編寫程序並編譯生成HEX文件,燒寫進單片機的過程,也做了完整詳細的介紹。

點亮LED利用了IO口輸出操作。簡單複習一下,最核心的兩句代碼是:

sbit LED = P1^0;

LED = 0;

第一句定義LED爲sbit型變量,對應了P1.0口的高低電平,具體應該寫哪個IO口,和實際電路有關。第二句設置LED對應的P1.0管腳輸出低電平,從而點亮LED。

實驗二:按鍵開關

講第二個實驗前,先簡單介紹下常用的按鍵開關。下圖就是最常見的按鍵開關,有四個引腳,圖中的1、2連在一起,3、4連接在一起。按下按鍵時,四個引腳就全部導通了。

IMG_2283_1_1_2.jpg
IMG_2282_1_1_2.jpg

實驗二:搭建電路

根據前面講的IO口原理,我把按鍵開關一端接在P2.0端口了,另一端接到GND。因爲P2.0有內部上拉電阻,我就不用自己外接了。最小系統和LED還是之前的電路不變,如下圖所示。

IMG_2287_1_1.jpg

實驗二:程序實現

程序首先定義了LED和KEY,分別表示發光二極管和按鍵開關。如果你用的是成品開發板,或者電路和我的不一樣,就定義你的電路中對應的管腳。開發板可以從電路圖查看獨立按鍵所在的管腳。

主函數剛開始時,設置KEY輸出高電平,因爲後面要讀取KEY所在端口的電平。在程序的主循環中,讀取KEY的值,這裏我們直接把KEY當做一個一位變量去判斷就可以了,它有值0和1。如果KEY爲1,即KEY==1,說明按鍵沒有按下,設置LED=1即熄滅。注意這裏使用兩個等號表示比較而不能用一個等號,那樣就成賦值了。在else中,設置LED=0即點亮。於是就能實現我們需要的效果了。

#include <reg52.h>

sbit LED = P1^0;

sbit KEY = P2^0;

void main()

{

    KEY = 1;

    while(1) {

        if(KEY == 1) {

            LED = 1;

        } else {

            LED = 0;

        }

    }

}

這是我按下按鍵,燈亮時的情形。

IMG_2288_1_1.jpg

實驗二:程序分析

注意這裏我們讀取按鍵和開關LED的代碼應該放在主循環裏面,也就是不斷的讀取按鍵狀態並開關燈。如果放在主循環前面,主函數寫成下面這樣,是不能工作的。因爲單片機執行速度很快,放在循環前面只會讀取按鍵執行一次,執行完了進入while(1)主循環,單片機就不會再讀取按鍵的狀態,這時無論如何按鍵,它都不會幫你開關LED了。

void main()

{

    KEY = 1;

    if(KEY == 1) {

        LED = 1;

    } else {

        LED = 0;

    }

}

程序簡化

還要說的是,這個程序還能進一步簡化。因爲KEY是一個變量,在C語言中變量有真假值,非零爲真,零爲假。所以主循環中可以這樣寫(其他部分相同):

if(KEY) {

    LED = 1;

} else {

    LED = 0;

}

但是還可以繼續簡化。因爲LED和KEY都是變量,可以考慮直接用KEY給LED賦值,寫成下面這樣就行了。

LED = KEY;

取反操作的應用

如果要實現按下按鍵燈滅,釋放按鍵燈亮這樣恰好相反的效果,做個很小的修改就可以了,如下所示。感嘆號是邏輯取反的意思,如果是0就會變成1,如果是非0就變成0。

LED = !KEY;

實驗三

實驗三我只提供主要代碼片段,具體的分析理解,實際電路搭建和實驗,交給大家自己完成。

sbit KEY_ON = P2^0;

sbit KEY_OFF = P2^1;

while(1) {

    if(KEY_ON == 0)

        LED = 0;

    if(KEY_OFF == 0)

        LED = 1;

}

再次強調,如果想學好單片機,大家一定要自己獨立做完這三個實驗,切身體驗單片機的工作過程,提高動手能力。如果做實驗的過程中感覺很神奇,感受到動手的樂趣,就更容易學好單片機。如果你覺得這只是不想做的任務,或許你對單片機並沒有什麼興趣,那樣的話想學好單片機就有些困難了。因爲學習從來都應該是主動的事情。

下一篇會繼續講IO口相關的實驗。

=======================================================

《單片機小白學步》系列教程(原名《單片機入門指南》)介紹

本系列教程從最基本的入門知識開始,逐步深入介紹單片機系統設計,內容包括:
1、入門篇:單片機等基本概念、各種電子設計基本知識
2、思想篇:單片機/計算機系統設計的工程思想
3、學習篇:單片機學習過程、方法和技巧,以51單片機爲例介紹,並推廣到其他單片機
4、應用篇:遵循規範的工程方法,設計單片機系統實例(計劃設計的系統有:計算器、電子錶、密碼鎖、簡易手機,具體看有沒有時間再確定)
5、原理篇:從模擬電路、數字電路開始,逐步深入介紹單片機/計算機系統原理,並自行設計簡易的CPU(由於個人水平有限,這部分沒有把握寫好,具體內容視情況而定)

教程特點

1、技術知識點全面,從入門到精通

包含了各種基本知識,尤其是對單片機基本概念的介紹、爲什麼要用單片機等,在很多同類書籍教程中都被忽略了。同時也包含了一些深入的知識,包括原理篇考慮對單片機的基本原理進行介紹,有助於深入理解單片機。

本系列教程以51單片機爲例進行介紹。通過51介紹完單片機的基本知識,我會再把430進行簡要介紹,尤其是對比兩者之間的優缺點,讓大家很快感受到430的巨大優勢,而學習51正好爲快速瞭解430打下了堅實的基礎。

2、除了單片機知識,還有思想、方法、技巧的介紹

本系列教程中,介紹單片機各種模塊編程知識的主要是學習篇,而學習篇只是整個教程的一部分。在學習篇中我會貫穿各種方法技巧,如何理解一些模塊功能,怎麼看時序圖,嚴格遵守工程思想進行編程,程序發生了錯誤怎麼調試等等。而在思想篇中會總體介紹很多重要的思想,爲後面的學習做好準備工作。

3、知識先後順序的設計

單片機學習過程中,涉及大量的知識,而且很多知識之間相互依賴,關聯很強。

本系列教程對知識的先後順序進行比較明確的規劃,盡最大可能符合人的認知過程。但是實際規劃時發現,無論怎麼調整知識的順序,總有一些知識之間相互依賴,關係複雜。例如開始講IO口的時候肯定會提到寄存器,而寄存器這個詞的理解,需要深厚的背景知識。但是這些背景知識在沒有進行實踐的時候也很難理解。

初學者常常就會在這樣的地方感覺疑惑不解,不知所措。而每次遇到類似這樣的知識,我會向初學者指出,應該如何對待。這個知識是應該自己去學習補充,還是等到學完原理篇再做理解,而現在又應該怎麼去看待這個名詞。

另外,在整個教程的學習前,需要掌握一定的C語言等基礎知識,具體可參考教程第〇篇《序》中的相關說明
http://www.hainter.com/mcu-primer-0

4、語言通俗易懂

本系列教程力求語言通俗易懂,而不會用一堆新手不懂的詞語去解釋另一個不懂的詞語。但是受限於個人語言表達能力,可能有些地方表述的比較繁瑣,或者不清楚,希望大家能夠幫忙指出。

《單片機小白學步》交流羣

歡迎單片機愛好者加入《單片機小白學步》交流羣。此羣目標:

1、較高質量的單片機等技術的學習交流羣
2、爲《單片機小白學步》讀者及時提供更新通知
3、結交愛好思考學習,對技術感興趣,志同道合的朋友

加羣原則是寧可少加人,也要保證質量(不懂技術沒關係,關鍵是有一顆不怕困難、熱愛學習的心)。有空的時候我會重點在裏面回答一些技術問題。也鼓勵大家相互討論和促進~羣裏主要話題爲單片機相關,但是也可以討論各種想法等內容,愛學習愛思考的也可以加。羣號:124083011,請正確回答問題後進入,也希望幫忙推薦周圍合適的人加羣。

其他問題

如果覺得我寫的對你有幫助,歡迎多多反饋,包括寫的不正確、不合理、不太明白都可以指出來,這樣方便我對其進行完善。

更多可參見:《如何以學習單片機爲契機,逐步成爲優秀的工程師》
http://www.hainter.com/mcu-engineer

本系列教程首發於我的個人主頁,歡迎訪問(由於是國外服務器,速度稍微有點慢):
http://www.hainter.com/category/hacker/mcu-primer

同時會將其轉發到CSDN、電子發燒友等站點,歡迎關注。
CSDN專欄網址 http://blog.csdn.net/column/details/mcu-introduction.html
電子發燒友論壇 http://bbs.elecfans.com/zhuti_mcu_1.html


本文首發自我的個人主頁,轉載請註明來源:http://www.hainter.com/mcu-primer-21 

發佈了124 篇原創文章 · 獲贊 142 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章