# 第八節:把.hex 機器碼程序燒錄到單片機的操作流程
## 【8.1 燒錄程序的本質】
“燒錄” 是比較專業的說法,很多初學者第一次聽這詞還以為跟火有關,莫名其妙的 “燒錄” 是啥意思?燒錄其實就是下載,燒錄程序就是下載程序。下載好理解了吧,下載電影,下載歌曲,讓播放器去播放。此處的下載程序跟下載歌曲的 “下載” 完全是一回事。有人會問,下載歌曲到手機,手機是成品,下載程序到單片機,單片機也是成品?新買回來的單片機不是一張白紙的電子元件嗎?其實,新買回來的單片機就是一個成品,它不是白紙,它內部已經嵌入了一段系統程序,這個系統程序就像你剛買回來的手機就幫你預裝了安卓系統一樣,只是它的用戶存儲區是空白的。比如手機,你往這個存儲區里存電影就可以看電影,存音樂就可以聽音樂。比如單片機,你往這個存儲區存不同的程序就可以讓單片機做不同的事。而預裝在新單片機內部的系統程序就是專門負責跟外部接口通訊,同時負責把 hex 格式的程序代碼存放在單片機內部正確的位置,這個就是燒錄程序 (下載程序) 的本質。這樣一比喻,所以.hex 格式的燒錄文件跟.MP3 格式的音樂文件在存儲本質上是一樣的。
再回顧總結一下,燒錄程序的本質是:把單片機當做一個存儲器,每一條程序指令都對應一個唯一的存儲地址,把這些指令以字節為單位一條條存儲到指定的存儲地址中,這就是燒錄程序的本質。對于 STC89C52RC 單片機,在下載程序時需要上位機軟件和一根 USB 轉串口線。上位機軟件負責把.hex 格式的機器碼文件打開,機器碼文件里面記錄著每條程序指令所對應的地址信息,下載過程時,上位機軟件根據.hex 文件記錄的指令內容和對應的地址信息,經過 USB 轉串口線,跟單片機的預置系統程序進行串口通訊,從而把.hex 記錄的信息傳輸到單片機內部的 flash 存儲器中,實現了程序的燒錄下載。
## 【8.2 燒錄程序所需的工具和軟件】
### (1)裝有 XP 或者 WIN7 系統的電腦一臺
其它更高系統的我還沒測試過,應該問題也不大。

圖 8.2.2 帶串口的單片機最小系統
### (2)帶 9 針串口、1 顆 LED 燈、電源撥動開關、能 5V 電源供電的 stc89c52rc 單片機核心板一塊
單片機的學習離不開硬件平臺的編程練習,本教程用的學習板原理圖已經分享到網上連載貼的附件資料里。大家也可以根據原理圖自己焊接一塊學習板來學習,或者用其它廠家帶有串口的單片機學習板來學習。
串口是用來單片機跟電腦通訊的接口,是 STC89C52RC 單片機下載程序的通道。LED 燈用來觀察單片機是否正常運行程序。電源撥動開關方便燒錄程序時提供所需的斷電和上電的操作。本單片機系統是 5V 供電。

圖 8.2.3 USB 轉串口線
### (3)主控芯片是 CH340 的 USB 轉 RS232 串口線一條
我之所以推薦主控芯片是 CH340 的 USB 轉 RS232 串口線,因為 CH340 的下載線在燒錄程序時很穩定可靠。這款 USB 轉串口線可以在淘寶購買到。

圖 8.2.4 USB 取電的電源線
### (4)5V 供電的 USB 電源線一條
此 USB 線可以從電腦的 USB 口取電,也可以從輸出 5V 的手機充電器處取電。但是我建議大家用輸出 5V 的手機充電器來供電,因為很多電腦的 USB 口供電干擾比較大,會影響程序燒錄。

