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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 417|回復: 3
打印 上一主題 下一主題
收起左側

第2章  點亮你的LED 2.4  2.5  2.6

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

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

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

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

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

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

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

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

                  圖2-13  新建文件

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

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

               圖2-16  添加文件(二)

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

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

void main()            //任何一個C程序都必須有且僅有一個main函數
{                        //{}是成對存在的,在這里表示函數的起始和結束
    LED = 0;            //分號表示一條語句結束
}
         先從程序語法上來分析一下。
1、main是主函數的函數名字,每一個C程序都必須有且僅有一個main函數。
2、void是函數的返回值類型,本程序沒有返回值,用void表示。
3、{}在這里是函數開始和結束的標志,不可省略。
4、每條C語言語句以;結束的。
        邏輯上來看,程序這樣寫就可以了,但是在單片機實際應用中存在一個問題。比如程序空間可以容納100行代碼,但是實際的程序只用了50行代碼,當運行完了50行,再繼續運行時,第51行的程序不是用戶的程序,而是不確定的未知內容,一旦執行下去程序就會出錯從而可能導致單片機自動復位,所以通常在程序中加入一個死循環,讓程序停留在所希望的這個狀態下,不要亂運行,有以下兩種寫法可以參考:
參考程序一:                   參考程序二:
#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;               }
    }
}
        程序一的功能是程序在反復不斷的無限次執行LED = 0;這條語句,而程序二的功能是執行一次,然后程序直接停留下來等待,相對程序一來說程序二更加簡潔一些。針對于圖2-6,這個程序能夠把小燈點亮,但是這個程序卻點不亮Kingst51開發板上的小燈,這是為什么呢?
        這里就要培養一個意識,單片機編程實際上算是硬件底層驅動程序開發,這種程序的開發是離不開電路圖的,必須根據電路圖來進行程序的編寫。如果電路板的電路圖和圖2-6一樣的話,程序可以成功點亮小燈,但是如果不一樣,就可能點不亮。
        開發板上還有一個74HC138作為8個LED小燈的總開關,而P0.0僅僅是個分開關。如同家里有一個供電總閘,然后每個電燈又有一個專門的分支開關。剛才的程序僅僅打開了那個電燈的分支開關,但是沒有打開那個總電閘。所以程序需要加上這部分代碼。因為這節課要介紹的內容比較多,所以74HC138的原理以及為什么要加額外的代碼在下節課統一介紹,這節課直接加上這部分代碼做一下功能演示。
#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;        //點亮小燈
    while (1);      //程序停止在這里
}
        為什么有的書上程序很簡單就可以點亮小燈,這里卻要麻煩一些呢?Kingst51開發板雖然僅僅提供給大家簡單學習使用,但是也是按照實際產品的開發模式去設計,所以綜合考慮因素很多,學到后邊就會明白它的設計價值了,這里只要跟著去做就可以,后續章節會慢慢理解其中的價值。
        程序編好了,要對程序進行編譯,生成可以下載到單片機里的文件,在編譯之前要勾選一個選項,Project-->Options for Target ‘Target1’...,或者直接點圖2-17中紅框內的快捷圖標。

                圖2-17  工程選項圖標
        在彈出的對話框中,點擊Output選項頁,勾選其中的“Create HEX File”復選框,然后點OK,如圖2-18所示。

                圖2-18  創建HEX文件
        設置好以后,點擊“Project-->rebuild all target files”,或者點擊圖2-19中紅框內的快捷圖標,就可以對程序進行編譯了。

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

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


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

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

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

            圖2-23  檢測目標單片機信息

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


2.6練習題
1、了解普通發光二級管的參數,掌握限流電阻的計算方法。
2、理解單片機最小系統,單片機外圍電路,Flash,RAM和SFR等基本概念。
3、了解Keil的基本用法和單片機編程流程,能夠獨立完成編程下載等基本操作。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1107340 發表于 2026-3-17 08:51 | 只看該作者
這個很詳細。
回復

使用道具 舉報

板凳
ID:88256 發表于 2026-3-17 10:28 | 只看該作者
你這帖子,要是給那個海闊天空看了,又得堅持他的“手動編程”了
回復

使用道具 舉報

地板
ID:1166868 發表于 2026-3-20 20:44 | 只看該作者
這才是好帖子  點贊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表