欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 第2章  點(diǎn)亮你的LED 2.4  2.5  2.6 [打印本頁]

作者: 卓然塵世間    時間: 2026-3-16 13:39
標(biāo)題: 第2章  點(diǎn)亮你的LED 2.4  2.5  2.6
2.4程序代碼編寫
        這是第一個實(shí)驗程序,編程之前,需要先來了解一些51單片機(jī)特有的程序語法以及Keil軟件的基本操作步驟。
2.4.1特殊功能寄存器和位定義
        不同廠家的單片機(jī)除了采用通用的C語言編程外,有的廠家的單片機(jī)會有那么幾條很特殊的獨(dú)有的編程語句,51單片機(jī)就有,先介紹2條。
        第一條語句是:sfr  P0 = 0x80;
        sfr這個關(guān)鍵字,是51單片機(jī)特有的,它的作用是定義一個單片機(jī)特殊功能寄存器(special function register)。51單片機(jī)內(nèi)部有很多個小模塊,每個模塊居住在擁有唯一房間號的房間內(nèi),同時每個模塊都有8個控制開關(guān)。P0就是一個功能模塊,就住在了0x80這個房間里,用戶就是通過設(shè)置P0內(nèi)部這個模塊的8個開關(guān),來讓單片機(jī)的P0這8個I/O口輸出高電平或者低電平的。而51單片機(jī)內(nèi)部有很多寄存器,如果想使用必須提前進(jìn)行sfr聲明。不過Keil軟件已經(jīng)把所有這些聲明都預(yù)先寫好并保存到一個專門的文件中去了,用戶只需要文件開頭添加一行#include<reg52.h>即可,這個在后邊有用法詳解。
        第二條語句是:sbit  LED = P0^0;
        這個sbit,就是對剛才的SFR里邊的8個開關(guān)其中的一個進(jìn)行定義。經(jīng)過上邊第二條語句后,以后只要在程序里寫LED,就代表了P0.0口(“^”這個符號在數(shù)字鍵6上邊),注意這個P必須大寫,也就是說給P0.0又取了一個更形象的名字叫做LED。
        了解了這兩個語句后,再來看一下單片機(jī)的特殊功能寄存器。請注意,每個型號的單片機(jī)都會配有生產(chǎn)廠商所編寫的數(shù)據(jù)手冊(Datasheet),STC89C52的數(shù)據(jù)手冊從21頁到24頁,全部是對特殊功能寄存器的介紹以及地址映射列表。用戶在使用這個寄存器之前,必須對這個寄存器的地址進(jìn)行說明。是不是花花綠綠的太多了記不住,這個沒關(guān)系的,不需要記住,后邊大部分都會解釋,少部分需要用到的時候過來查手冊就可以,再次強(qiáng)調(diào)做技術(shù)不是為了應(yīng)付考試,可以隨時翻閱手冊查找需要的資料。
如圖2-7,是截取的手冊中第22頁最下邊的一個表格。

      圖2-7  I/O口特殊功能寄存器
        來看一下這個表,其中STC89C52RC的P4口對標(biāo)準(zhǔn)51的擴(kuò)展,先忽略它,只看前邊的P0、P1、P2、P3這4個,每個P口本身又有8個控制端口。可以結(jié)合Kingst51開發(fā)板原理圖或者圖2-1來看,那么這樣就確定了單片機(jī)一共有32個I/O口(I/O,Input和Output,分別是輸入和輸出)。
        其中P0口所在的地址是0x80,一共有從7到0這8個I/O口控制位,后邊有個Reset Value(復(fù)位值),這個很重要,是看寄存器必看的一個參數(shù),8個控制位復(fù)位值全部都是1。這就是告訴用戶,每當(dāng)單片機(jī)上電復(fù)位的時候,所有的引腳的值默認(rèn)是都是1,即高電平,在設(shè)計電路的時候也要充分的考慮這個問題。
前邊那2條語句寫sfr的時候,必須根據(jù)手冊里的這個地址(Add)去寫,寫sbit的時候,就可以直接將一個字節(jié)其中某一位取出來。編程的時候,也有現(xiàn)成的寫好寄存器地址的頭文件,直接包含該頭文件就可以了,不需要逐一去寫了。