圖 8.2.5 USB 轉串口的驅動安裝程序
### (5)主控芯片是 CH340 的 USB 轉 RS232 串口線驅動安裝程序
此驅動程序 USB 轉 RS232 串口線的廠家通常都會提供,但是建議用我在附件資料里推薦給大家的驅動程序,畢竟這個程序經過我本人驗證測試過。

圖 8.2.6 上位機軟件
### (6)燒錄程序和串口助手功能都具備的 “stc-isp-15xx-v6.85I” 上位機軟件
這是宏晶單片機官方免費提供的上位機軟件,可以在宏晶單片機的官網上下載獲取。這款軟件有很多功能,除了有下載程序和串口助手的功能外,還可以用來配置自動生成所需的初始化代碼。當然,本教程后面主要是用到此軟件的下載程序和串口助手這兩個功能。所以大家所選的軟件版本必須是 v6.85I 版本或者以上的版本,因為早些年有一些版本只有燒錄功能但是沒有串口助手的功能。
## 【8.3 把.hex 文件燒錄到單片機的操作流程】
前面第 6 節內容已經教大家把一個驅動 LED 燈閃爍的 C 源代碼編譯成.hex 文件的操作流程,同時在 D 盤的 “stc89c52rc” 文件夾里已經生成了一個 “stc89c52rc.hex” 的機器碼文件,現在就要教大家如何燒錄此文件到單片機內。此程序的功能是讓單片機驅動一顆 LED 燈閃爍。

圖 8.3.1.1 雙擊安裝 USB 轉串口驅動程序的啟動圖標

圖 8.3.1.2 安裝 USB 轉串口驅動程序

圖 8.3.1.3 驅動程序安裝成功
### 第一步:安裝 USB 轉串口驅動程序
上位機 “stc-isp-15xx-v6.85I” 燒錄軟件就是安裝在電腦端的用戶軟件,電腦跟單片機進行通訊,需要一根 USB 轉串口線,欲使 USB 轉串口線正常工作,必須預先安裝 USB 轉串口的驅動程序。具體的操作是這樣的:在本連載貼附件資料處下載 “USB 轉串口的驅動程序 CH340.zip” 文件壓縮包,解壓后打開此文件夾,找到 “SETUP.EXE” 這個安裝應用程序,雙擊啟動,在彈出的界面中,單擊 “安裝” 按鈕即可完成驅動程序的安裝。

圖 8.3.2.1 打開 WIND7 系統電腦的管理窗口

圖 8.3.2.2 打開設備管理器窗口

圖 8.3.2.3 查看 COM 口號

圖 8.3.2.4 記錄當前正用到的 COM 口號
### 第二步:硬件線路連接,同時記錄串口號
把 USB 轉串口線插入電腦 USB 口,此時 USB 轉串口線的另外一端連接 51 學習板的 9 針串口。同時,電源線一端用輸出的 5V 手機充電器 USB 端口供電,電源線另一端連接 51 學習板的 USB 供電端口,此時可以通過 51 學習板的電源撥動開關來控制斷電和上電。然后是查找串口號,方法是:以電腦 WIN7 系統為例,右擊桌面 “計算機”,單擊選擇下拉菜單的 “管理” 選項,在彈出的窗口中,點擊 “設備管理器” 選項切換到對應的設置窗口,雙擊 “端口(COM 和 LPT)” 選項,在展開的下拉選項中,會看到 “USB-SERTAL CH340 (COM3)”,這個 COM3 就是我們要記住的串口號,記住此串口號,后面的步驟要用到。你們的串口號不一定是 COM3,請以你們電腦顯示的串口號為準。
\---------------------------------- 步驟之間的分割線 ----------------------------------------

圖 8.3.3 雙擊打開上位機軟件
### 第三步:打開上位機用戶軟件 “stc-isp-15xx-v6.85I.exe”
這個軟件可以在宏晶單片機的官網下載獲取,獲取到的軟件壓縮包只需解壓后就可以使用,不用安裝,
直接雙擊打開 “stc-isp-15xx-v6.85I.exe”,此時會彈出 “溫馨提示” 的窗口,我們按 “確定” 就可以進入到真正的工作界面了。

