本篇我們將分析上一篇所寫的程序代碼。未來學(xué)習(xí)單片機的大部分精力,我們也將放在程序代碼的編寫上。但是不用擔心,我會非常詳細的介紹每個程序的編寫思路和各種注意事項等。
之前我們寫的程序如下:
#include <reg52.h>
sbit LED = P1^0;
void main()
{
? ? LED = 0;
? ? while(1);
}
頭文件
第一行包含頭文件,這個和C語言編寫HelloWorld時的#include 一樣。頭文件reg52.h中定義了單片機的一些寄存器,如P0~P3等。至于什么是寄存器,將在原理篇中具體介紹,現(xiàn)在我們只要把它想象成C語言中常說的內(nèi)存就好了。有興趣的讀者可以右擊reg52.h打開頭文件看一看。
C51的變量類型
這里我們使用的語言是C51,和標準C語言相比,最主要的特點就是多出來兩種變量類型:sfr和sbit。sfr和char一樣是一個8位數(shù)據(jù)類型,表示一個8位的寄存器。例如頭文件reg52.h中就有一句sfr P1 = 0x90,它定義了寄存器P1。由于P1是IO口寄存器,所以對P1賦值,則相應(yīng)的, IO口P1將輸出對應(yīng)的高低電平。而sbit則是一個1位數(shù)據(jù)類型,只有0和1兩種值,它對應(yīng)寄存器中的一個位。
于是在第二行里,我們定義了sbit型變量LED,并設(shè)置LED對應(yīng)P1的最低位bit0。此時變量LED就和IO口P1.0關(guān)聯(lián)起來。執(zhí)行賦值語句LED = 0,IO口P1.0就會輸出低電平,于是我們電路中的LED就會亮起來了。是不是非常神奇呢?在原理篇中,我會一步一步講解單片機是如何實現(xiàn)這種功能的。
位尋址
在其他的很多單片機中,我們只能讀寫整個P1寄存器,而不能直接定義類似sbit這種對應(yīng)寄存器一位的數(shù)據(jù)類型,另外51單片機里面有些寄存器也只能整個8位一起讀寫。這種直接讀寫一個寄存器位的特性被叫做位尋址功能。
又是一個很難理解的概念,同樣,還是需要了解原理篇才能很好的理解它,現(xiàn)在完全不用擔心,我提這個就是想讓初學(xué)者對此提前有個大體印象。畢竟很多知識都是慢慢積累的,如果把大量這樣的小知識全部放在原理篇中一并介紹,反而難以接受。
主函數(shù)的特點:沒有參數(shù)和返回值
讀者應(yīng)該已經(jīng)看到了無參數(shù)且無返回值的void main()函數(shù),以及倒數(shù)第二行的while(1)語句,并可能疑惑不解。沒錯,主函數(shù)沒有參數(shù)也沒有返回值,倒數(shù)第二行的這句是一個死循環(huán),程序永遠也不會退出。這和計算機上的程序有很大的不同。下面簡單的說明一下這樣做的原因何在,更深入的原因,則需要讀者看完原理篇后才能理解透徹。
在計算機中,我們開機時看到的啟動界面是操作系統(tǒng),如Windows、Linux等,我們編寫的程序則是在操作系統(tǒng)的環(huán)境下運行的。程序執(zhí)行時,相當于系統(tǒng)調(diào)用main函數(shù),所以系統(tǒng)可以向main函數(shù)傳遞參數(shù),也可以獲取main函數(shù)執(zhí)行結(jié)束時的返回值,程序執(zhí)行結(jié)束后,會重新回到操作系統(tǒng)環(huán)境下。而在這里,我們寫的程序是直接運行在單片機上的,不依賴操作系統(tǒng)。我們程序中的main函數(shù)不會被操作系統(tǒng)調(diào)用,因此通常它不需要參數(shù),也不需要返回值。事實上,main函數(shù)有些情況下是被啟動代碼調(diào)用的,而啟動代碼是匯編語言寫的,還記得上一篇中提到的啟動代碼么?
主函數(shù)的特點:死循環(huán),不會執(zhí)行結(jié)束
在計算機中,我們寫的程序執(zhí)行結(jié)束會回到操作系統(tǒng)環(huán)境下。而在單片機中,一旦單片機上電復(fù)位,就會執(zhí)行我們寫的main函數(shù),直到斷電。而如果main函數(shù)執(zhí)行結(jié)束,將發(fā)生不可預(yù)知的結(jié)果。
實際實驗時,STC單片機會復(fù)位并重新開始執(zhí)行程序,或許只是個巧合,因為官方的芯片手冊中并沒有明確說明這一點。本著嚴謹?shù)目茖W(xué)態(tài)度,我們不利用這種未經(jīng)官方確認的特點來開發(fā)我們的程序。程序的可靠性是非常重要的,這一點要引起重視。
試想如果你用單片機開發(fā)的是醫(yī)療相關(guān)的產(chǎn)品,或者是控制一些大型機器等,一旦發(fā)生意外,后果難以想象。即使你開發(fā)的是普通的產(chǎn)品,如果總是出現(xiàn)奇怪的故障,也足以讓用戶抓狂。因此這一點要引起讀者注意。所以,單片機的程序是不應(yīng)該執(zhí)行結(jié)束的,因此最后必然是一個死循環(huán),這樣才能保證單片機系統(tǒng)的可靠性。
總結(jié)
于是我們總結(jié)出通常情況下51單片機程序的幾個特點:
1、包含REG52.H,該文件中定義了P0-P3接口等信息(sfr型和sbit型)。
2、單片機主函數(shù)沒有參數(shù),沒有返回值(當然寫成int型也不會報錯,但是沒必要)。
3、單片機主函數(shù)末尾會有個死循環(huán),不會退出。
=======================================================
《單片機小白學(xué)步》系列教程(原名《單片機入門指南》)介紹
本系列教程從最基本的入門知識開始,逐步深入介紹單片機系統(tǒng)設(shè)計,內(nèi)容包括:
1、入門篇:單片機等基本概念、各種電子設(shè)計基本知識
2、思想篇:單片機/計算機系統(tǒng)設(shè)計的工程思想
3、學(xué)習(xí)篇:單片機學(xué)習(xí)過程、方法和技巧,以51單片機為例介紹,并推廣到其他單片機
4、應(yīng)用篇:遵循規(guī)范的工程方法,設(shè)計單片機系統(tǒng)實例(計劃設(shè)計的系統(tǒng)有:計算器、電子表、密碼鎖、簡易手機,具體看有沒有時間再確定)
5、原理篇:從模擬電路、數(shù)字電路開始,逐步深入介紹單片機/計算機系統(tǒng)原理,并自行設(shè)計簡易的CPU(由于個人水平有限,這部分沒有把握寫好,具體內(nèi)容視情況而定)
教程特點
1、技術(shù)知識點全面,從入門到精通
包含了各種基本知識,尤其是對單片機基本概念的介紹、為什么要用單片機等,在很多同類書籍教程中都被忽略了。同時也包含了一些深入的知識,包括原理篇考慮對單片機的基本原理進行介紹,有助于深入理解單片機。
本系列教程以51單片機為例進行介紹。通過51介紹完單片機的基本知識,我會再把430進行簡要介紹,尤其是對比兩者之間的優(yōu)缺點,讓大家很快感受到430的巨大優(yōu)勢,而學(xué)習(xí)51正好為快速了解430打下了堅實的基礎(chǔ)。
2、除了單片機知識,還有思想、方法、技巧的介紹
本系列教程中,介紹單片機各種模塊編程知識的主要是學(xué)習(xí)篇,而學(xué)習(xí)篇只是整個教程的一部分。在學(xué)習(xí)篇中我會貫穿各種方法技巧,如何理解一些模塊功能,怎么看時序圖,嚴格遵守工程思想進行編程,程序發(fā)生了錯誤怎么調(diào)試等等。而在思想篇中會總體介紹很多重要的思想,為后面的學(xué)習(xí)做好準備工作。
3、知識先后順序的設(shè)計
單片機學(xué)習(xí)過程中,涉及大量的知識,而且很多知識之間相互依賴,關(guān)聯(lián)很強。
本系列教程對知識的先后順序進行比較明確的規(guī)劃,盡最大可能符合人的認知過程。但是實際規(guī)劃時發(fā)現(xiàn),無論怎么調(diào)整知識的順序,總有一些知識之間相互依賴,關(guān)系復(fù)雜。例如開始講IO口的時候肯定會提到寄存器,而寄存器這個詞的理解,需要深厚的背景知識。但是這些背景知識在沒有進行實踐的時候也很難理解。
初學(xué)者常常就會在這樣的地方感覺疑惑不解,不知所措。而每次遇到類似這樣的知識,我會向初學(xué)者指出,應(yīng)該如何對待。這個知識是應(yīng)該自己去學(xué)習(xí)補充,還是等到學(xué)完原理篇再做理解,而現(xiàn)在又應(yīng)該怎么去看待這個名詞。
另外,在整個教程的學(xué)習(xí)前,需要掌握一定的C語言等基礎(chǔ)知識,具體可參考教程第〇篇《序》中的相關(guān)說明
http://www.hainter.com/mcu-primer-0
4、語言通俗易懂
本系列教程力求語言通俗易懂,而不會用一堆新手不懂的詞語去解釋另一個不懂的詞語。但是受限于個人語言表達能力,可能有些地方表述的比較繁瑣,或者不清楚,希望大家能夠幫忙指出。
其他問題
如果覺得我寫的對你有幫助,歡迎多多反饋,包括寫的不正確、不合理、不太明白都可以指出來,這樣方便我對其進行完善。
更多可參見:《如何以學(xué)習(xí)單片機為契機,逐步成為優(yōu)秀的工程師》
http://www.hainter.com/mcu-engineer
本系列教程首發(fā)于我的個人主頁,歡迎訪問(由于是國外服務(wù)器,速度稍微有點慢):
http://www.hainter.com/category/hacker/mcu-primer
同時會將其轉(zhuǎn)發(fā)到CSDN、電子發(fā)燒友等站點,歡迎關(guān)注。
CSDN專欄網(wǎng)址?http://blog.csdn.net/column/details/mcu-introduction.html
電子發(fā)燒友論壇?http://bbs.elecfans.com/zhuti_mcu_1.html
本文首發(fā)自我的個人主頁,
轉(zhuǎn)載請注明來源:http://www.hainter.com/mcu-primer-14?
總結(jié)
以上是生活随笔為你收集整理的单片机小白学步系列(十四) 点亮第一个LED的程序分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。