2.4.2新建一個工程
        對于單片機(jī)程序來說,每個功能程序都必須要有一個配套的工程(Project),即使是點(diǎn)亮LED這樣簡單的功能程序也不例外。因此首先要新建一個工程,打開Keil軟件后,點(diǎn)擊:Project-->New uVision Project...然后會出現(xiàn)一個新建工程的界面,如圖2-8所示。

               圖2-8  新建一個工程
        在計算機(jī)硬盤上建立一個lesson2的目錄,然后把LED這個工程的路徑指定到這里,這樣方便今后管理程序,不同的功能程序放到不同的文件夾下,并且給這個工程起一個名字叫做LED,軟件會自動添加擴(kuò)展名.uvproj,如圖2-9所示。

                    圖2-9  保存工程
        點(diǎn)擊“保存”按鈕,工程會自動保存成LED.uvproj文件,下次要打開LED這個工程時,可以直接找到文件夾,雙擊這個.uvproj文件就可以直接打開。
保存之后會彈出一個對話框,這個對話框讓用戶選擇單片機(jī)型號。因為Keil軟件是外國人開發(fā)的,所以國內(nèi)的STC89C52并沒有上榜,但是只要選擇同類型號就可以了。因為51內(nèi)核是由Intel公司創(chuàng)造的,所以這里直接選擇Intel公司名下的80/87C52來代替,這個選項的選擇對于后邊的編程沒有任何的不良影響。如圖2-10所示

            圖2-10  單片機(jī)型號選擇
        點(diǎn)擊OK之后,會彈出一個對話框,如圖2-11所示,每個工程都需要一段啟動代碼,如果點(diǎn)“否”按鈕,編譯器會自動處理這個問題,如果點(diǎn)“是”按鈕,這部分代碼會提供給用戶,用戶就可以按需要自己去處理這部分代碼,那這部分代碼在初學(xué)51的這段時間內(nèi),一般是不需要去修改的,但是隨著技術(shù)的提高和知識的擴(kuò)展,就有可能會需要了解這塊內(nèi)容,因此這個地方單擊“是”按鈕,讓這段代碼出現(xiàn),但是暫時不需要修改它,大家知道這么回事就可以了。

             圖2-11  啟動代碼選擇
        這樣工程就建立好了,如圖2-12所示,如果點(diǎn)擊Target 1左邊的加號,會出現(xiàn)剛才加入的初始化文件STARTUP.A51,這個先不管。

                  圖2-12  工程文件
        工程有了之后,要建立編寫代碼的文件,點(diǎn)擊File-->New,如圖2-13所示,新建一個文件,也就是編寫程序的平臺。然后點(diǎn)File-->Save或者直接點(diǎn)擊Save的快捷鍵,可以保存文件,保存時把它命名為LED.c,這個地方必須加上.c,如果寫匯編語言,這個地方的擴(kuò)展名是.asm,頭文件就是.h等等,這里編寫的是C語言程序,這個地方必須自己添加文件的擴(kuò)展名.c,如圖2-14所示。

                  圖2-13  新建文件

                   圖2-14  保存文件
        現(xiàn)在就可以在已經(jīng)建立好的文件中輸入程序代碼了,在編寫之前還有個工作要做,每做一個功能程序,必須要新建一個工程,一個工程代表了單片機(jī)要實(shí)現(xiàn)的一個功能。但是一個工程有時可以把程序分多個文件寫,所以每寫一個文件,都要添加到所建立的工程中去,右鍵點(diǎn)Source Group 1,點(diǎn)Add Files to Group ‘Source Group 1’...,如圖2-15所示。

                圖2-15  添加文件(一)
        在彈出的對話框中,單擊LED.c選中它,然后點(diǎn)Add,或者直接雙擊LED.c都可以將文件加入到這個工程下,然后單擊Close,關(guān)閉添加。這個時候會看到在Source Group 1下邊又多了一個LED.c文件。

               圖2-16  添加文件(二)

2.4.3編寫點(diǎn)亮小燈的程序
        準(zhǔn)備工作做了那么多,終于要編寫程序代碼了。如果學(xué)過C語言,應(yīng)該很輕松的編程,如果沒學(xué)過C語言也沒關(guān)系,先照著抄,后邊有針對一些C語言語法的講解,多看幾遍就懂了。
#include <reg52.h>     //包含特殊功能寄存器定義的頭文件

sbit LED = P0^0;       //位地址聲明,注意:sbit必須小寫、P大寫!