圖 8.3.4 設置燒錄(下載)選項
### 第四步:選擇單片機型號
在 “單片機型號” 的下拉菜單中選擇 “STC89C/LE52RC” 這個型號。如果中途彈出推薦選用其它型號的窗口,可以忽略它,我們用來學習只要認準 “STC89C/LE52RC” 這個型號就可以了。
### 第五步:設置串口號
點擊 “串口號” 右側的選項,在 “串口號” 的下拉菜單中,選擇跟前面第二步所記錄一樣的串口號 COM3(你們的串口號不一定是 COM3,請根據你們的電腦實際顯示情況來選擇)。
### 第六步:設置最低波特率和最高波特率
“最低波特率” 設置為 2400,,“最高波特率” 設置為 9600。波特率如果設置太高,可能會導致燒錄(下載)不成功。
### 第七步:導入.hex 格式的機器碼文件
點擊 “打開程序文件” 的按鈕,在彈出的對話框中,選擇 D 盤下 “stc89c52rc” 文件夾目錄下的 “stc89c52rc.hex”,雙擊把 “stc89c52rc.hex” 導入到上位機用戶軟件。

圖 8.3.8 等待 51 學習板重新斷電再上電
### 第八步:啟動下載
點擊 “下載 / 編程” 的按鈕,發現 “正在檢測目標單片機..” 的提示信息,此時需要通過電源波動開關把 51 學習板重新斷電然后再上電才能正常下載,很多人也把這個重新上電的過程稱為 “冷啟動”。之所以要重新斷電再上電,是因為單片機內部預置的系統程序只在上電短暫的瞬間才會檢查一下是否接收到需要重新燒錄程序的指令,如果沒有接收到燒錄指令,單片機整個話語權就由原來的系統程序轉交給我們的用戶程序來接管,所以此串口后面的時間就給我們用戶程序來使用。因此每次燒錄程序時,先啟動上位機的下載命令,此時上位機不斷發送請求下載的命令給單片機,但是此時單片機并不理會這些指令,因為此時單片機的話語權已經交給了我們的用戶程序,此時并不是預置系統程序在掌控,所以除非重新斷電然后再上電那一瞬間才會讓系統內置程序去檢測并且響應此下載命令。另外多說一句,其實不是所有廠家的單片機在燒錄程序時都需要 “冷啟動”,也不是所有單片機都支持串口燒錄,各廠家的單片機燒錄程序方式會有一些差異,但基本原理是一樣的,大同小異。

