本書以項目為導向,將C51語言的知識、編程技能技巧和單片機基本原理融入任務中, 項目軟件方面包括C51的基本語法、語句及結構、數據及其類型、函數、數組、指針;Keil、PROTEUS軟件應用、代碼調試、串口助手數據監測等;程序設計對象涵蓋單片機I/O端口應用、中斷、定時/計數器原理及應用、動態掃描、LCD及點陣、鍵盤接口技術、A/D、D/A、串行通信應用等。強調編程規范、算法及模塊化設計,書中的程序都已經通過仿真與開發板驗證,保證正確性。多個程序模塊可直接移植到其他項目開發中,項目實用,上手快,與實際接軌,即學即用。
本書可作為各類大專院校、高職高專院校和各類培訓用C51程序設計教學用書,也可作為程序發燒友的自學用書。通過這些項目任務的學習,讀者可以輕松掌握單片機C51程序設計的基本方法和技能。
周靈彬,副教授。自2002年中北大學碩士研究生畢業后一直從事應用電子技術專業的教學工作。主要講授單片機、程序設計、電路分析、電路PCB設計等課程并指導相關實訓課程。主編《基于PROTEUS的電路與PCB設計》,參編《單片機原理、應用與PROTEUS仿真》《單片機系統的PROTEUS設計與仿真》,其中原理一書獲電子學會全國優秀教材二等獎。曾主持獲得浙江省教學成果二等獎,指導學生競賽獲省一等獎。
項目1 認識編程載體――單片機和編程開發環境 1
1.1 單片機的應用及主要類型 1
1.2 單片機外形與框架 3
1.2.1 內部結構框圖和主要部件 3
1.2.2 引腳:數據輸入/輸出通道 4
1.3 C51語言及其開發環境簡介 5
1.3.1 C語言的歷史及特點 5
1.3.2 C51的Keil ?Vision3開發環境簡介 6
1.4 任務1:Keil C應用入門――單片機輸出“Hello C51” 6
1.4.1 建立工程、設計程序、編譯 6
1.4.2 Keil的初步調試:查看串口輸出“Hello C51” 11
1.5 任務2:結構化程序設計――建立函數概念 12
1.5.1 僅由main()函數構成的C語言程序 13
1.5.2 由main()函數和max()構成的C語言程序 13
1.5.3 C51程序的一般結構 13
1.5.4 規范書寫程序語句 14
1.5.5 程序設計流程圖 14
1.6 單片機硬件知識補充 15
1.6.1 存儲器:永久程序和臨時數據的住所 15
1.6.2 I/O(輸入/輸出)口結構、功能 21
1.6.3 I/O口的負載能力 24
1.7 知識小結 25
習題與思考1 25
項目2 多變的花樣燈 26
2.1 任務1:點亮一個燈 26
2.1.1 一位引腳定義和應用 26
2.1.2 一組引腳定義、輸入/輸出1字節數據 28
2.1.3 亮燈邏輯 28
2.1.4 PROTEUS界面與元件操作 29
2.1.5 亮一個燈的電路、程序設計 33
2.1.6 編譯、代碼下載、仿真、測判 34
2.1.7 STC單片機代碼下載 35
2.1.8 實物制作與上電測試 39
2.1.9 進階設計與思路點撥1:亮多個燈 39
2.1.10 進階設計與思路點撥2:用簡易數碼管顯示自己的學號 40
2.2 任務2:有規律變化的花樣燈――亮點流動 41
2.2.1 任務要求與分析 41
2.2.2 頭文件reg51.h解讀 42
2.2.3 亮點流動的程序設計――依序而下 43
2.2.4 編譯、代碼下載、仿真、測判 44
2.2.5 應用移位庫函數_crol_設計亮點流動程序 44
2.3 任務3:有規律變化的花樣燈一一亮起來 46
2.3.1 任務要求與分析 46
2.3.2 用“位”運算符實現一一亮燈 46
2.3.3 預處理:條件編譯#if、#else、#endif等 48
2.3.4 設計延時函數頭文件“dly05s.h” 48
2.3.5 流程與程序設計 49
2.3.6 編譯、代碼下載、仿真、測判 49
2.3.7 進階設計與思路點撥3:1~8個燈逐一熄滅 49
2.4 任務4:有規律變化的花樣燈――高低4位交替閃爍 50
2.4.1 任務要求與分析 50
2.4.2 流程與程序設計 51
2.4.3 編譯、代碼下載、仿真、測判 51
2.4.4 進階設計與思路點撥4:兩個亮點相向或相背運動 51
2.4.5 進階設計與思路點撥5:用移位函數實現兩個亮點相向運動 54
2.4.6 進階設計與思路點撥6:用移位函數實現兩個亮點相背運動 54
2.5 任務5:3種效果的花樣燈設計 55
2.5.1 任務與要求 55
2.5.2 流程與程序設計 55
2.5.3 編譯、代碼下載、仿真、測判 56
2.5.4 在Keil中進行延時程序調試 56
2.6 算術運算、賦值運算 58
2.6.1 算術運算 58
2.6.2 賦值及復合賦值運算 59
2.7 初識函數 60
2.7.1 函數格式 60
2.7.2 函數的調用中參數的傳遞 60
2.7.3 自定義函數的聲明 61
2.7.4 預處理:#include 引用庫、自定義函數 61
2.7.5 設計變時長的延時函數頭文件Dly_nms.h 62
2.7.6 進階設計與思路點撥7:變速流水燈 63
2.8 知識小結 63
習題與思考2 63
項目3 鍵控花樣燈 65
3.1 任務1:鍵控燈1(用if語句實現) 65
3.1.1 任務要求與分析 65
3.1.2 if條件語句結構 66
3.1.3 關系運算符和關系表達式 68
3.1.4 程序流程及程序設計 68
3.1.5 仿真、分析、記錄 69
3.2 任務2:鍵控燈2(用if-else語句實現) 69
3.2.1 任務要求與分析 69
3.2.2 程序流程及程序設計 70
3.2.3 仿真、分析、記錄 70
3.3 任務3:鍵控燈3(用if-else-if多分支語句實現) 71
3.3.1 任務要求與分析 71
3.3.2 程序流程及程序設計 72
3.3.3 仿真、分析、記錄 72
3.4 任務4:鍵控燈4(用if嵌套語句實現) 72
3.4.1 任務要求與分析 72
3.4.2 if語句嵌套 73
3.4.3 程序流程及程序設計 73
3.4.4 仿真、分析、記錄 74
3.5 任務5:鍵控燈5(用switch多分支語句實現) 74
3.5.1 任務要求與分析 74
3.5.2 switch語句 75
3.5.3 程序流程與程序設計 76
3.5.4 仿真、分析、記錄 77
3.5.5 PROTEUS單步調試 77
3.5.6 進階設計1 80
3.6 任務6:學習循環結構,求 81
3.6.1 goto語句 81
3.6.2 while語句 82
3.6.3 do-while語句 83
3.6.4 for語句 83
3.6.5 循環結構的嵌套與跳轉 84
3.6.6 break語句 85
3.6.7 continue語句 85
3.7 任務7:鍵控燈6(用for、while語句實現) 85
3.7.1 任務要求與分析 85
3.7.2 程序流程與程序設計 86
3.7.3 仿真、分析、記錄 87
3.7.4 進階設計2 87
3.8 任務8:鍵控燈7(用for、break語句實現) 88
3.8.1 任務要求與分析 88
3.8.2 程序流程與程序設計 88
3.8.3 仿真、分析、記錄 89
3.8.4 將break改成continue的變化 89
3.9 任務9:一位示意計數器設計 90
3.9.1 任務要求與分析 90
3.9.2 程序流程與程序設計 91
3.9.3 仿真、分析、記錄 91
3.9.4 進階設計3:兩位示意計數器設計 91
3.9.5 進階設計4:兩位十進制計數器設計 91
3.10 知識小結 92
習題與思考3 92
項目4 邏輯思維訓練 95
4.1 任務1:用printf語句輸出各種類型數據 95
4.1.1 數據是對描述對象的數學抽象 95
4.1.2 C51的數據類型 96
4.1.3 標識符與關鍵字 97
4.1.4 常量與變量 97
4.1.5 宏定義(#define)、數據類型的重新命名(typedef) 99
4.1.6 C51的輸入/輸出函數 100
4.1.7 從單片機串口輸出各種數據 102
4.1.8 數據的存儲器類型 104
4.1.9 C51變量的存儲模式(編譯模式) 105
4.1.10 在Keil中查看各變量的存儲地址及數值 105
4.2 任務2:歌星大賽計分――簡單統計運算 107
4.2.1 任務要求與分析 107
4.2.2 算法設計 108
4.2.3 流程與程序設計 108
4.2.4 PROTEUS串口輸出測試電路設計 109
4.2.5 編譯、代碼下載、仿真、測判 110
4.3 任務3:求車號是多少――推理 111
4.3.1 任務要求與分析 111
4.3.2 算法設計 111
4.3.3 外部函數調用――關鍵字extern 112
4.3.4 流程與程序設計 112
4.3.5 編譯、代碼下載、仿真、測判 113
4.3.6 進階設計與思路點撥1:角谷猜想 114
4.4 任務4:誰是罪犯――邏輯運算 114
4.4.1 任務要求與分析 114
4.4.2 邏輯運算、條件運算 115
4.4.3 算法設計 116
4.4.4 流程與程序設計 118
4.4.5 編譯、代碼下載、仿真、測判 119
4.4.6 進階設計與思路點撥2:新娘和新? 119
4.5 任務5:百錢百雞問題――窮舉、組合 120
4.5.1 任務要求與分析 120
4.5.2 算法設計 120
4.5.3 流程與程序設計 121
4.5.4 編譯、代碼下載、仿真、測判 122
4.5.5 進階設計與思路點撥3:換錢幣 122
4.6 任務6:數據從小到大排序――數組應用 122
4.6.1 任務要求與分析 122
4.6.2 數組 123
4.6.3 算法設計 125
4.6.4 流程與程序設計 126
4.6.5 編譯、代碼下載、仿真、測判 127
4.6.6 進階設計與思路點撥4:從大到小排序 127
4.7 任務7:求解約瑟夫問題――結構數組應用 128
4.7.1 任務要求與分析 128
4.7.2 結構體、結構數組 128
4.7.3 算法設計 130
4.7.4 流程與程序設計 131
4.7.5 編譯、代碼下載、仿真、測判 132
4.7.6 進階設計與思路點撥5:數3出局 132
4.8 局部變量、全局變量、外部變量 133
4.9 知識小結 135
習題與思考4 135
項目5 定時器/計數器、中斷應用 138
5.1 任務1:用外中斷干擾流水燈 138
5.1.1 任務要求與分析 138
5.1.2 中斷系統簡介 139
5.1.3 中斷控制寄存器 140
5.1.4 中斷過程 141
5.1.5 清除中斷請求的補充 142
5.1.6 中斷函數的編寫 143
5.1.7 算法設計 144
5.1.8 程序設計 144
5.1.9 編譯、代碼下載、仿真、測判 145
5.2 任務2:兩個外中斷干擾流水燈 145
5.2.1 任務要求與分析 145
5.2.2 中斷嵌套 146
5.2.3 程序設計 146
5.2.4 編譯、代碼下載、仿真、測判 147
5.2.5 進階設計 1 148
5.3 任務3:多少個小球――計數器應用 148
5.3.1 任務要求與分析 148
5.3.2 定時器/計數器T0、T1 149
5.3.3 定時器/計數器的控制及工作方式 150
5.3.4 定時器/計數器的計數容量及初值 152
5.3.5 定時器/計數器應用的基本步驟 153
5.3.6 認識數碼管、設計電路 154
5.3.7 子任務:單個數碼管循環顯示手機短號 156
5.3.8 算法與程序設計 157
5.3.9 編譯、代碼下載、仿真、測判 158
5.3.10 進階設計2:999個小球,如何顯示? 158
5.3.11 虛擬數字時鐘信號 應用 159
5.4 任務4:定時產生2500Hz方波 160
5.4.1 任務要求與分析 160
5.4.2 查詢方式下的程序框架 160
5.4.3 查詢方式下程序流程及程序設計 161
5.4.4 用虛擬示波器觀測信號周期 162
5.4.5 定時中斷方式下程序設計 164
5.4.6 編譯、代碼下載、仿真、測判 165
5.4.7 聽單片機發聲 165
5.5 任務5:秒閃燈――長時間定時(應用static) 165
5.5.1 任務要求與分析 165
5.5.2 算法設計 166
5.5.3 程序設計 166
5.5.4 C51變量的存儲類型 167
5.5.5 編譯、代碼下載、仿真、測判 168
5.5.6 進階設計3:看誰耳尖手快――反應時間測試 168
5.5.7 進階設計4:可反復測試反應時間的設計 169
5.6 任務6:T0定時產生不同頻率的方波(推算公約數) 169
5.6.1 任務要求與分析 169
5.6.2 算法設計 170
5.6.3 程序流程及程序設計 170
5.6.4 編譯、代碼下載、仿真、測判 171
5.6.5 進階設計5:矩形波設計 172
5.7 任務7:測量正脈沖寬度(巧用GATE位) 172
5.7.1 任務要求與分析 172
5.7.2 算法設計 172
5.7.3 程序流程及程序設計 173
5.7.4 編譯、代碼下載、仿真、測判 174
5.7.5 虛擬脈沖發生器 應用 174
5.7.6 進階設計6:測量負脈沖的寬度 175
5.8 任務8:鍵控PWM調光燈 175
5.8.1 任務要求與分析 175
5.8.2 算法設計 176
5.8.3 程序流程及程序設計 177
5.8.4 編譯、代碼下載、仿真、測判 177
5.8.5 進階設計7:呼吸燈 178
5.9 知識小結 178
習題與思考5 178
項目6 動態掃描技術的應用 180
6.1 任務1:并聯數碼管顯示生日 180
6.1.1 任務要求與分析 180
6.1.2 算法設計 181
6.1.3 程序結構設計 181
6.1.4 流程與程序設計 182
6.1.5 編譯、代碼下載、仿真、測判 183
6.1.6 進階設計1:輪流顯示生日與手機短號 183
6.2 任務2:可調時鐘 184
6.2.1 任務要求與分析 184
6.2.2 算法設計 184
6.2.3 程序結構設計 184
6.2.4 流程與程序設計 185
6.2.5 編譯、代碼下載、仿真、測判 187
6.2.6 進階設計2:設計12小時制的時鐘 188
6.3 任務3:多功能秒表――一鍵多功能 188
6.3.1 任務要求與分析 188
6.3.2 算法設計 189
6.3.3 程序結構設計 189
6.3.4 流程與程序設計 189
6.3.5 編譯、代碼下載、仿真、測判 191
6.4 任務4:矩陣鍵盤識別 192
6.4.1 任務要求與分析 192
6.4.2 電路設計 192
6.4.3 算法設計 193
6.4.4 程序結構設計 194
6.4.5 程序設計:key16.h 194
6.4.6 編譯、代碼下載、仿真、測判 195
6.4.7 進階設計3:以七段數碼管顯示鍵值 196
6.5 任務5:打地鼠游戲機設計 196
6.5.1 任務要求與分析 196
6.5.2 算法設計 196
6.5.3 程序結構設計 196
6.5.4 流程與程序設計 197
6.5.5 編譯、代碼下載、仿真、測判 199
6.5.6 進階設計4:競級打地鼠游戲設計 199
6.6 指針及其應用 199
6.6.1 為什么要設置指針 199
6.6.2 指針的運算符、定義 200
6.6.3 應用指針作為參數實現“傳址” 201
6.6.4 指針與數組 202
6.6.5 指針與函數 203
6.7 知識小結 204
習題與思考6 205
項目7 單片機唱歌及串行數據傳輸 206
7.1 任務1:生日快樂歌 206
7.1.1 任務要求與分析 206
7.1.2 音樂數據準備 206
7.1.3 程序結構設計 208
7.1.4 程序設計 209
7.1.5 編譯、代碼下載、仿真、測判 210
7.2 任務2:595串出3位數據 210
7.2.1 任務要求與分析 210
7.2.2 74HC595簡介 211
7.2.3 單片機串口通信簡介 213
7.2.4 程序框架及程序設計 215
7.2.5 編譯、代碼下載、仿真、測判 216
7.2.6 進階設計1:串出自己的手機長號數字 216
7.3 任務3:用595串行控制8×8點陣顯示I?U 216
7.3.1 任務要求與分析 216
7.3.2 程序框架與程序設計 218
7.3.3 編譯、代碼下載、仿真、測判 219
7.3.4 進階設計2:我的點陣圖形設計 219
7.3.5 進階設計3:人行道點陣小人指示燈設計 219
7.4 任務4:雙單片機間串行通信 220
7.4.1 任務要求與分析 220
7.4.2 串口工作方式1及波特率計算 220
7.4.3 程序框架及程序設計 221
7.4.4 編譯、代碼下載、仿真、測判 223
7.4.5 用串口調試助手監測目標板上的數據 223
7.5 知識小結 224
習題與思考7 224
項目8 AD及DA接口應用 225
8.1 任務1:LCD顯示的簡易電壓表 225
8.1.1 任務要求與分析 225
8.1.2 程序規劃 226
8.1.3 LCM1602簡介 226
8.1.4 LCD顯示的頭文件lcd1602.h設計 228
8.1.5 ADC0831簡介及時序 230
8.1.6 ADC0831的頭文件adc0831.h設計 231
8.1.7 C51對存儲器和外設的絕對地址訪問 232
8.1.8 主程序設計 233
8.1.9 編譯、代碼下載、仿真、測判 234
8.1.10 進階設計1:在LCD上顯示自己的姓名、學號 234
8.2 任務2:簡易波形發生器 234
8.2.1 任務要求與分析 234
8.2.2 DAC0832簡介 235
8.2.3 程序流程與程序設計 236
8.2.4 編譯、代碼下載、仿真、測判 237
8.2.5 進階設計2:設計一可調頻率1~20kHz的方波發生器 238
8.3 知識小結 238
習題與思考 238
附錄A 開發板原理圖、使用說明 239
附錄B C51程序設計實踐報告要求 242
附錄C C51的運算符優先級及結合性 243
參考文獻 244