void main()            //任何一個C程序都必須有且僅有一個main函數(shù)
{                        //{}是成對存在的,在這里表示函數(shù)的起始和結(jié)束
    LED = 0;            //分號表示一條語句結(jié)束
}
         先從程序語法上來分析一下。
1、main是主函數(shù)的函數(shù)名字,每一個C程序都必須有且僅有一個main函數(shù)。
2、void是函數(shù)的返回值類型,本程序沒有返回值,用void表示。
3、{}在這里是函數(shù)開始和結(jié)束的標(biāo)志,不可省略。
4、每條C語言語句以;結(jié)束的。
        邏輯上來看,程序這樣寫就可以了,但是在單片機(jī)實(shí)際應(yīng)用中存在一個問題。比如程序空間可以容納100行代碼,但是實(shí)際的程序只用了50行代碼,當(dāng)運(yùn)行完了50行,再繼續(xù)運(yùn)行時,第51行的程序不是用戶的程序,而是不確定的未知內(nèi)容,一旦執(zhí)行下去程序就會出錯從而可能導(dǎo)致單片機(jī)自動復(fù)位,所以通常在程序中加入一個死循環(huán),讓程序停留在所希望的這個狀態(tài)下,不要亂運(yùn)行,有以下兩種寫法可以參考:
參考程序一:                   參考程序二:
#include <reg52.h>          #include <reg52.h>
sbit LED = P0^0;            sbit LED = P0^0;
void main()                  void main()
{                              {
    while(1)                      LED = 0;
    {                               while(1);
        LED = 0;               }
    }
}
        程序一的功能是程序在反復(fù)不斷的無限次執(zhí)行LED = 0;這條語句,而程序二的功能是執(zhí)行一次,然后程序直接停留下來等待,相對程序一來說程序二更加簡潔一些。針對于圖2-6,這個程序能夠把小燈點(diǎn)亮,但是這個程序卻點(diǎn)不亮Kingst51開發(fā)板上的小燈,這是為什么呢?
        這里就要培養(yǎng)一個意識,單片機(jī)編程實(shí)際上算是硬件底層驅(qū)動程序開發(fā),這種程序的開發(fā)是離不開電路圖的,必須根據(jù)電路圖來進(jìn)行程序的編寫。如果電路板的電路圖和圖2-6一樣的話,程序可以成功點(diǎn)亮小燈,但是如果不一樣,就可能點(diǎn)不亮。
        開發(fā)板上還有一個74HC138作為8個LED小燈的總開關(guān),而P0.0僅僅是個分開關(guān)。如同家里有一個供電總閘,然后每個電燈又有一個專門的分支開關(guān)。剛才的程序僅僅打開了那個電燈的分支開關(guān),但是沒有打開那個總電閘。所以程序需要加上這部分代碼。因為這節(jié)課要介紹的內(nèi)容比較多,所以74HC138的原理以及為什么要加額外的代碼在下節(jié)課統(tǒng)一介紹,這節(jié)課直接加上這部分代碼做一下功能演示。
#include <reg52.h>   //包含特殊功能寄存器定義的頭文件