圖 8.3.9 燒錄(下載)成功
### 第九步:“冷啟動” 后觀察是否操作成功的信息
執行完前面第九步的 “冷啟動” 后,如果發現有 “... 操作成功!” 的提示信息,就說明程序下載成功了。此時會發現 51 學習板上面的一顆 LED 燈不斷閃爍,是因為我們的 LED 燈程序驅動它才開始閃爍的,說明我們的程序在單片機上正常工作了。
補充說明:
* (1)以后只要每次重新編譯了 C 源代碼后,都會生成最新版本的.hex 格式文件,所以每次燒錄程序時,必須重新返回第七步,重新執行一次導入最新版本.hex 格式文件的操作,確保被燒錄的程序是最新版本的.hex 燒錄文件。
## 【8.4 51 學習板下載程序失敗時的解決辦法】
- (1)可以先松一下單片機卡座,稍微挪動一下單片機,然后再卡緊單片機。卡座必須卡緊單片機,避免接觸不良。
- (2)改變供電電源,很多電腦的 USB 口供電電源干擾非常大,嚴重影響下載程序,請把 USB 電源線插入到手機充電器 5V 的 USB 接口,效果顯著,明顯提高了下載的成功率。
- (3)檢查確保所選擇的單片機型號是 STC89C/LE52RC,如果軟件彈出推薦其它型號的單片機窗口,不用管它,我們就選 STC89C/LE52RC。
- (4)檢查 STC-ISP 燒寫軟件是否選擇匹配的 COM 口。
- (5)單片機是靠串口燒錄程序進去的,單片機的串口是 P3.0,P3.1 兩根線經過 232 轉換芯片,然后才與 USB 轉串口線連接的。因此,在燒錄程序時,請確保 P3.0,P3.1 兩個 IO 口不能跳線連接到其它外圍元器件上。
- (6)點擊 “下載 / 編程” 后,記得再斷電并且重新上電一次。看看是否燒錄成功。
- (7)確保最低波特率一直設置為 2400,最高波特率為 9600。如果還不行再把最高波特率也改成 2400 試試。
- (8)如果還不行,就退出軟件,拔掉 USB 轉串口線,同時斷電(必須把整根電源線拔出!),重新插入 USB 串口線,重新插入電源線開電,重新打開軟件。
- (9)如果還不行,學習板先斷電(必須把整根電源線拔出!),然后重啟一次電腦。
- (10)總之:如果還不行,就按上述步驟多折騰幾次。
- (11)最后實在不行,就嘗試更換到其它 USB 口,或者嘗試更換到其它電腦上試試。
- 首頁
- 第一節:我的價值觀
- 第二節:初學者的疑惑
- 第三節:單片機最重要的一個特性
- 第四節:平臺軟件和編譯器軟件的簡介
- 第五節:用Keil2軟件關閉,新建,打開一個工程的操作流程
- 第六節:把.c源代碼編譯成.hex機器碼的操作流程
- 第七節:本節預留
- 第八節:把.hex機器碼程序燒錄到單片機的操作流程
- 第九節:本節預留
- 第十節:程序從哪里開始,要到哪里去?
- 第十一節:一個在單片機上練習C語言的模板程序
- 第十二節:變量的定義和賦值
- 【TODO】第十三節:賦值語句的覆蓋性
- 【TODO】第十四節:二進制與字節單位,以及常用三種變量的取值范圍
- 【TODO】第十五節:二進制與十六進制
- 【TODO】第十六節:十進制與十六進制
- 【TODO】第十七節:加法運算的5種常用組合
- 【TODO】第十八節:連加、自加、自加簡寫、自加1
- 【TODO】第十九節:加法運算的溢出
- 【TODO】第二十節:隱藏中間變量為何物?
- 【TODO】第二十一節:減法運算的5種常用組合。
- 【TODO】第二十二節:連減、自減、自減簡寫、自減1
- 【TODO】第二十三節:減法溢出與假想借位
- 【TODO】第二十四節:借用unsigned long類型的中間變量可以減少溢出現象
- 【TODO】第二十五節:乘法運算中的5種常用組合
- 【TODO】第二十六節:連乘、自乘、自乘簡寫,溢出
- 【TODO】第二十七節:整除求商
- 【TODO】第二十八節:整除求余
- 【TODO】第二十九節:“先余后商”和“先商后余”提取數據某位,哪家強?
- 【TODO】第三十節:邏輯運算符的“與”運算
- 【TODO】第三十一節:邏輯運算符的“或”運算
- 【TODO】第三十二節:邏輯運算符的“異或”運算
- 【TODO】第三十三節:邏輯運算符的“按位取反”和“非”運算
- 【TODO】第三十四節:移位運算的左移
- 【TODO】第三十五節:移位運算的右移
- 【TODO】第三十六節:括號的強制功能---改變運算優先級
- 【TODO】第三十七節:單字節變量賦值給多字節變量的疑惑
- 【TODO】第三十八節:第二種解決“運算過程中意外溢出”的便捷方法
- 【TODO】第三十九節:if判斷語句以及常量變量的真假判斷
- 【TODO】第四十節:關系符的等于“==”和不等于“!=”
- 【TODO】第四十一節:關系符的大于“>”和大于等于“>=”
- 【TODO】第四十二節:關系符的小于“<”和小于等于“<=”
- 【TODO】第四十三節:關系符中的關系符:與“&&”,或“||”
- 【TODO】第四十四節:小括號改變判斷優先級
- 【TODO】第四十五節: 組合判斷if...else if...else
- 【TODO】第四十六節: 一維數組
- 【TODO】第四十七節: 二維數組
- 【TODO】第四十八節: while循環語句
- 【TODO】第四十九節: 循環語句do while和for
- 【TODO】第五十節: 循環體內的continue和break語句
- 【TODO】第五十一節: for和while的循環嵌套
- 【TODO】第五十二節: 支撐程序框架的switch語句
- 【TODO】第五十三節: 使用函數的三要素和執行順序
- 【TODO】第五十四節: 從全局變量和局部變量中感悟“棧”為何物
- 【TODO】第五十五節: 函數的作用和四種常見書寫類型
- 【TODO】第五十六節: return在函數中的作用以及四個容易被忽略的功能
- 【TODO】第五十七節: static的重要作用
- 【TODO】第五十八節: const(./book/或code)在定義數據時的作用
- 【TODO】第五十九節: 全局“一鍵替換”功能的#define
- 【TODO】第六十節: 指針在變量(./book/或常量)中的基礎知識
- 【TODO】第六十一節: 指針的中轉站作用,地址自加法,地址偏移法
- 【TODO】第六十二節: 指針,大小端,化整為零,化零為整
- 【TODO】第六十三節: 指針“化整為零”和“化零為整”的“靈活”應用
- 【TODO】第六十四節: 指針讓函數具備了多個相當于return的輸出口
- 【TODO】第六十五節: 指針作為數組在函數中的入口作用
- 【TODO】第六十六節: 指針作為數組在函數中的出口作用
- 【TODO】第六十七節: 指針作為數組在函數中既“入口”又“出口”的作用
- 【TODO】第六十八節: 為函數接口指針“定向”的const關鍵詞
- 【TODO】第六十九節: 宏函數sizeof(./book/)
- 【TODO】第七十節: “萬能數組”的結構體
- 【TODO】第七十一節: 結構體的內存和賦值
- 【TODO】第七十二節: 結構體的指針
- 【TODO】第七十三節: 結構體數據的傳輸存儲和還原
- 【TODO】第七十四節: 結構體指針在函數接口處的頻繁應用
- 【TODO】第七十五節: 指針的名義(例:一維指針操作二維數組)
- 【TODO】第七十六節: 二維數組的指針
- 【TODO】第七十七節: 指針唯一的“單向輸出”通道return
- 【TODO】第七十八節: typedef和#define和enum
- 【TODO】第七十九節: 各種變量常量的命名規范
- 【TODO】第八十節: 單片機IO口驅動LED
- 【TODO】第八十一節: 時間和速度的起源(指令周期和晶振頻率)
- 【TODO】第八十二節: Delay“阻塞”延時控制LED閃爍
- 【TODO】第八十三節: 累計主循環的“非阻塞”延時控制LED閃爍
- 【TODO】第八十四節: 中斷與中斷函數
- 【TODO】第八十五節: 定時中斷的寄存器配置
- 【TODO】第八十六節: 定時中斷的“非阻塞”延時控制LED閃爍
- 【TODO】第八十七節: 一個定時中斷產生N個軟件定時器
- 【TODO】第八十八節: 兩大核心框架理論(四區一線,switch外加定時中斷)
- 【TODO】第八十九節: 跑馬燈的三種境界
- 【TODO】第九十節: 多任務并行處理兩路跑馬燈
- 【TODO】第九十一節: 蜂鳴器的“非阻塞”驅動
- 【TODO】第九十二節: 獨立按鍵的四大要素(自鎖,消抖,非阻塞,清零式濾波)
- 【TODO】第九十三節: 獨立按鍵鼠標式的單擊與雙擊
- 【TODO】第九十四節: 兩個獨立按鍵構成的組合按鍵
- 【TODO】第九十五節: 兩個獨立按鍵的“電腦鍵盤式”組合按鍵
- 【TODO】第九十六節: 獨立按鍵“一鍵兩用”的短按與長按
- 【TODO】第九十七節: 獨立按鍵按住不松手的連續均勻觸發
- 【TODO】第九十八節: 獨立按鍵按住不松手的“先加速后勻速”的觸發
- 【TODO】第九十九節: “行列掃描式”矩陣按鍵的單個觸發(原始版)
- 【TODO】第一百節: “行列掃描式”矩陣按鍵的單個觸發(優化版)
- 【TODO】第一百零一節: 矩陣按鍵鼠標式的單擊與雙擊
- 【TODO】第一百零二節: 兩個“任意行輸入”矩陣按鍵的“有序”組合觸發
- 【TODO】第一百零三節: 兩個“任意行輸入”矩陣按鍵的“無序”組合觸發
- 【TODO】第一百零四節: 矩陣按鍵“一鍵兩用”的短按與長按
- 【TODO】第一百零五節: 矩陣按鍵按住不松手的連續均勻觸發
- 【TODO】第一百零六節: 矩陣按鍵按住不松手的“先加速后勻速”觸發
- 【TODO】第一百零七節: 開關感應器的識別與軟件濾波
- 【TODO】第一百零八節: 按鍵控制跑馬燈的啟動和暫停和停止
- 【TODO】第一百零九節: 按鍵控制跑馬燈的方向
- 【TODO】第一百一十節: 按鍵控制跑馬燈的速度
- 第一百一十一節: 工業自動化設備的開關信號的運動控制
- 【TODO】第一百一十二節: 數碼管顯示的基礎知識
- 【TODO】第一百一十三節: 動態掃描的數碼管顯示數字
- 【TODO】第一百一十四節: 動態掃描的數碼管顯示小數點
- 【TODO】第一百一十五節: 按鍵控制數碼管的秒表
- 【TODO】第一百一十六節: 按鍵控制數碼管的倒計時
- 【TODO】第一百一十七節: 按鍵切換數碼管窗口來設置參數
- 【TODO】第一百一十八節: 按鍵讓某位數碼管閃爍跳動來設置參數
- 【TODO】第一百一十九節: 一個完整的人機界面的程序框架的脈絡
- 【TODO】第一百二十節: 按鍵切換窗口切換局部來設置參數
- 【TODO】第一百二十一節: 可調參數的數碼管倒計時
- 【TODO】第一百二十二節: 利用定時中斷做的“時分秒”數顯時鐘
- 【TODO】第一百二十三節: 一種能省去一個lock自鎖變量的按鍵驅動程序
- 【TODO】第一百二十四節: 數顯儀表盤顯示“速度、方向、計數器”的跑馬燈
- 【TODO】第一百二十五節: “雙線”的肢體接觸通信
- 【TODO】第一百二十六節: “單線”的肢體接觸通信
- 【TODO】第一百二十七節: 單片機串口接收數據的機制
- 【TODO】第一百二十八節: 接收“固定協議”的串口程序框架
- 【TODO】第一百二十九節: 接收帶“動態密匙”與“累加和”校驗數據的串口程序框架
- 【TODO】第一百三十節: 接收帶“動態密匙”與“異或”校驗數據的串口程序框架
- 【TODO】第一百三十一節: 靈活切換各種不同大小“接收內存”的串口程序框架
- 【TODO】第一百三十二節:“轉發、透傳、多種協議并存”的雙緩存串口程序框架
- 【TODO】第一百三十三節:常用的三種串口發送函數
- 【TODO】第一百三十四節:“應用層半雙工”雙機串口通訊的程序框架