第1章 音樂播放器設計 1
1.1 環境準備 1
1.1.1 在工具箱中添加WMP組件 1
1.1.2 WMP組件外觀 2
1.1.3 最簡單的音樂播放器設計 3
1.2 WMP組件的基本使用 5
1.2.1 WMP組件類(axWindowsMediaPlayer) 5
1.2.2 媒體類型(IWMPMedia接口) 6
1.2.3 播放列表類型(IWMPPlaylist接口) 7
1.2.4 WMP組件的“播放列表”應用 7
1.2.5 WMP控件模式設置 10
1.3 音樂播放器設計 11
1.3.1 設計思想 11
1.3.2 功能設計 12
1.3.3 播放器界面設計 12
1.3.4 關鍵技術 14
1.3.5 功能實現 22
編程練習 29
第2章 MFC游戲編程 31
2.1 Windows游戲編程回顧 31
2.2 C++ Windows游戲編程方式 31
2.2.1 Win32 SDK+DirectX 31
2.2.2 MFC編程 33
2.3 設計游戲 33
2.3.1 設計文檔 33
2.3.2 游戲的基本構成 33
2.4 俄羅斯方塊 34
2.4.1 要點分析 34
2.4.2 編寫步驟 35
2.5 走迷宮 50
2.5.1 要點分析 50
2.5.2 編程步驟 50
2.6 MFC游戲編程關鍵點 58
2.6.1 游戲貼圖與透明特效 58
2.6.2 定時器 59
2.6.3 減少圖像閃爍 60
2.6.4 簡單碰撞檢測 60
編程練習 61
第3章 基于單片機的應用系統開發 62
3.1 單片機簡述 62
3.2 認識STC89C52RC單片機 62
3.2.1 STC89C52RC單片機的特點 63
3.2.2 STC89C52RC工作模式 63
3.2.3 STC89C52RC引腳圖 63
3.3 開發工具——Keil μVision 4 65
3.3.1 安裝 65
3.3.2 如何創建一個項目 66
3.4 燒錄軟件——STC-ISP 69
3.5 案例——流水燈顯示 70
3.6 案例——呼吸燈顯示 72
3.7 案例——數碼管顯示數字 74
3.8 案例——顯示字符串 77
3.9 案例——時鐘芯片顯示日期 82
編程練習 90
第4章 網上訂餐系統的設計與開發 91
4.1 網上訂餐系統簡介 91
4.2 Web項目網絡環境介紹及部署 91
4.2.1 Web的基本組成 91
4.2.2 Web環境部署 95
4.3 系統功能結構設計 98
4.3.1 系統功能結構概要設計 98
4.3.2 系統功能示意圖 99
4.4 數據庫設計 102
4.5 系統實現 105
4.5.1 用戶注冊的實現 106
4.5.2 用戶登錄的實現 112
4.5.3 菜品選擇的實現 114
4.5.4 “我的訂單”的實現 117
4.5.5 用戶管理的實現 121
4.5.6 菜品管理的實現 121
4.5.7 訂單處理的實現 126
4.5.8 統計管理的實現 130
4.5.9 系統的后續工作 132
編程練習 132
第5章 HIS系統的開發 133
5.1 數據庫基礎 133
5.1.1 基本概念 133
5.1.2 在SQL Server中創建數據庫和表 135
5.1.3 SQL命令的使用 139
5.1.4 數據庫的設計 141
5.2 創建簡單的Web應用程序 144
5.2.1 Web應用程序的創建過程 145
5.2.2 創建歡迎頁面 147
5.2.3 創建收集信息的頁面 149
5.2.4 網頁之間的跳轉和數據的傳遞 152
5.2.5 使用表格進行頁面布局 155
5.3 數據庫訪問技術 158
5.3.1 C#中訪問數據庫的一般過程 158
5.3.2 使用Repeater控件顯示記錄 160
5.3.3 非空數據驗證控件的使用 164
5.3.4 向表中添加新的記錄 168
5.3.5 刪除表中記錄 172
5.3.6 修改表中的記錄 176
5.4 HIS系統的框架設計 178
5.4.1 HIS系統的框架組成 178
5.4.2 系統界面的開發過程——導航控件、母版頁與內容頁 180
5.4.3 其他頁面的界面設計 186
5.5 其他問題 187
5.5.1 調試程序時頻繁出現的問題 187
5.5.2 關于本系統的補充說明 189
習題 191
附錄A MFC Windows編程 192
A.1 Windows編程的基本思想 192
A.2 MFC編程 193
A.3 單文檔界面應用程序 194
A.4 在窗口的客戶區輸出文字和圖形 196
A.5 編制消息處理函數 198
A.5.1 消息映射 199
A.5.2 編制消息處理函數 199
A.6 鼠標和鍵盤消息處理 200
A.7 Windows數據類型與變量的命名規則 202
A.8 畫筆與畫刷 205
A.9 位圖 206
A.10 對話框 207
A.10.1 對話框的初始化 209
A.10.2 對話框的數據交換和數據檢驗機制 209
A.11 常用控件 210
A.12 序列化 211
A.12.1 打印和打印預覽 212
A.12.2 自定義類的序列化 213
A.13 MDI應用程序 213
附錄B HTML與CSS基礎 215
B.1 HTML頁面結構 215
B.2 HTML行內元素 215
B.2.1 圖像 216
B.2.2 鏈接 216
B.2.3 換行 216
B.2.4 強調 217
B.3 HTML塊元素 218
B.3.1 段落 218
B.3.2 標題 219
B.3.3 水平線 220
B.3.4 注釋 220
B.4 列表 221
B.5 表格 222
B.6 字符實體 223
B.7 音頻 224
B.8 視頻 225
B.9 CSS基礎 226
B.10 CSS選擇器 227
B.11 CSS的引入方式 227
B.12 CSS的屬性 229
B.13 ID選擇器 231
B.14 類選擇器 231
B.15 偽類 232
附錄C C#語言編程 233
C.1 C#語言概述 233
C.1.1 C#的類型體系 233
C.1.2 C#的流程控制語句 235
C.2 Visual Studio集成環境軟件安裝 237
C.3 Visual Studio集成環境使用 239
C.4 應用案例 244
參考文獻 263
基于單片機的應用系統開發
本章主要講解單片機的設備(STC89C52RC)、開發環境(Keil μVision 4、燒錄軟件STC-ISP),并為讀者提供5個實驗案例,從簡單的流水燈、呼吸燈和數碼管顯示,逐步擴展到在LCD12864液晶顯示字符串以及利用時鐘芯片DS1302顯示日期。通過對案例的練習,讓讀者更好地去理解單片機的工作原理,提高程序代碼編寫能力,進而了解怎樣利用單片機去實現從物理世界到計算機世界的轉換,例如按鍵的檢測、溫度的轉換、時間和字符串的顯示等內容。
3.1 單片機簡述
目前,各個領域都有單片機的蹤跡,不只是手機、計算機、玩具、冰箱、空調、電磁爐等和我們生活息息相關的物件,也包括汽車、機器人、飛機、導彈導航裝備等高科技設備,這些設備都包含一個或多個單片機。可以說,我們每天用到的電子設備基本都有單片機的存在。如果讀者想成為一名硬件工程師,單片機的學習是了解計算機原理和結構的最佳選擇。
一臺計算機需要由CPU、RAM、ROM、輸入/輸出設備等部件構成,這些部件被分成多個芯片并安裝在主板上。單片機將這些部件集中安裝到一塊集成電路芯片上,具有體積小、質量輕、價格便宜的特點,為學習、應用和開發提供了便利條件。
單片機是一種控制芯片,它是一個微型計算機。如果在單片機的基礎上添加了晶振、存儲器、鎖存器、邏輯門、譯碼器、按鈕等部件就組成了單片機系統。一般的單片機有40腳封裝,也有一些功能強大的單片機有更多引腳,如68引腳,早期的單片機也有10個或者20個引腳。一般主流的單片機包括CPU、4KB容量的RAM、128 KB容量的ROM、 2個16位定時/計數器、4個8位并行口、全雙工串行口、ADC/DAC、SPI、I2C、ISP、IAP。
單片機支持匯編編程和C51編程,兩種編程方法各有利弊。匯編編程使用傳統的匯編代碼,具有代碼精簡、占用資源少、運行效率高的優點,然而可讀性不強、不易移植;C51編程使用專用的C語言編程,C語言具有模塊化管理編程方便、可移植性強、適合編寫大程序等優點,缺點是占用資源較多,執行效率沒有匯編高。本書采用Keil c51進行編程。
3.2 認識STC89C52RC單片機
STC89C52RC單片機是宏晶科技有限公司推出的一種具有高速、低功耗、超強抗干擾特點的小型單片機,其程序的電可擦寫特性,使得開發與實驗比較容易,為很多嵌入式控制系統提供了一種高性價比的方案。
3.2.1 STC89C52RC單片機的特點
(1)它是增強型的8051單片機,可以任意選擇6時鐘/機器周期和12時鐘/機器周期,指令系統和引腳上完全兼容MCS-51系列的單片機。
(2)工作電壓范圍:3.8~2.0V(3V單片機)/5.5~3.3V(5V單片機)。
(3)工作頻率范圍:0~40MHz,相當于普通8051的0~80MHz,實際工作頻率可 達48MHz。
(4)用戶應用程序空間:8KB。
(5)片上集成RAM:512B。
(6)通用I/O口(32個),復位后為:P1/P2/P3/P4是準雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。
(7)ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器,可通過串口(輸入口RXD /P3.0,輸出口TXD /P3.1)直接下載用戶程序。
(8)具有EEPROM(帶電可擦寫可編程只讀存儲器)和看門狗功能。
(9)具有3個16位定時器/計數器。即定時器T0、T1、T2。
3.2.2 STC89C52RC工作模式
(1)掉電模式:典型功耗<0.1μA;可由外部中斷喚醒,中斷返回后,再繼續執行原程序。
(2)空閑模式:典型功耗2mA。
(3)正常工作模式:典型功耗4~7mA。
3.2.3 STC89C52RC引腳圖
如圖3-1所示,具體功能說明如下。
圖3-1 STC89C52RC引腳圖
(1)VCC(40引腳):電源電壓。
(2)GND(20引腳):接地。
(3)P0端口(P0.0~P0.7,39~32引腳):P0端口是一個漏極開路的8位雙向I/O口。作為輸出端口,每個引腳能驅動8個TTL負載,對端口P0寫入“1”時,可以作為高阻抗輸入。在訪問外部程序和數據存儲器時,P0口也可提供低8位地址和8位數據的復用總線,P0端口內部上拉電阻有效。在Flash ROM編程時,P0端口接收指令字節,而在校驗程序時,則輸出指令字節,注意在驗證時,需外接上拉電阻。
(4)P1端口(P1.0~P1.7,1~8引腳):P1端口是一個帶內部上拉電阻的8位雙向I/O口。P1端口的輸出緩沖器可驅動(吸收或者輸出電流方式)4個TTL輸入。P1端口用作輸入口使用時,端口寫入1,通過內部的上拉電阻把端口拉到高電位,這樣被外部拉低的引腳會輸出一個電流。在對Flash ROM編程和程序校驗時,P1端口接收低8位地址。此外,P1.0和P1.1還可以作為定時器/計數器2的外部技術輸入(P1.0/T2)和定時器/計數器2的觸發輸入(P1.1/T2EX),具體功能如表3-1所示。
表3-1 P1.0和P1.1引腳復用功能
引腳號
功 能 特 性
P1.0
T2(定時器/計數器2外部計數輸入),時鐘輸出
P1.1
T2EX(定時器/計數器2捕獲/重裝觸發和方向控制)
(5)P2端口(P2.0~P2.7,21~28引腳):P2端口是一個帶內部上拉電阻的8位雙向I/O端口。P2端口的輸出緩沖器可以驅動(吸收或輸出電流方式)4個TTL輸入。P2端口用作輸入口時,端口寫入1時,通過內部的上拉電阻把端口拉到高電平,被外部信號拉低的引腳會輸出一個電流。在對Flash ROM編程和程序校驗期間,P2端口可以接收高位地址和一些控制信號。
(6)P3端口(P3.0~P3.7,10~17引腳):和P2端口類似,P3端口也是一個帶內部上拉電阻的8位雙向I/O端口。P3端口的輸出緩沖器可驅動(吸收或輸出電流方式)4個TTL輸入。P3端口作為輸入口使用時,對端口寫入1,通過內部的上拉電阻把端口拉到高電位,因此那些被外部信號拉低的引腳會輸入一個電流。在對Flash ROM編程或程序校驗時,P3端口會接收一些控制信號。P3端口除作為一般I/O口外,還有其他一些復用功能,如表3-2所示。
表3-2 P3端口引腳復用功能
引腳號
復 用 功 能
P3.0
RXD(串行輸入口)
P3.1
TXD(串行輸出口)
P3.2
(外部中斷0輸入)
P3.3
(外部中斷1輸入)
P3.4
T0(定時器0的外部計數輸入)
P3.5
T1(定時器1的外部計數輸入)
P3.6
(外部數據存儲器寫選通輸出)
P3.7
(外部數據存儲器讀選通輸出)
(7)RST(9引腳):復位輸入。當輸入連續兩個機器周期以上的高電平時有效,用來完成單片機的復位初始化操作。看門狗計時完成后,RST引腳輸出96個晶振周期的高電平。特殊寄存器AUXR上的DISRTO位可以使此功能無效。DISRTO默認狀態下,復位高電平是有效的。
(8)ALE/(30引腳):ALE(地址鎖存控制信號)是訪問外部程序存儲器時,鎖存低8位地址的輸出脈沖。在Flash編程時,引腳也用作編程輸入脈沖。一般情況下,ALE以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,需要注意的是,每次訪問外部數據存儲器時,ALE脈沖將會跳過。可以通過將ALE使能標志位(地址位8EH的SFR的第0位)置為“1”,ALE操作將會無效,置“1”后,ALE僅在執行MOVX或MOV指令時有效,否則ALE將被拉高。
(9)(29引腳):是外部程序存儲器選通信號。當AT89C51RC從外部程序存儲器執行外部代碼時,在每個機器周期被激活兩次,而訪問外部數據存儲器時,將不被激活。
(10)/VPP(31引腳):是訪問外部程序存儲器控制信號。為使能從0000H到FFFFH的外部程序存儲器讀取指令,需接GND。加密方式為1時,將內部鎖定位RESET,如需執行內部程序指令,需接VCC。在Flash編程期間,也接收12V的VPP電壓。
(11)XTAL1(19引腳):振蕩器反相放大器和內部時鐘發生電路的輸入端。
(12)XTAL2(18引腳):振蕩器反相放大器的輸入端。
3.3 開發工具——Keil μVision 4
Keil μVision是美國Keil Software公司出品的MCS51架構兼容單片機C語言軟件開發環境,它集編輯、編譯、仿真等于一體,其界面和常用的微軟VC++的界面相似,界面友好,易學易用,具有強大的軟件仿真功能。Keil 提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案。使用匯編語言或C語言需要使用編譯器,以便把寫好的程序編譯為機器碼,才能把HEX可執行文件寫入單片機內。Keil μVision是眾多單片機應用開發軟件中最優秀的軟件之一,很多開發MCS51系列單片機應用的工程師或普通單片機愛好者,都在使用Keil μVision完成開發工作。
3.3.1 安裝
(1)運行安裝程序,如圖3-2所示。
圖3-2 運行安裝Keil程序
(2)按照提示,完成安裝過程,如圖3-3所示。
(3)完成安裝,出現如圖3-4所示圖標即表示安裝完成。
圖3-3 Keil安裝過程 圖3-4 完成Keil安裝
3.3.2 如何創建一個項目
使用Keil軟件新建一個項目并編譯運行生成HEX文件。
(1)啟動Keil軟件,雙擊圖標,運行?Vision。
(2)創建一個工程文件。在菜單欄里單擊Project→New ?Vision Project菜單項,如圖3-5所示,將打開一個對話框,如圖3-6所示,輸入文件名即可成功創建一個新的工程,?Vision將會創建一個以*.uvproj為名字的新工程文件。建議每個工程都使用獨立的文件夾。工程文件創建后,從設備數據庫中選擇一個CPU芯片(一般用的是Atmel的AT89C51或AT89C2051,本書選擇AT89C52微控制器),如圖3-7所示。
圖3-5 創建工程文件截圖
圖3-6 新建工程文件對話框截圖
圖3-7 選擇CPU芯片截圖
(3)創建成功一個工程后,?Vision會給所選擇的CPU芯片添加合適的啟動代碼,單擊“是”按鈕,完成新建項目,如圖3-8所示。
圖3-8 添加啟動代碼截圖
(4)創建一個新的源文件,并將源文件加載到新建的工程中。通過單擊File→New菜單項可以創建一個新的源文件,這時會打開一個空的文本編輯窗口,輸入相應代碼,通過File→Save As可以保存為.c文件。源文件創建好后,需要將此文件添加到工程中,通過右擊Project Workspace→Files頁中的文件組,然后在彈出的菜單中選擇Add Files to Group菜單項,將打開文件對話框,選擇已創建好的*.c源文件,就完成了源文件的添加,如圖3-9所示。
圖3-9 添加源文件到項目中截圖
(5)第一次使用時,需要進行設置,確保每次運行項目都生成HEX文件。右擊Target 1,選擇Options for 'Target 1'菜單項,在彈出的對話框中選擇Target標簽頁,填寫晶體的大小,再選擇Output標簽頁,選中Create HEX File多選按鈕,單擊OK按鈕確定,如圖3-10所示。設置完成后,每次編譯都會生成一個十六進制文件。
圖3-10 編譯生成十六進制文件選項截圖
(6)編寫完成代碼。
(7)編譯運行項目。選擇菜單Project→Rebuild All Target Files,或單擊快捷方式圖標,在Build Output窗口,提示“creating hex file from "XXX"... "XXX" - 0 Error(s), 0 Warning(s)”,如圖3-11所示,則表示編譯成功,且生成HEX文件成功。
圖3-11 Build Output編譯成功窗口截圖
3.4 燒錄軟件——STC-ISP
STC-ISP 是一款單片機下載編程燒錄軟件,是針對STC系列單片機而設計的,可下載STC89系列、12C2052系列、12C5410等系列的STC單片機,使用簡便,現已被廣泛使用。
將生成的HEX文件燒到單片機的過程如下。
(1)連接單片機和計算機,打開燒錄工具(本書使用的是STC-ISP燒錄工具),如圖3-12所示。
圖3-12 燒錄工具STC-ISP界面截圖
(2)進行設置,如圖3-12左上角選擇相應的單片機型號(如選STC89C52),選擇正確的端口號(如COM4)。
(3)打開程序文件。單擊如圖3-12所示的“打開程序文件”按鈕,將彈出對話框,如圖3-13所示,選擇之前生成的*.hex文件。
(4)下載/編程。單擊如圖3-12所示的“下載/編程”按鈕,重新關閉、打開單片機開關,如果提示“……操作成功!”表示燒錄工作成功完成,如圖3-14所示。
圖3-13 選擇*.hex文件對話框截圖
圖3-14 完成燒錄工作界面截圖
3.5 案例——流水燈顯示
LED燈顯示流水的效果,時間間隔為0.1s,硬件電路如圖3-15所示,單片機的P1.0~P1.7接口上分別接了8個LED燈,輸出為“0”時,LED燈亮,重復循環P1.0→P1.1→ P1.2→…→P1.7→P1.0→P1.1→P1.2→…→P1.7亮。通過該案例進一步熟悉Keil仿真軟件和燒錄工具的使用,了解并熟悉單片機I/O口和LED等的電路結構。
圖3-15 流水燈的硬件電路圖
1. 要點分析
(1)延時程序的設計。由于單片機指令執行的時間很短(μs數量級),如果要達到LED燈間流水的時間間隔為0.1s,在執行某一條指令時,需要引用一個延時程序。石英晶體的頻率是12MHz,一個機器周期=1/12MHz*12=1μs,因此我們可以設計延時程序如下:
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
……