本書以MCS-51系列單片機原理和應用開發為主線,分為基礎篇和開發篇基礎篇采用匯編語言,重點介紹單片機的結構、指令系統、程序設計、內部標準功能單元、系統擴展等內容,并精心設計了大量例題和多種解題思路,突出教學重點、敘述準確精煉,完全可以滿足教師課堂教學和學生課程學習需要。開發篇采用C語言,重點闡述單片機應用系統的開發方法,對應用系統設計、開發、調試方法以及開發工具的使用都進行了深入的討論,并給出大量應用實例,強調初學者通過C語言快速上手、由淺入深。基礎篇和開發篇既獨立成篇,又相互關聯。全書結構規范、系統性強、實例豐富,注重邏輯思維的培養,突出工程實踐和實際應用,可以滿足應用型人才培養的要求,也可以滿足大學生電子競賽訓練需要。
一、學習單片機的意義
傳統的電子系統所完成的一切功能都是通過布線邏輯控制(Wired Logic Control)實現的,增加功能或者改進性能,必須修改或者重新設計硬件電路,否則,別無辦法。而現代電子系統完成的許多功能是利用單片機通過存儲程序控制(Stored Program Control)實現的,也就是控制功能是通過計算機執行預先存儲在存儲器中的程序來實現的。如果想要給系統增加功能或者改進性能,只需要改寫程序(即軟件)即可輕而易舉地達到目的,非常靈活。若將傳統電子系統當作一個僵死的電子系統,那么智能化的現代電子系統則是一個具有生命的電子系統。單片機應用系統的硬件結構給予電子系統“身軀”,單片機應用系統的應用程序賦予其“靈魂”。電子系統的智能化程度是無止境的,常常不需硬件資源的增添就能實現各種功能更新和增添,這也是當前許多電子設備的功能大量增強和不斷擴展的重要因素。
單片機是一種面向控制的大規模集成電路芯片,具有體積小、性價比高、功能強、性能穩定、控制靈活等優點,已成為電子系統中最重要的智能化核心部件,是微型計算機的一個重要分支。目前,單片機技術在通信、電子信息、工業檢測控制、機電一體化、電力電子、智能儀器儀表、汽車電子等領域得到了廣泛的應用。其中MCS-51系列單片機以其特有的簡單、易學、易用和高性價比的優勢,占有單片機市場的大部分份額,是初學者學習單片機的首選機型。為了幫助大中專學生和科技人員盡快掌握單片機的基本知識和應用開發方法,在理論方面打好基礎,在應用方面快速上手,特編寫本書作為教材和開發工具書。
二、本書的結構和特點
如何學習單片機的基礎知識和掌握單片機的開發技能,是困擾初學者的一個問題,通過編著者多年的教學實踐和在學生中大量的實際調研,可以得出單片機學習的兩個方面的需求:①課堂上“正規的”教學需求和學習需求;②課外的“快速入門”的開發實踐需求,而這兩方面的需求有時又是重疊的。為此本書在結構上分成上下兩篇,上篇是“基礎篇”,下篇是“開發篇”,可以同時滿足上述兩個方面的需求。
基礎篇以課堂教學和課堂學習為主線,以匯編語言為主。力圖解決困擾大多數學生的單片機學習問題,諸如:基本概念理解困難;沒有編程思路;很難建立中斷的概念;不了解單片機軟硬件之間的關系等。從精簡內容、重點講解、加強邏輯思維能力訓練入手,注重以下幾個方面:
1.內容精煉、重點突出。本書縮減了一些次要內容,同時又增加了串行總線的內容,緊跟時代發展的潮流。在內容組織上,突出學習重點,關鍵內容和知識點在字體上都做了加黑處理,使得學生在學習過程中更好地抓住重點。在指令的運用上,突出常用指令(在附錄中加了“*”),而且所有的例題均限定在這些指令內。
2.強調編程思想和邏輯思維的訓練。通過多年教學經驗總結,可以說較大一部分學生缺乏分析問題能力和邏輯思維能力,需要加強這方面的訓練,本書以這一點作為切入點,重點展開。針對本門課程實踐性強的特點,對書中例題進行了精心設計,并突出例題的多角度講解,不同思路下的解題(編程)方法。
3.提供形象的知識點描述。本書在基礎篇每一章的后面都附有圖形化的知識結構,生動地描述了知識點及其相互關系,便于學生綜合復習。
4.提供強大的輔助學習手段。編著者針對單片機課程的所有知識點(特別是書中例題的解題思路和程序執行過程)開發了卡通形式的“配音動畫”,特別有助于學生理解程序的執行過程,從而提高編程能力。
開發篇注重課外實踐,以C語言為主。努力解決“動手能力”,淡化基本概念和內部原理,可以讓初學者在缺乏其他基礎知識支持的情況下,“快速入門”,馬上就可以進入“開發狀態”。其特點是:
1. 便于自學和快速培養初步開發能力。在開發篇的有關章節,介紹了Keil μvision集成開發環境、實用的程序調式方法、C語言基礎知識和單片機學習板功能模塊,提供了循序漸進的學習內容和C語言編程思路。
2. 與練手緊密結合。本書有關單片機學習板的內容與市場上銷售的MD-100學習板及其電子套件緊密結合,系統地設計了學習板的功能模塊,并針對不同模塊給出相應的編程任務,從易到難,便于學生獨立練習,解決了學生不知道用學習板如何練習的問題。同時也在本書配套的學習材料中給出了這些任務的源代碼,以便對照和提高。
3. 與大學生電子類競賽緊密結合。本書的部分實例是電子競賽的常規題目,如循跡小車、超聲測距、無線通信等,獨立成章,其中給出了設計要求、設計思想、電路圖、程序流程圖等,另外在隨書學習材料中附有程序的源代碼。可以作為大學生課外實踐和電子競賽的指導工具書。
4. 配套資料齊全、新穎。本書所涉及的例程和任務,均提供電子版的源程序,并且這些程序經過實際檢驗,保證準確性。還有一些擴展閱讀內容,用以提高讀者的開發能力,也提供電子文檔。
我們所提供的“配音動畫”不是課堂教學的錄像,而是根據單片機課堂教學要求和課外實踐需要總結出來的“知識點”和“例題”,按照編程的多種思路和程序的運行過程制作而成。具有“卡通”特色,直觀而形象,并且利用一個學習軟件的導航樹把這些孤立的知識點和動畫貫穿起來,和本書內容緊密關聯。“配音動畫”的內容比本書的內容更為廣泛,讀者可以從中學習更多的知識。
三、學習路徑
本書前5章的內容重點參考和選取了《單片機原理及應用》(李桂林、馬馳、王新屏、張春光,電子工業出版社,2013年)的許多內容,在此特別向原作者表示感謝。劉寧春、周雪峰收集了部分實例并做了相關的文字工作,并在動畫制作方面提出很好的建議,在此表示感謝,還要特別感謝電子工業出版社竺南直對本書編寫所提出的寶貴意見,同時對本書所用參考文獻的作者表示誠摯的謝意。
按照編寫目標,編者進行了許多思考和努力。由于編者水平有限,難免書中有錯漏和不妥之處,懇請讀者批評指正,以便不斷改進。聯系信箱modulation@sina.com。
與本書相關的配套資料,包括基于交互式動畫的學習平臺試用版、匯編語言和C語言源程序、講課用的PPT、習題答案、擴展知識以及單片機學習板(型號:明達MD-100)等,可以從www.mcs-51.com下載。手機App應用,可以掃描封底或本頁的二維碼。
李桂林,1988年研究生畢業于西安電子科技大學通信與電子系統專業,1988--2001,東北電力大學任教;2001―,大連交通大學任教,從事單片機原理與應用、通信原理等教學和科研工作,承擔大連市科技計劃項目“科技企業孵化器試點城市建設”和“3D虛擬孵化器及綜合信息網上系統”等;出版有“單片機原理及應用”教材(2012年,電子社)。
基 礎 篇
第1章 單片機基礎知識 2
1.1 單片機概述 2
1.1.1 單片機的組成 2
1.1.2 單片機的特點 3
1.1.3 單片機系統 4
1.1.4 單片機的程序設計語言 4
1.2 單片機的歷史和發展 5
1.2.1 單片機的發展歷史 5
1.2.2 單片機的發展趨勢 6
1.3 典型單片機簡介 7
1.3.1 MCS-51系列單片機 7
1.3.2 AT89系列單片機 8
1.3.3 PIC系列單片機 9
1.3.4 MSP430系列單片機 9
1.4 單片機的應用 10
1.4.1 單片機的應用特點 10
1.4.2 單片機的應用領域 11
知識結構圖 12
思考與練習 13
第2章 單片機基本結構和工作原理 14
2.1 單片機的組成和內部結構 14
2.1.1 單片機的組成 14
2.1.2 單片機的內部邏輯結構 15
2.1.3 CPU的內部結構 15
2.1.4 單片機其他結構模塊 17
2.2 單片機的外部引腳及功能 18
2.2.1 I/O端口 19
2.2.2 控制引腳 19
2.2.3 電源與晶振引腳 19
2.3 單片機的存儲器結構 19
2.3.1 程序存儲器 20
2.3.2 數據存儲器 21
2.3.3 特殊功能寄存器 23
2.4 單片機的I/O電路 26
2.4.1 P0口 26
2.4.2 P1口 27
2.4.3 P2口 28
2.4.4 P3口 29
2.5 單片機的輔助電路 30
2.5.1 時鐘電路 30
2.5.2 復位方式和復位電路 31
2.5.3 單片機最小系統 33
2.6 單片機的工作時序和工作方式 34
2.6.1 時序的基本概念 34
2.6.2 單片機的工作時序 35
2.6.3 單片機的工作方式 36
知識結構圖 38
思考與練習 39
第3章 指令系統和匯編程序設計 40
3.1 指令系統概述 40
3.1.1 指令的表達形式 40
3.1.2 指令中的常用符號 41
3.2 單片機的尋址方式 42
3.2.1 立即尋址 43
3.2.2 直接尋址 43
3.2.3 寄存器尋址 44
3.2.4 寄存器間接尋址 45
3.2.5 變址尋址 46
3.2.6 相對尋址 47
3.2.7 位尋址 48
3.3 單片機的指令系統 49
3.3.1 數據傳送類指令 49
3.3.2 算術運算類指令 55
3.3.3 邏輯運算類指令 59
3.3.4 控制轉移類指令 63
3.3.5 位操作類指令 66
3.4 匯編語言程序的設計基礎 69
3.4.1 匯編語言的語句格式 70
3.4.2 偽指令 70
3.4.3 匯編語言程序結構 72
3.4.4 匯編語言的編輯和匯編 73
3.4.5 匯編語言程序設計方法 73
3.5 匯編語言程序的基本結構形式 74
3.5.1 順序程序 75
3.5.2 分支程序 76
3.5.3 循環程序 80
3.5.4 子程序 84
3.6 常用程序設計舉例 85
3.6.1 數制轉換子程序 85
3.6.2 定時子程序 88
3.6.3 均值濾波子程序 88
3.6.4 數據極值查找子程序 90
3.6.5 算術運算子程序 91
知識結構圖 94
思考與練習 95
第4章 單片機內部標準功能單元 98
4.1 單片機的中斷系統 98
4.1.1 中斷系統的基本概念和基本結構 98
4.1.2 中斷系統的控制與實現 100
4.1.3 中斷系統的處理過程 104
4.1.4 中斷系統的應用 108
4.2 單片機的定時器/計數器 113
4.2.1 定時器/計數器的基本結構和工作原理 113
4.2.2 定時器/計數器的控制與狀態 115
4.2.3 定時器/計數器的工作方式 116
4.2.4 定時器/計數器初值計算和初始化 119
4.2.5 定時器/計數器的應用 119
4.3 單片機的串行通信接口 128
4.3.1 串行通信基礎知識 128
4.3.2 串行口的內部結構和工作原理 130
4.3.3 串行口的控制與狀態 132
4.3.4 串行口的工作方式 133
4.3.5 串行口波特率的確定和初始化 135
4.3.6 串行口的應用 136
4.3.7 單片機與PC機之間的通信 142
知識結構圖 149
思考與練習 150
第5章 單片機外部擴展技術 151
5.1 并行總線擴展及編址 151
5.1.1 單片機外總線的結構 151
5.1.2 單片機外總線的擴展規則 153
5.1.3 常用擴展器件 153
5.1.4 地址譯碼方法 157
5.2 存儲器及其擴展 160
5.2.1 半導體存儲器簡介 160
5.2.2 EPROM程序存儲器的擴展 162
5.2.3 E2PROM程序存儲器的擴展 164
5.2.4 數據存儲器及其擴展 164
5.3 人機交互接口及其擴展 169
5.3.1 鍵盤接口 169
5.3.2 LED顯示接口 177
5.4 并行I/O端口擴展及應用 183
5.4.1 簡單I/O擴展 183
5.4.2 接口芯片8155及擴展 185
5.4.3 I/O接口芯片8255及擴展 191
5.5 模擬量I/O通道擴展及應用 196
5.5.1 A/D轉換器基本知識 196
5.5.2 A/D轉換接口芯片ADC0809 197
5.5.3 D/A轉換器基本知識 202
5.5.4 D/A轉換接口芯片DAC0832 204
知識結構圖 208
思考與練習 209
第6章 單片機串行總線擴展技術 211
6.1 串行總線概述 211
6.2 單總線接口及其擴展 211
6.2.1 單總線基礎知識 211
6.2.2 單總線的數據傳輸時序 213
6.2.3 數字溫度傳感器DS18B20 214
6.3 I2C總線接口及其擴展 220
6.3.1 I2C總線基礎知識 220
6.3.2 I2C總線的數據傳輸時序 221
6.3.3 I2C總線的時序模擬 223
6.3.4 串行程序存儲器AT24C04 224
6.4 SPI總線接口及其擴展 230
6.4.1 SPI總線基礎知識 230
6.4.2 SPI總線的數據傳輸時序 231
6.4.3 E2PROM芯片X25045 232
6.4.4 A/D轉換器芯片TLC549 237
知識結構圖 239
思考與練習 240
開 發 篇
第7章 快速開發入門知識 242
7.1 單片機應用系統開發技術 242
7.1.1 單片機應用系統的開發過程 242
7.1.2 單片機開發工具 244
7.2 Keil集成開發平臺 247
7.2.1 創建一個應用程序 248
7.2.2 應用程序的編輯、編譯和鏈接 252
7.2.3 應用程序的仿真和調試 253
7.2.4 應用程序調試的常用窗口 256
7.2.5 調試實例 258
思考與練習 262
第8章 單片機C51程序設計基礎 263
8.1 C51的概述 263
8.1.1 C51程序結構概述 263
8.1.2 C51對標準C的擴展 264
8.2 C51的編譯和編譯預處理 265
8.2.1 編譯 265
8.2.2 編譯預處理 266
8.3 C51的基本語法 267
8.3.1 常量 267
8.3.2 變量 268
8.3.3 常用運算符與表達式 273
8.4 C51的程序結構 275
8.4.1 分支語句 275
8.4.2 循環語句 277
8.5 C51的函數 280
8.5.1 函數的定義和分類 280
8.5.2 函數的調用 281
8.6 C51的庫函數 283
8.6.1 字符函數CTYPE.H 283
8.6.2 內部函數INTRINS.H 284
8.6.3 標準輸入/輸出函數STDIO.H 285
8.6.4 標準函數STDLIB.H 285
8.6.5 字符串處理函數STRING.H 286
8.6.6 絕對地址訪問函數ABSACC.H 286
8.6.7 專用寄存器REGxx.H 287
8.7 C51的數組 287
8.7.1 數組的定義 287
8.7.2 數組的應用 288
8.8 C51的指針 289
8.8.1 指針與地址 289
8.8.2 指針的定義 290
8.8.3 指針的引用 291
8.9 C51編程舉例 291
8.9.1 讀寫I/O端口的C51編程 292
8.9.2 中斷系統的C51編程 292
8.9.3 定時器/計數器的C51編程 293
8.9.4 串行接口通信的C51編程 295
8.9.5 I2C總線的C51編程 298
思考與練習 302
第9章 單片機學習板及功能模塊 304
9.1 單片機學習板的用途和特點 304
9.2 單片機學習板的整體設計 305
9.3 STC-ISP燒錄軟件的使用方法 306
9.4 單片機學習板的功能模塊 307
9.4.1 流水燈控制單元 307
9.4.2 數碼管顯示單元 309
9.4.3 蜂鳴器單元 310
9.4.4 獨立按鍵單元 312
9.4.5 矩陣鍵盤單元 313
9.4.6 液晶顯示單元 315
9.4.7 I2C總線單元 320
9.4.8 A/D和D/A單元 320
9.4.9 溫度測量單元 325
9.4.10 串口通信單元 326
第10章 電子萬年歷設計 328
10.1 功能要求 328
10.2 總體設計 328
10.2.1 時間的獲取方法 328
10.2.2 電子萬年歷的設計說明 329
10.3 硬件電路設計 329
10.4 軟件設計 330
10.4.1 延時程序 330
10.4.2 液晶初始化及顯示程序 331
10.4.3 定時器中斷初始化和工作程序 334
10.4.4 鍵盤設置程序 337
10.4.5 鬧鐘設置與啟動程序 342
第11章 超聲波測距儀設計 345
11.1 功能要求 345
11.2 總體設計 345
11.2.1 超聲波簡介 345
11.2.2 超聲波測距原理 345
11.3 硬件電路設計 346
11.3.1 HC-SR04超聲波模塊電路 346
11.3.2 電源電路 348
11.4 軟件設計 349
11.4.1 超聲波發送程序和超聲波接收中斷程序 349
11.4.2 距離計算程序 350
11.4.3 LCD1602液晶顯示程序 351
第12章 智能循跡小車設計 354
12.1 功能要求 354
12.2 總體設計 354
12.3 硬件電路設計 355
12.3.1 紅外檢測模塊電路 356
12.3.2 穩壓電源電路 357
12.3.3 電機驅動電路 357
12.4 軟件設計 359
12.4.1 各端口及變量定義 359
12.4.2 相關子函數定義 359
12.4.3 循跡小車主函數 362
第13章 數據采集和無線傳輸系統設計 364
13.1 功能要求 364
13.2 總體設計 364
13.3 硬件電路設計 365
13.3.1 nRF24L01無線收發模塊單元 366
13.3.2 A/D轉換單元 368
13.4 軟件設計 368
13.4.1 相關參數定義 368
13.4.2 相關函數設計 370
13.4.3 數據采集及無線傳輸系統主函數 373
附錄A ASCII表 375
附錄B MCS-51指令表 378
附錄C 學習板電路圖 381
參考文獻 382