sbit LED = P0^0;     //位地址聲明,注意:sbit必須小寫、P大寫!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
    ENLED = 0;
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    LED = 0;        //點(diǎn)亮小燈
    while (1);      //程序停止在這里
}
        為什么有的書上程序很簡單就可以點(diǎn)亮小燈,這里卻要麻煩一些呢?Kingst51開發(fā)板雖然僅僅提供給大家簡單學(xué)習(xí)使用,但是也是按照實(shí)際產(chǎn)品的開發(fā)模式去設(shè)計,所以綜合考慮因素很多,學(xué)到后邊就會明白它的設(shè)計價值了,這里只要跟著去做就可以,后續(xù)章節(jié)會慢慢理解其中的價值。
        程序編好了,要對程序進(jìn)行編譯,生成可以下載到單片機(jī)里的文件,在編譯之前要勾選一個選項,Project-->Options for Target ‘Target1’...,或者直接點(diǎn)圖2-17中紅框內(nèi)的快捷圖標(biāo)。

                圖2-17  工程選項圖標(biāo)
        在彈出的對話框中,點(diǎn)擊Output選項頁,勾選其中的“Create HEX File”復(fù)選框,然后點(diǎn)OK,如圖2-18所示。

                圖2-18  創(chuàng)建HEX文件
        設(shè)置好以后,點(diǎn)擊“Project-->rebuild all target files”,或者點(diǎn)擊圖2-19中紅框內(nèi)的快捷圖標(biāo),就可以對程序進(jìn)行編譯了。

                  圖2-19  編譯程序
        編譯完成后,在Keil下方的Output窗口會出現(xiàn)相應(yīng)的提示,如圖2-20,這個窗口提供了編譯完成后的信息,data=9.0,xdata=0指的是本程序使用了單片機(jī)內(nèi)部的data區(qū)域RAM資源中的9個字節(jié),xdata區(qū)域的RAM使用為0,data和xdata是51單片機(jī)特定的內(nèi)存區(qū)域劃分,這兩部分都屬于51單片機(jī)的內(nèi)存;code=29的意思是使用了8K代碼Flash資源中的29個字節(jié)。當(dāng)提示“0 Error(s), 0 warning(s)”表示程序沒有錯誤和警告,就會出現(xiàn)“creating hex file from “LED”...,意思是從當(dāng)前工程生成了一個HEX文件,要下載到單片機(jī)的就是這個HEX文件。如果出現(xiàn)有錯誤和警告提示的話,Error和warning不是0,那么就要對程序進(jìn)行檢查,找出問題,解決好了再重新編譯產(chǎn)生HEX才可以。

              圖2-20  編譯輸出信息
        到此為止,程序就編譯好了,下邊就要把編譯好的程序文件下載到單片機(jī)里了。


2.5程序下載
        首先連接好硬件,把板子插到計算機(jī),打開設(shè)備管理器查看所使用的是哪個COM口,如圖2-21所示,找到“USB-SERIAL CH340(COM5)”這一項,這里最后的數(shù)字就是開發(fā)板目前所使用的COM端口號(如果更換USB口,這個COM端口號會發(fā)生變化)。

                 圖2-21  查看COM口
        STC系列單片的下載軟件——STC-ISP,如圖2-22所示。

             圖2-22  程序下載設(shè)置
        下載程序5個步驟:
第1步:芯片型號,選擇STC89C52RC系列下的STC89C52RC/LE52RC,一定不能選錯。
第2步:掃描串口,根據(jù)查到的COM口選擇,波特率使用默認(rèn)的就行。
第3步:點(diǎn)擊“打開程序文件”,找到剛才建立工程的lesson2文件夾,找到LED.hex文件,點(diǎn)擊打開。
第4步:這里的所有選項都使用默認(rèn)設(shè)置,不要隨便更改,有的選項改錯了以后可能會產(chǎn)生麻煩。
第5步:STC單片機(jī)要冷啟動下載,就是先點(diǎn)下載,然后再給單片機(jī)上電,所以先關(guān)閉板子上的電源開關(guān),然后點(diǎn)擊“Download/下載”按鈕后,軟件信息框就會出現(xiàn)“檢測目標(biāo)單片機(jī)”的信息,如圖2-23所示,再按下板子的電源開關(guān),就可以將程序下載到單片機(jī)里邊了。當(dāng)軟件顯示“操作成功”就表示程序下載成功了,如圖2-24所示。

            圖2-23  檢測目標(biāo)單片機(jī)信息

               圖2-24  程序下載完畢
        程序下載完畢后就會自動運(yùn)行,這次在板子上看到那一排LED中最右側(cè)的小燈已經(jīng)發(fā)光了。如果把LED = 0改成LED = 1,再重新編譯程序而后下載進(jìn)去新的HEX文件,燈就會熄滅。至此,點(diǎn)亮一個LED的實(shí)驗已經(jīng)完成,終于邁出了第一步,是不是還挺好玩的呢?


2.6練習(xí)題
1、了解普通發(fā)光二級管的參數(shù),掌握限流電阻的計算方法。
2、理解單片機(jī)最小系統(tǒng),單片機(jī)外圍電路,F(xiàn)lash,RAM和SFR等基本概念。
3、了解Keil的基本用法和單片機(jī)編程流程,能夠獨(dú)立完成編程下載等基本操作。


作者: changchieh    時間: 2026-3-17 08:51
這個很詳細(xì)。
作者: hhdsdy    時間: 2026-3-17 10:28
你這帖子,要是給那個海闊天空看了,又得堅持他的“手動編程”了
作者: dashenzhou    時間: 2026-3-20 20:44
這才是好帖子  點(diǎn)贊




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1