久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19916|回復: 13
收起左側

8051單片機嵌入式操作系統源碼及解說與資料下載(超詳細)

  [復制鏈接]
ID:230641 發表于 2017-9-3 07:56 | 顯示全部樓層 |閱讀模式
本帖最后由 engineer_wubin 于 2017-9-4 20:58 編輯

  星光操作系統是基于8051單片機的嵌入式操作系統,支持多線程并發運行,提供線程互斥、同步和通信功能,其功能特性如下:
(1)支持STC89C52RC單片機,4級優化時的最小程序大小為:data = 138,xdata = 20,code = 6616。
(2)支持AT89S52單片機,4級優化時的最小程序大小為:data = 155,xdata = 0,code = 6120。
(3)支持時間片輪轉調度和搶占式調度,時間片長度為10毫秒。
(4)線程的最大數量為255
(5)信號量的最大數量為255
(6)屏障的最大數量為255
(7)信箱的最大數量為255,每個信箱中消息的最大數量為255。
(8)支持中斷觸發,但是不支持中斷嵌套。
(9)提供微秒級延時功能
(10)提供組件、庫和驅動,方便使用外設。
(11)當時鐘頻率為12MHz時,對于時間片導致的線程切換,其切換時間為888微秒;對于外部中斷導致的線程切換,其切換時間為464微秒。

  為了便于使用外設,星光操作系統提供如下組件,為應用提供統一接口:
(1)LCM1601(液晶模塊)
(2)LCM1602(液晶模塊)
(3)LCM12864(液晶模塊)
(4)DS18B20(數字溫度傳感器)
(5)HS0038B(紅外線接收器)
(6)AT93C46(EEPROM)
(7)AT24C02(EEPROM)
(8)DS1302(實時時鐘)
(9)28BYJ48(步進永磁減速電機)

  每個組件都有對應的庫,為組件提供硬件抽象層;此外,提供芯片內部設備庫和原語庫,前者包括GPIO、UART、Power和ISP,后者包括線程、信號量、屏障和信箱。

  星光操作系統使用手冊目錄為Starlight_V0.1Manual,請查閱相關信息。

  星光操作系統支持Discover8051 V1開發板,這是基于STC89C52RC(90C版)單片機的8051開發板,詳情請參考附件中的使用手冊和原理圖。
0.png

目錄
1 工具 4
11 Discover8051 V1 開發板4
12 星光操作系統 5
13 Keil C51 6
14 STC-ISP 6
2 實驗 7
21 LED(發光二極管)8
211 硬件設計 8
212 軟件準備 8
213 軟件設計 8
214 實驗效果 9
22 LCM1601(液晶模塊)9
221 硬件設計 9
222 軟件準備 10
223 軟件設計 10
224 實驗效果 10
23 LCM1602(液晶模塊)11
231 硬件設計 11
232 軟件準備 11
233 軟件設計 11
234 實驗效果 11
24 LCM12864(液晶模塊)12
241 硬件設計 12
242 軟件準備 12
243 軟件設計 12
244 實驗效果 13
25 Digit(數碼管)14
251 硬件設計 14
252 軟件準備 14
253 軟件設計 14
254 實驗效果 14
26 Buzzer(蜂鳴器)15
261 硬件設計 15
262 軟件準備 15
263 軟件設計 15
264 實驗效果 16
27 Keypad(矩陣按鍵)16
271 硬件設計 16
272 軟件準備 16
273 軟件設計 16
274 實驗效果 17
28 DS18B20(數字溫度傳感器)17
281 硬件設計 17
282 軟件準備 17
283 軟件設計 17
284 實驗效果 18
29 HS0038B(紅外線解碼)18
291 硬件設計 18
292 軟件準備 19
293 軟件設計 19
294 實驗效果 19
210 Key(簡單按鍵)20
2101 硬件設計20
2102 軟件準備20
2103 軟件設計20
2104 實驗效果20
211 Power(掉電和喚醒)20
2111 硬件設計20
2112 軟件準備21
2113 軟件設計21
2114 實驗效果21
212 AT93C46(EEPROM)21
2121 硬件設計21
2122 軟件準備21
2123 軟件設計22
2124 實驗效果22
213 AT24C02(EEPROM)22
2131 硬件設計22
2132 軟件準備23
2133 軟件設計23
2134 實驗效果23
214 DS1302(實時時鐘)23
2141 硬件設計23
2142 軟件準備24
2143 軟件設計24
2144 實驗效果24
215 28BYJ48(步進永磁減速電機)25
2151 硬件設計25
2152 軟件準備25
2153 軟件設計25
2154 實驗效果25
216 UART(串口) 26
2161 硬件設計26
2162 軟件準備26
2163 軟件設計26
2164 實驗效果27
217 ISP(EEPROM) 27
2171 硬件設計27
2172 軟件準備27
2173 軟件設計27
2174 實驗效果28
218 Semaphore(信號量)28
2181 硬件設計28
2182 軟件準備28
2183 軟件設計28
2184 實驗效果28
219 Barrier(屏障)29
2191 硬件設計29
2192 軟件準備29
2193 軟件設計29
2194 實驗效果29
220 Mailbox(信箱)30
2201 硬件設計30
2202 軟件準備30
2203 軟件設計30
2204 實驗效果30
3 聯系方式 30


1   工具

1.1 Discover8051 V1 開發板

Discover8051 V1 是基于 STC89C52RC(90C 版)單片機的 8051 開發板,硬件配置如下 所示:
1.012.jpg
圖 1 Discover8051 V1 開發板硬件配置

(1)Mini-B 型 USB 插座
(2)500mA 自恢復保險絲
(3)電源開關
(4)電源指示燈
(5)CH340G,實現 USB-UART 轉換。
(6)用于 CH340G 的 12MHz 無源晶振
(7)用于單片機的 12MHz 無源晶振
(8)復位按鍵
(9)單片機插座
(10)STC89C52RC(90C 版)單片機,ROM 容量 8K 字節,RAM 容量 512 字節。
(11)單片機引腳插針
(12)總線收發器 74HC245
(13)LCM1601/LCM1602 液晶模塊插座

(14)10K 歐姆電位器,用于調節 LCM1601/LCM1602 液晶模塊的對比度。
(15)LCM12864 液晶模塊插座
(16)6 位共陽數碼管
(17)無源蜂鳴器
(18)數字溫度傳感器 DS18B20
(19)紅外線接收器 HS0038B
(20)矩陣按鍵
(21)喚醒按鍵
(22)EEPROM 芯片 AT93C46
(23)EEPROM 芯片 AT24C02
(24)實時時鐘 DS1302

Discover8051 V1 開發板帶有 CH340G 芯片,用于實現 USB-UART 轉換,使用前需要安裝 驅動程序,運行 CH340GCH341SER.EXE,按照提示完成安裝。然后,用 USB 連接線將開發板 和計算機連接起來,Windows 操作系統會識別 CH340G,隨后在設備管理器中出現一個串口, 用于實現單片機和計算機之間的通信。


1.3 Keil C51

Keil C51 v9.51a 是 8051 單片機開發環境,其文件路徑為 Keilc51_v9.51a.exe,運行 該程序,按照提示安裝即可。安裝完成后,其許可狀態為評估版,此時對代碼的長度有限制。 以管理員身份啟動該程序,點擊菜單 File -> License Management,選擇單用戶許可頁面, 復制許可窗口右上方的 CID。啟動 Keil 目錄下的注冊機,填入復制的 CID,點擊 Genarate 按鈕,復制生成的 LIC,在 Keil C51 的許可窗口中填入 LIC,點擊 Add Lic 按鈕添加許可。關閉 Keil C51,然后再次啟動(這次不需要管理員身份),此時 Keil C51 為正式版。

為了更好地顯示代碼,需要對 Keil C51 的編輯器做簡單配置。選擇菜單 Editor -> Configuration,在編輯器頁面中,將編碼方式設置為 GB2312 簡體中文,將 Tab 字符大小設 置為 4,同時選擇所有文件的顯示行號功能。

1.4 STC-ISP

STC-ISP v6.85P 是 STC 公司的單片機燒寫工具,用于將 Keil C51 生成的程序寫入單片 機 ROM 中,其文件路徑為 STC-ISPstc-isp-15xx-v6.85P.zip。解壓后運行其中的 EXE 文件, 選擇單片機型號和 HEX 程序文件,然后點擊下載/編程按鈕。先關閉開發板電源開關,然后 再次打開電源開關,此時 STC-ISP 會檢測單片機固件并開始下載/編程。完成后,單片機會 自動復位。

另外,STC-ISP 帶有單片機型號數據庫,安裝方法為:啟動 STC-ISP,選擇 Keil 仿真設 置頁面,點擊添加按鈕,將單片機型號、頭文件和仿真驅動添加到 Keil C51 中。將鼠標指 針停留在該按鈕上,會顯示幫助信息.

2 實驗

星光操作系統的默認工程配置為 3 個線程、1 個信號量、1 個屏障和 1 個信箱(消息容 量為 1),在實驗前,請確認上述數值:
(1)啟動 Keil C51
(2)選擇菜單 Project -> Open Project,選擇目錄 Starlight_V0.1ProjectNebula Discover8051_V1,打開工程Nebula_Discover8051_V1.uvproj。
(3)選擇菜單 Project -> Build target,構建工程,注意下方的 Build Output 輸出窗口 內容,確認構建成功。
(4)在左側工程列表中,點擊 Primitive -> STC_STC89C52RC_Thread.c 旁邊的“+”標志, 在展開的列表中,雙擊打開 STC_STC89C52RC_Thread.h
(5)察看第 33 行的枚舉常量 Thread_Count_Limitation,確認當前值為 3。
(6)用 相 同 方 法 打 開 STC_STC89C52RC_Semaphore.h , 察 看 第 33 行 的 枚 舉 常 量 Semaphore_Count_Limitation,確認當前值為 1。
(7)用 相 同 方 法 打 開 STC_STC89C52RC_Barrier.h , 察 看 第 33 行 的 枚 舉 常 量 Barrier_Count_Limitation,確認當前值為 1。
(8)用 相 同 方 法 打 開 STC_STC89C52RC_Mailbox.h , 察 看 第 33 行 的 枚 舉 常 量 Mailbox_Count_Limitation , 確 認 當 前 值 為 1 ; 察看 第 40 行 的 枚 舉 常 量 Message_Count_Limitation,確認當前值為 1。

經過上述操作,用戶已經知道如何察看和修改操作系統的原語配置,為后續實驗做好準 備,也可以根據自身需要設計新的實驗。

雙擊打開 Application -> Nebula_Discover8051_V1_Main_Application.c,察看第 217
- 261 行之間的內容,這些是用戶線程,確認 LED 線程處于有效狀態,其它線程都處于注釋 狀態。

文件的最后是 while (1)無限循環,根據星光操作系統的線程調度設計要求,系統中必 須存在至少一個就緒線程。將這種限制放在 main 函數中,保證主線程永遠可調度,這就使 得用戶線程不必包含 while (1)無限循環。當用戶線程函數執行完畢時,用戶線程會自動結 束。在后續實驗的用戶線程中會包含 while (1)無限循環,這只是出于實驗目的,并不是必 須的。

在后續實驗中,如果不需要使用液晶模塊 LCM1601、LCM1602 和 LCM12864,請將其取下, 避免干擾 LED 和數碼管。插拔時,先斷電,后操作,避免損壞液晶模塊。插入液晶模塊時, 注意引腳編號,不要插反。如果對比度過高或過低,調節相應的電位器即可.

2.1 LED(發光二極管)

2.1.1 硬件設計

1.025.jpg

74HC245 為總線收發器,輸入端連接 P1 端口的 8 個引腳,輸出端為 D0 - D7,連接 8 個共陽極 LED,R15 - R22 為限流電阻。以 P1_0 為例,單片機復位后其值為 1,則 D0 為 1, LED 滅;當 P1_0 為 0 時,則 D0 為 0,LED 亮。循環控制 P1 端口的 8 個引腳,即可實現流水 燈效果。

2.1.2 軟件準備

工程的默認配置即為 LED 線程,不需要做任何修改。

2.1.3 軟件設計

雙擊左側工程列表 Application 中的 Nebula_Discover8051_V1_LED_Application.c, 察看軟件實現。對于 P1 端口的每個引腳,設置為 0,使得 LED亮,延遲 500 毫秒;然后設 置為 1,使得 LED 滅,延遲 500 毫秒。重復這個過程會實現流水燈效果,相關的庫函數為:
(1)GPIO_Library_Write_Pin:寫 GPIO 引腳,帶有 3 個參數,即端口索引、引腳索引 和引腳值。
(2)Thread_Library_Suspend_Thread:掛起線程,帶有 1 個參數,表示掛起時間,以
毫秒為單位。
2.1.4 實驗效果

(1)選擇菜單 Project -> Build target,構建應用,確認下方的 Build Output 窗口中沒 有 錯 誤 和 警 告 。 輸 出 目 錄 為ProjectNebulaDiscover8051_V1Object , 文 件 為 Nebula_Discover8051_V1 和 Nebula_Discover8051_V1.hex,后者用于燒寫單片機 ROM。
(2)連接開發板和計算機,在設備管理器中察看串口信息,確認 USB-UART 轉換芯片 CH340G 工作正常,并且開發板電源開關處于關閉狀態。
(3)確認開發板上的跳線 JP1 處于連接狀態,該跳線用于給 LED 供電。
(4)啟動 STC-ISP,在單片機型號中選擇“STC89C52RC/LE52RC”,點擊“打開程序文件”, 選擇 Nebula_Discover8051_V1.hex,然后點擊“下載/編程”,此時開始檢測單片機固件。
(5)打開開發板電源開關,STC-ISP 顯示檢測信息,隨后開始燒寫單片機 ROM。
(6)燒寫完畢后,單片機自動開始運行,此時可以看到流水燈效果。

完成實驗后,選擇菜單 Project -> Clean target,清理工程輸出文件。在工程管理中 刪 除 Nebula_Discover8051_V1_LED_Application.c , 但 是保 留 線 程 庫 和 GPIO 庫 。 在 Nebula_Discover_V1_Main_Application.c 中,定位到第 217 行,將該行轉為注釋狀態,為 后續實驗做好準備。

2.2 LCM1601(液晶模塊)

1.029.jpg 2.2.1 硬件設計

LCM1601 支持 4 位模式和 8 位模式,有
3 個控制引腳和 8 個數據引腳,前者包括 RS
(寄存器選擇)、R/W(讀寫)和 E(使能), 后者包括 D0 - D7。用 P0_0、P0_1 和 P0_2 傳輸控制信息,用 P1_0 - P1_7 傳輸數據。 VL 為對比度,連接到阻值為 10K 歐姆的電 位器 R23,供用戶調節液晶模塊的顯示效果.

2.2.2 軟件準備

(1)打開 Nebula_Discover_V1_Main_Application.c,定位到第 219 行,去除注釋,將該 行轉為有效態。
(2)在 工 程 的 Library 組 中 添 加 Display_LCM1601_Library.c , 其 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryDisplayLCM1601。
(3)在 工 程 的 Component 組 中 添 加 Display_LCM1601_Component.c , 其 目 錄 為 SourceComponentDisplayLCM1601。
(4)在工程的 Application 組中添加 Nebula_Discover8051_V1_LCM1601_Application.c, 其目錄為SourceBoardNebulaDiscover8051_V1ApplicationLCM1601。

2.2.3 軟件設計

雙擊工程列表中的 Nebula_Discover8051_V1_LCM1601_Application.c,察看軟件實現, 即:初始化、打開顯示、設置數據和移動數據。通過循環移動數據,實現文字的滾動顯示, 相關的組件函數為:
(1)Display_LCM1601_Component_Initialize:初始化
(2)Display_LCM1601_Component_Read_Busy_Flag_Memory_Address:返回忙標志
(3)Display_LCM1601_Component_Control_Display_On_Off:打開顯示
(4)Display_LCM1601_Component_Write_Memory_Data:寫數據
(5)Display_LCM1601_Component_Shift_Cursor_Display:移動光標
(6)Display_LCM1601_Component_Return_Home:返回起點

組件 Display_LCM1601_Component.c 依賴 Display_LCM1601_Library.c,這個庫完成實 際操作,為組件提供硬件抽象層接口。

2.2.4 實驗效果

(1)點擊工具欄的 Build 按鈕,構建應用,注意 Build Output 中的輸出內容。
(2)在 STC-ISP 中,點擊“打開程序文件”,打開新的 Nebula_Discover8051_V1.hex。
(3)關閉開發板的電源開關,插上 LCM1601 液晶模塊,確認跳線 JP2 處于連接狀態,JP1 和 JP3 處于斷開狀態。
(4)點擊 STC-ISP 中的“下載/編程”,打開開發板的電源開關,STC-ISP 顯示燒寫信息。
(5)燒寫完畢,單片機自動開始運行。
(6)LCM1601 液晶模塊滾動顯示數據
(7)將初始化函數的參數設置為 0,表示使用 4 位模式,重復上述過程,檢查運行效果。

完成實驗后,選擇菜單 Project -> Clean target,清理工程輸出文件。在工程列表中 刪除上述三個文件,在Nebula_Discover_V1_Main_Application.c 中定位到第 219 行,將該 行轉為注釋態,為后續實驗做好準備。

2.3 LCM1602(液晶模塊)

2.3.1 硬件設計

LCM1602 支持 4 位模式和 8 位模式,引腳功能與 LCM1601 相同,使用與上一個實驗相同 的硬件設計,此處省略。

2.3.2 軟件準備

(1)在主應用中定位到第 221 行,將該行轉為有效態。
(2)在              Library              組 中 添 加              Display_LCM1602_Library.c , 其 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryDisplayLCM1602。
(3)在              Component              組 中 添 加              Display_LCM1602_Component.c , 其 目 錄 為SourceComponentDisplayLCM1602。
(4)在 Application 組中添加 Nebula_Discover8051_V1_LCM1602_Application.c,其目錄 為SourceBoardNebulaDiscover8051_V1ApplicationLCM1602。

2.3.3 軟件設計

雙擊工程列表中的 Nebula_Discover8051_V1_LCM1602_Application.c,察看軟件實現, 即:初始化、打開顯示、設置數據和移動數據。通過循環移動數據,實現文字的滾動顯示, 相關的組件函數為:
(1)Display_LCM1602_Component_Initialize:初始化
(2)Display_LCM1602_Component_Read_Busy_Flag_Memory_Address:返回忙標志
(3)Display_LCM1602_Component_Control_Display_On_Off:打開顯示
(4)Display_LCM1602_Component_Write_Memory_Data:寫數據
(5)Display_LCM1602_Component_Shift_Cursor_Display:移動光標
(6)Display_LCM1602_Component_Return_Home:返回起點

組件 Display_LCM1602_Component.c 依賴 Display_LCM1602_Library.c,這個庫完成實 際操作,為組件提供硬件抽象層接口。

2.3.4 實驗效果

(1)點擊工具欄的 Build 按鈕,構建應用,注意 Build Output 中的輸出內容。
(2)在 STC-ISP 中,點擊“打開程序文件”,打開新的 Nebula_Discover8051_V1.hex。
(3)關閉開發板的電源開關,插上 LCM1602 液晶模塊,確認跳線 JP2 處于連接狀態,JP1 和 JP3 處于斷開狀態。
(4)點擊 STC-ISP 中的“下載/編程”,打開開發板的電源開關,STC-ISP 顯示燒寫信息。
(5)燒寫完畢,單片機自動開始運行。
(6)LCM1602 液晶模塊滾動顯示數據

(7)將初始化函數的參數設置為 0,表示使用 4 位模式,重復上述過程,檢查運行效果。

完成實驗后,選擇菜單 Project -> Clean target,清理工程輸出文件。在工程列表中 刪除上述三個文件,在Nebula_Discover_V1_Main_Application.c 中定位到第 221 行,將該 行轉為注釋態,為后續實驗做好準備。

2.4 LCM12864(液晶模塊)

1.039.jpg 2.4.1 硬件設計

LCM12864 支持 8 位并行模式和串行模式,其 前 14 個引腳功能與 LCM1602 相同。第 15 引腳為 PSB,表示并行/串行選擇,高電平選擇并行模式, 低電平選擇串行模式;第 16 引腳為 NC,表示不 連接,但在某些情況下用于選擇左右半屏,具體 功能由用戶選擇的液晶模塊確定;第 17 引腳為 RST,表示復位,低電平有效;第 18 引腳為 VEE, 表示負壓輸出,與對比度引腳 VL 相連。

2.4.2 軟件準備

(1)在主應用中,定位到第 223 行,去除注釋,將該行轉為有效態。
(2)在Library 組中添加 Display_LCM12864_Library.c , 目錄為SourceBoardNebulaDiscover8051_V1LibraryDisplayLCM12864。
(3)在Component組中添加Display_LCM12864_Component.c , 目錄 為SourceComponentDisplayLCM12864。
(4)在 Application 組中添加 Nebula_Discover8051_V1_LCM12864_Application.c,目錄 為SourceBoardNebulaDiscover8051_V1ApplicationLCM12864。

2.4.3 軟件設計

打開 Nebula_Discover8051_V1_LCM12864_Application.c,察看軟件實現,即:初始化、 打開顯示、選擇指令集、設置數據地址和寫數據。LCM12864支持字符模式和圖形模式,首
先選擇基本指令集,進入字符模式并寫數據;然后選擇擴展指令集,進入圖形模式,設置像
素地址并寫像素,相關的組件函數為:
(1)Display_LCM12864_Component_Initialize:初始化
(2)Display_LCM12864_Component_Read_Busy_Flag_Memory_Address:返回忙標志
(3)Display_LCM12864_Component_Control_Display_On_Off:打開顯示
(4)Display_LCM12864_Component_Set_Function:選擇指令集
(5)Display_LCM12864_Component_Set_Display_Data_Memory_Address:設置地址
(6)Display_LCM12864_Component_Write_Memory_Data:寫數據
(7)Display_LCM12864_Component_Clear_Display:清除顯示
(8)Display_LCM12864_Component_Set_Extended_Function:設置圖形模式
(9)Display_LCM12864_Component_Set_Graphic_Memory_Vertical_Address:設置垂 直地址
(10)Display_LCM12864_Component_Set_Graphic_Memory_Horizontal_Address:設置 水平地址

組件 Display_LCM12864_Component.c 依賴 Display_LCM12864_Library.c,這個庫完成 實際操作,為組件提供硬件抽象層接口。

2.4.4 實驗效果

(1)構建應用,注意 Build Output 窗口中的信息,代碼長度超出單片機 ROM 容量限制。
(2)在工程管理中刪除 STC_STC89C52RC_GPIO_Library.c,實驗中不需要 GPIO 庫。
(3)在工程列表的 Context 組中,雙擊打開 STC_STC89C52RC_Context.c,定位到第 201 行。
(4)Handle_UART_Interrupt_Context 函數用于處理 UART 中斷環境,實驗中不需要使用 UART,所以將這個函數的實現轉為注釋態,這樣可以降低代碼大小。
(5)重新構建應用,注意 Build Output 窗口中的信息,沒有錯誤和警告。
(6)關閉開發板電源開關,插上 LCM12864 液晶模塊,確認跳線 JP2 處于連接狀態,JP1 和 JP3 處于斷開狀態。
(7)在 STC-ISP 中打開 Nebula_Discover8051_V1.hex,點擊“下載/編程”按鈕。
(8)打開開發板電源開關,STC-ISP 顯示檢測信息并開始燒寫單片機 ROM。
(9)燒寫完畢,單片機自動開始運行。
(10)LCM12864 液晶模塊開始循環顯示信息,首先進入字符模式并顯示漢字,隨后進入圖 形模式并寫像素。
(11)將初始化函數的參數設置為 0,表示使用串行模式,重復上述過程,檢查運行效果。

清理工程輸出文件,刪除添加的三個文件,恢復 STC_STC89C52RC_GPIO_Library.c,將 STC_STC89C52RC_Context.c 中修改的內容恢復原狀,在主應用中將第 223 行恢復原狀,為 后續實驗做好準備.

2.5 Digit(數碼管)

2.5.1 硬件設計

1.046.jpg

數碼管模塊為共陽型,陽極電源由三極管 Q1 - Q6 控制,三極管為 PNP 型,當基極為低 電平時導通,為高電平時截止。三極管的基極電平由 P0_0 -P0_5 引腳控制,數碼管的陰極 電平由 D0 - D7 控制,即由 P1_0 - P1_7 引腳控制。

2.5.2 軟件準備

(1)將主應用的第 225 行轉為有效態。
(2)在工程的 Application 組中添加 Nebula_Discover8051_V1_Digit_Application.c,目 錄為SourceBoardNebulaDiscover8051_V1ApplicationDigit。

2.5.3 軟件設計

打開 Nebula_Discover8051_V1_Digit_Application.c,察看軟件實現。在循環中,依 次打開電源、寫數據、延時和關閉電源,控制數碼管顯示數字 0- 9 和小數點。相關的庫函 數為:
(1)GPIO_Library_Write_Pin:寫引腳
(2)GPIO_Library_Write_Port:寫端口
(3)Thread_Library_Suspend_Thread:掛起線程,用于毫秒級延時。

2.5.4 實驗效果

(1)構建應用,燒寫程序。
(2)確認開發板的跳線 JP3 處于連接狀態

(3)數碼管依次顯示信息 清除工程輸出文件,將工程列表恢復原狀,為后續實驗做好準備。


2.6 Buzzer(蜂鳴器)

2.6.1 硬件設計

1.050.jpg 本實驗使用無源蜂鳴器,所謂“無源”
是指蜂鳴器內部沒有發聲電路(音源), 需要在控制端產生特定頻率的信號,使得 蜂鳴器反復處于接通和斷開狀態,進而發 出聲音。

當控制信號頻率不同時,蜂鳴器的聲 音大小不同。當控制信號頻率為 2000Hz 時,蜂鳴器聲音最大。

蜂鳴器的電源由 PNP 三極管 Q7 控制,其基極電平由 P2_0 引腳控制,低電平時導通,高
電平時截止。

2.6.2 軟件準備

(1)將主應用的第 227 行轉為有效態
(2)在工程的 Application 組中添加 Nebula_Discover8051_V1_Buzzer_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationBuzzer。

2.6.3 軟件設計

打開蜂鳴器應用,察看軟件實現。在端口控制方面,沒有使用 GPIO 庫,而是通過位操 作直接完成的。GPIO 庫操作的速度慢于位操作,為了保證控制信號的頻率為 2000Hz,必須 使用位操作。為了避免線程被主線程搶占,在控制信號開始前關閉中斷,在控制信號結束后 打開中斷。另外,線程庫只能提供毫秒級延時,為了符合控制信號的要求,必須使用微秒級 延時函數。相關的庫函數為:
(1)Disable_Interrupt:關閉中斷
(2)Multiple_Delay:多次延遲,帶有一個參數,表示延遲數量,單位為微秒。
(3)Enable_Interrupt:打開中斷
(4)Thread_Library_Suspend_Thread:掛起線程

Disable_Interrupt、Multiple_Delay 和 Enable_Interrupt 函數屬于核心操作,在 STC_STC89C52RC_Core.h 中 聲 明 , 在STC_STC89C52RC_Core.asm 中 定 義 , 文 件 目 錄 為 SourceProcessorSTCSTC89C52RCCore。

在多線程環境中謹慎使用 Disable_Interrupt,關閉中斷的時間不宜太長,避免影響其 它線程的運行。

2.6.4 實驗效果

(1)構建應用,燒寫程序。
(2)確認跳線 JP4 處于連接狀態
(3)蜂鳴器開始發聲,間隔時間為 1 秒。

用戶可以體驗不同的操作帶來的效果差異,例如:不使用關閉中斷和打開中斷操作,用 GPIO 庫函數替換位操作,用線程庫的掛起功能替換Multiple_Delay 函數。通過這些操作, 有助于進一步熟悉星光操作系統。

清除工程輸出文件,將工程列表恢復原狀,為后續實驗做好準備。

2.7 Keypad(矩陣按鍵)

2.7.1 硬件設計

1.054.jpg 矩陣按鍵分成三行三列,分別由 P2.1 - P2.3 引腳和 P2.4 - P2.6 引 腳控制。單片機復位后,引腳的默認 值為 1,所以選擇 0 做為按鍵按下的 標志。
當行引腳輸出 0 時,循環檢測列 引腳,如果按鍵沒有按下,其值為 1; 如果按鍵按下,其值為0。當某一行 輸出 0 時,其它行必須輸出 1。

2.7.2 軟件準備

(1)在主應用中,定位到第 229 行,將該行轉為有效態。
(2)在工程的 Application 組中,添加 Nebula_Discover8051_V1_Keypad_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationKeypad。

2.7.3 軟件設計

打開 Nebula_Discover8051_V1_Keypad_Application.c,察看軟件實現。在行線輸出 0, 然后從列線讀入,0 表示按鍵已經按下,1 表示按鍵沒有按下。為了消除抖動,延遲 10 毫秒, 然后再次讀列線。如果仍然為 0,那么說明按鍵確實處于按下狀態。最后,通過數碼管顯示

按鍵編號。相關的函數如下:
(1)GPIO_Library_Write_Port:寫端口
(2)GPIO_Library_Read_Pin:讀引腳
(3)Thread_Library_Suspend_Thread:掛起線程

2.7.4 實驗效果

(1)構建應用,燒寫程序。
(2)確認開發板的跳線 JP3 處于連接狀態
(3)依次按下所有的按鍵,數碼管會顯示按鍵編號。

(4)等數碼管的顯示內容消失后再次按下按鍵,否則按鍵無效。 清除工程輸出文件,將工程恢復原狀,為后續實驗做好準備。


2.8 DS18B20(數字溫度傳感器)

1.058.jpg 2.8.1 硬件設計

DS18B20 是數字溫度傳感器,只需要 一根數據線便可完成信息的輸入和輸出。 單片機的 P2_7 引腳連接 DS18B20 的數據 引腳,R32 為上拉電阻。在 P2_7 引腳產 生不同的時序,即可傳輸命令和數據。

2.8.2 軟件準備

(1)在主應用中,定位到第 231 行,將該行轉為有效狀態。
(2)在 工 程 的 Library 組 中 , 添 加 Dallas_DS18B20_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryDallasDS18B20。
(3)在 工 程 的 Component 組 中 , 添 加 Dallas_DS18B20_Component.c , 目 錄 為 SourceComponentDallasDS18B20。
(4)在工程的 Application 組中,添加 Nebula_Discover8051_V1_DS18B20_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationDS18B20。

2.8.3 軟件設計

打開 Nebula_Discover8051_V1_DS18B20_Application.c,察看軟件實現,流程如下:

(1)初始化,0 表示 DS18B20 存在。
(2)檢測 ROM,計算校驗值。
(3)讀取和顯示電源狀態,0x00 表示寄生電源供電,0xFF 表示外部電源供電。
(4)設置溫度上限、下限和分辨率
(5)寫和讀 EEPROM,校驗 Scratchpad。
(6)轉換溫度,校驗 Scratchpad,計算溫度。
(7)通過數碼管顯示溫度值

在顯示溫度值時,使用核心函數 Disable_Interrupt 和 Enable_Interrupt,目的是禁 止當前線程被搶占,避免數碼管閃爍。

2.8.4 實驗效果

(1)構建應用,注意 Build Output 窗口的信息,代碼過長。
(2)打開 STC_STC89C52RC_Context.c,定位到第 201 行,將 UART 中斷處理部分轉為注釋 態。定位到第 587 行,將第 587 - 596 行轉為注釋態。定位到第 604 行,將第 604 - 613 行轉為注釋態。
(3)定位到第 293 行,將第 293 - 312 行轉為注釋態,實驗中沒有使用外部 2 中斷。
(4)再次構建應用,燒寫程序。
(5)確認開發板的跳線 JP1、JP3 和 JP5 處于連接狀態
(6)顯示溫度值前,LED 顯示二進制編碼,表示操作結果;顯示溫度值時,可以忽略 LED, 注意觀察數碼管。

清除工程輸出文件,將 STC_STC89C52RC_Context.c 恢復原狀,將工程恢復原狀,為后 續實驗做好準備。

2.9 HS0038B(紅外線解碼)

2.9.1 硬件設計

1.062.jpg HS0038B 是紅外線接收器,載波頻率 為 38KHz,接收到載波時輸出低電平,否 則輸出高電平。

單片機的 P3_2 引腳可以接收中斷信 號,低電平有效,將其連接到 HS0038B 的 輸出引腳,當紅外線載波到達時,會接收 到中斷。

2.9.2 軟件準備

(1)在主應用中,定位到第 233 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_Trigger_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryTrigger。
(3)在 工 程 的 Library 組 中 , 添 加 Vishay_HS0038B_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryVishayHS0038B。
(4)在 工 程 的 Component 組 中 , 添 加 Vishay_HS0038B_Component.c , 目 錄 為 SourceComponentVishayHS0038B。
(5)在工程的 Application 中,添加 Nebula_Discover8051_V1_Infrared_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationInfrared。

2.9.3 軟件設計

打開 Nebula_Discover8051_V1_Infrared_Application.c,察看軟件實現。第一步:等 待觸發,即等待中斷信號;第二步:解碼紅外線信息;第三步:檢查解碼后的數據是否有效; 第四步:顯示數據。

本實驗依賴單片機的外部中斷功能,對應的函數為 Trigger_Library_Wait_Trigger, 帶有一個參數,表示中斷源,這里為 External_0_Interrupt。

2.9.4 實驗效果

(1)構建應用,燒寫程序。
(2)確認跳線 JP1 和 JP5 處于連接狀態
(3)將紅外線遙控器的電池保護墊片取下,按下任意鍵,LED 會顯示二進制編碼信息。等 顯示信息消失后,再按其它按鍵,否則按鍵無效。
(4)遙控器的按鍵信息分為“單發”和“連發”,短按時為單發,長按時為連發。單發時, LED 全滅;連發時,會有一個 LED 亮。

清除工程輸出文件,將工程恢復原狀,為后續實驗做好準備。

2.10 Key(簡單按鍵)

2.10.1 硬件設計

1.072.jpg

2.10.2 軟件準備

單片機復位后,P3_3 引腳默認值 為 1,當按鍵按下時,其值為 0,通 過讀取引腳值便可獲取按鍵狀態。

(1)在主程序中,定位到第 235 行,將該行轉為有效態。
(2)在工程的 Application 組中,添加 Nebula_Discover8051_V1_Key_Application.c,目 錄為SourceBoardNebulaDiscover8051_V1ApplicationKey。

2.10.3 軟件設計

打開 Nebula_Discover8051_V1_Key_Application.c,察看軟件實現。第一步:讀引腳 值;第二步:消除抖動;第三步:再次讀引腳值;第四步:顯示按鍵狀態。

2.10.4 實驗效果

(1)構建應用,燒寫程序。
(2)確認跳線 JP1 處于連接狀態

(3)按下或者釋放按鍵,觀察 LED 的顯示狀態。 清除工程輸出文件,將工程恢復原狀,為后續實驗做好準備。


2.11 Power(掉電和喚醒)

2.11.1 硬件設計

本實驗使用與前一個實驗相同的硬件電路,此處省略。需要注意的是,單片機的 P3_3 引腳可以接收中斷信號,低電平有效,這個中斷信號將單片機從掉電狀態中喚醒。

2.11.2 軟件準備

(1)在主應用中,定位到第 237 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_Power_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryPower。
(3)在工程的 Application 中,添加 Nebula_Discover8051_V1_Power_Application.c,目 錄為SourceBoardNebulaDiscover8051_V1ApplicationPower。

2.11.3 軟件設計

打開 Nebula_Discover8051_V1_Power_Application.c,察看軟件實現。在掉電前,點 亮一個 LED,持續 1 秒,以此做為準備標志;隨后進入掉電狀態,等待被中斷喚醒。喚醒后, 再次重復這一過程。

2.11.4 實驗效果

(1)構建應用,燒寫程序。

(2)觀察 LED,等待顯示準備標志。LED 熄滅后,按下按鍵,觀察 LED 的變化。 清理工程輸出,將工程恢復原狀,為后續實驗做好準備。


2.12 AT93C46(EEPROM)

2.12.1 硬件設計

1.079.jpg AT93C46 是 3 線串行 EEPROM,內部組 織為 8 位或 16 位單元,組織方式由 ORG 引腳控制。當 ORG連接 VCC 時,內部為
16 位單元;當連接 GND 時,內部為 8 位 單元。

CS 為片選,高電平有效;SK 為串行時鐘,DI 和 DO 為數據輸入和輸出引腳,這 4 個引 腳連接到單片機的 P3_4 - P3_7 引腳,單片機內部提供上拉電阻。

2.12.2 軟件準備

(1)在主應用中,定位到第 239 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 Atmel_AT93C46_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryAtmelAT93C46.

(3)在 工 程 的 Component 組 中 , 添 加 Atmel_AT93C46_Component.c , 目 錄 為
SourceComponentAtmelAT93C46。
(4)在工程的 Application 組中,添加 Nebula_Discover8051_V1_AT93C46_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationAT93C46。

2.12.3 軟件設計

打開 Nebula_Discover8051_V1_AT93C46_Application.c,察看軟件實現。首先復位, 然后擦除和寫入存儲器,最后讀存儲器并顯示數據。相關的組件函數為:
(1)Atmel_AT93C46_Component_Reset:復位
(2)Atmel_AT93C46_Component_Enable_Erase_Write_Memory:允許擦除和寫存儲器
(3)Atmel_AT93C46_Component_Erase_All_Memory:擦除存儲器
(4)Atmel_AT93C46_Component_Write_Memory_8_Bit:寫存儲器
(5)Atmel_AT93C46_Component_Disable_Erase_Write_Memory:禁止擦除和寫存儲器

2.12.4 實驗效果

(1)構建應用,注意 Build Output 窗口的輸出,代碼過長。
(2)打開 STC_STC89C52RC_Context.c,定位到第 201 行,將第 201 - 259 行轉為注釋態。
(3)再次構建應用,燒寫程序。
(4)確認跳線 JP1 處于連接狀態

(5)LED 顯示 EEPROM 內容的二進制編碼,范圍為 0x00 - 0xFF。 清理工程,將工程恢復原狀,為后續實驗做好準備。


2.13 AT24C02(EEPROM)

2.13.1 硬件設計

1.083.jpg

AT24C02 是 IIC 接口的串行 EEPROM,內部具有 2K 位,即 256 個字節。WP 為寫保護引腳, 高電平時禁止寫入,低電平時允許寫入。SDA 為串行數據引腳,SCL 為串行時鐘引腳,分別 連接單片機的 P0_6 和 P0_7,這兩個引腳帶有外部上拉電阻。A0、A1 和 A2 為地址引腳,都 連接到地,所以 AT24C02 的總線地址為 0。

2.13.2 軟件準備

(1)在主應用中,定位到第 241 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 Atmel_AT24C02_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryAtmelAT24C02。
(3)在 工 程 的 Component 組 中 , 添 加 Atmel_AT24C02_Component.c , 目 錄 為 SourceComponentAtmelAT24C02。
(4)在工程的 Application 組中,添加 Nebula_Discover8051_V1_AT24C02_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationAT24C02。

2.13.3 軟件設計

打開 Nebula_Discover8051_V1_AT24C02_Application.c,察看軟件實現。第一步:復 位,第二步:寫入數據,第三步:讀出數據,第四步:顯示數據。相關的組件函數為:
(1)Atmel_AT24C02_Component_Reset:復位
(2)Atmel_AT24C02_Component_Write_Data:寫數據
(3)Atmel_AT24C02_Component_Read_Data:讀數據

2.13.4 實驗效果

(1)構建應用,注意 Builid Output 窗口的輸出信息,代碼過長。
(2)打開 STC_STC89C52RC_Context.c,定位到第 201 行,將第 201 - 259 行轉為注釋態。
(3)再次構建應用。
(4)確認跳線 JP1 和 JP8 處于連接狀態

(5)下載程序,LED 顯示 EEPROM 數據的二進制編碼,范圍為 0x00 - 0xFF。 清理工程,將工程恢復原狀,為后續實驗做好準備。


2.14 DS1302(實時時鐘)

2.14.1 硬件設計

1.087.jpg

DS1302 是 3 線實時時鐘(RTC),可以保存年、月、日、星期、時、分和秒信息,自動
處理閏年情況,帶有 31 個 8 位 RAM 字節,還具有涓流充電功能。RST 為復位引腳,低電平
有效;I/O 為輸入/輸出引腳,SCLK 為串行時鐘。VCC1 與電解電容 C20 相連,該電容起到后 備電池的作用。單片機的 P4_4 - P4_6 帶有內部上拉電阻,連接到 DS1302 的 3 個通信引腳, 完成讀寫數據功能。

2.14.2 軟件準備

(1)在主應用中,定位到第 243 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 Dallas_DS1302_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryDallasDS1302。
(3)在 工 程 的 Component 組 中 , 添 加 Dallas_DS1302_Component.c , 目 錄 為 SourceComponentDallasDS1302。
(4)在工程的 Application 組中,添加 Nebula_Discover8051_V1_DS1302_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationDS1302。

2.14.3 軟件設計

打開 Nebula_Discover8051_V1_DS1302_Application.c,察看軟件實現。首先清除寫保 護,設置時間;然后啟動時鐘;之后讀取時間并在 LED 上顯示;最后寫和讀 RAM,在 LED 上 顯示數據。相關的組件函數為:
(1)Dallas_DS1302_Component_Read_Clock_Register:讀時鐘
(2)Dallas_DS1302_Component_Write_Clock_Register:寫時鐘
(3)Dallas_DS1302_Component_Write_RAM_Register:寫 RAM
(4)Dallas_DS1302_Component_Read_RAM_Register:讀 RAM

2.14.4 實驗效果

(1)構建應用,注意 Build Output 窗口的輸出信息,代碼過長。
(2)打開 STC_STC89C52RC_Context.c,定位到第 201 行,將第 201 - 259 行轉為注釋態。
(3)再次構建應用
(4)確認跳線 JP1 和 JP9 處于連接狀態
(5)在 STC-ISP 左側的硬件選項中,選擇“ALE 腳用作 P4.5 口”,然后下載程序。
(6)由于修改了硬件選項,需要再次斷電,然后重新上電,程序才會正確運行。

(7)LED 會以二進制形式顯示數據 清理工程,將工程恢復原狀,為后續實驗做好準備.


2.15 28BYJ48(步進永磁減速電機)

2.15.1 硬件設計

開發板上沒有電機驅動芯片,需要用戶自行購買電機驅動模塊,單片機的 P3_4 - P3_7 引腳用作數據口。

2.15.2 軟件準備

(1)在主應用中,定位到第 245 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 Motor_28BYJ48_Library.c , 目 錄 為SourceBoardNebulaDiscover8051_V1LibraryMotor8BYJ48。
(3)在 工 程 的 Component 組 中 , 添 加 Motor_28BYJ48_Component.c , 目 錄 為 SourceComponentMotor8BYJ48。
(4)在工程的 Application 組中,添加 Nebula_Discover8051_V1_Motor_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationMotor。


2.15.3 軟件設計


打開 Nebula_Discover8051_V1_Motor_Application.c,察看軟件實現。首先逆時針旋 轉 360 度,清除脈沖,延時;然后順時針旋轉 360 度,清除脈沖,延時。在循環中重復上述 過程,相關的組件函數為:
(1)Motor_28BYJ48_Component_Counterclockwise_Step:逆時針步進,帶有一個參數, 表示步進延時,單位為毫秒。
(2)Motor_28BYJ48_Component_Clear_Pulse:清除脈沖
(3)Motor_28BYJ48_Component_Clockwise_Step:順時針步進,帶有一個參數,表示 步進延時,單位為毫秒。


2.15.4 實驗效果


(1)構建應用
(2)下載程序

(3)電機逆時針旋轉 360 度,然后順時針旋轉 360 度,并重復這一過程。 清理工程,將工程恢復原狀,為后續實驗做好準備。



2.16 UART(串口)


2.16.1 硬件設計


1.097.jpg

單片機內部帶有一個 UART,對應引腳為 P3_0(RxD)和 P3_1(TxD),通過 USB-UART 轉 換芯片 CH340G 與上位機通信。


2.16.2 軟件準備


(1)在主應用中,定位到第 247 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_UART_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryUART。
(3)在工程的 Application 組中,添加 Nebula_Discover8051_V1_UART_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationUART。


2.16.3 軟件設計


打開 Nebula_Discover8051_V1_UART_Application.c,察看軟件實現。第一步:發送數 據;第二步:接收數據,顯示數據數量和值;第三步:發送該數據。在循環中重復上述過程, 相關的庫函數為:
(1)UART_Library_Write_UART:發送數據,帶有兩個參數,分別表示數據指針和數據 數量。
(2)UART_Library_Read_UART:接收數據,帶有三個參數,分別表示數據指針、數據 數量和線程延遲(單位為毫秒),返回值表示實際的數據數量。第二個參數(線程延遲)是 接收數據時的最大等待時間,0 表示沒有限制,非 0 表示具體的超時時間,超時后該函數自 動返回,此時的返回值為0。


2.16.4 實驗效果


(1)構建工程,下載程序。
(2)在 STC-ISP 中選擇“串口助手”,接收緩沖區和發送緩沖區中都選擇“文本模式”,在 發送緩沖區中輸入任意字符,例如“1”。將波特率設置為9600,點擊“打開串口”按鈕, 最后點擊發送緩沖區中的“自動發送”按鈕。
(3)確認跳線 JP1 處于連接狀態,LED 會顯示接收數據的二進制編碼。

(4)在接收緩沖區中顯示傳輸的數據 清理工程,將工程恢復原狀,為后續實驗做好準備。


2.17 ISP(EEPROM)


2.17.1 硬件設計


單片機內部帶有 4K 字節的 EEPOM,不需要外部電路。


2.17.2 軟件準備


(1)在主應用中,定位到第 249 行,將該行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_ISP_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryISP。
(3)在工程的 Application 組中,添加 Nebula_Discover8051_V1_ISP_Application.c,目 錄為SourceBoardNebulaDiscover8051_V1ApplicationISP。


2.17.3 軟件設計


打開 Nebula_Discover8051_V1_ISP_Application.c,察看軟件設計。第一步:顯示準 備標志;第二步:擦除 EEPROM;第三步:編程 EEPROM;第四步:顯示 EEPROM 數據,復位。 相關的庫函數為:
(1)ISP_Library_Erase_EEPROM:擦除 EEPROM
(2)ISP_Library_Program_EEPROM:編程 EEPROM
(3)ISP_Library_Read_EEPROM:讀 EEPROM
(4)ISP_Library_Request_Reset:請求復位


在使用 ISP 庫函數時,需要確定“等待時間”這個參數,請查閱單片機數據手冊的 ISP 部分,本實驗中所用的參數值僅供參考。


2.17.4 實驗效果


(1)構建應用,下載程序。
(2)確認跳線 JP1 處于連接狀態

(3)LED 顯示準備標志,隨后顯示 EEPROM 數據的二進制編碼,范圍為 0x00 - 0xFF。 清理工程,將工程恢復原狀,為后續實驗做好準備。


2.18 Semaphore(信號量)


2.18.1 硬件設計


使用數碼管,無其它電路。


2.18.2 軟件準備


(1)在主應用中,定位到第 251 行,將第 251 - 253 行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_Semaphore_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibrarySemaphore。
(3)在 工 程 的 Application 組 中 , 添 加 Nebula_Discover8051_V1_Semaphore_Application.c , 目 錄 為SourceBoardNebulaDiscover8051_V1ApplicationSemaphore。


2.18.3 軟件設計


打開 Nebula_Discover8051_V1_Semaphore_Application.c,察看軟件實現。在應用中 建立兩個線程,即:主線程(不是主應用中的 main 線程)和從線程,這兩個線程控制同一 個數碼管,但是前者顯示偶數,后者顯示奇數。


數碼管(包括全局變量 Digit_Index)是共享資源,對應一個信號量,其值為 1,表示 資源數量為 1,在主應用的第 251 行建立。主線程和從線程以固定方式使用共享資源,即: 申請資源、使用資源和釋放資源,其中申請資源可稱為進入臨界區,釋放資源可稱為退出臨 界區。相關的庫函數為:
(1)Semaphore_Library_Decrease_Semaphore:減少信號量
(2)Semaphore_Library_Increase_Semaphore:增加信號量


2.18.4 實驗效果


(1)構建應用,下載程序。
(2)確認跳線 JP3 處于連接狀態

(3)數碼管交替顯示偶數和奇數


清理工程,將工程恢復原狀,為后續實驗做好準備。


2.19 Barrier(屏障)


2.19.1 硬件設計


使用蜂鳴器和數碼管,無其它電路


2.19.2 軟件準備


(1)在主應用中,定位到第 255 行,將第 255 - 257 行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_Barrier_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryBarrier。
(3)在工程的 Application 組中,添加 Nebula_Discover8051_V1_Barrier_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationBarrier。


2.19.3 軟件設計


打開 Nebula_Discover8051_V1_Barrier_Application.c,察看軟件實現。在應用中建 立兩個線程,即:主線程(不是主應用中的 main 線程)和從線程,前者控制蜂鳴器,后者 控制數碼管。


屏障在主應用的第 255 行建立,其值為 2,表示線程數量為 2。在當前循環中,主線程 運行時間短,從線程運行時間長。通過使用屏障,主線程運行結束后不會立刻再次運行,而 是等待從線程,只有從線程運行結束,兩個線程才會同時通過屏障,然后開始新的循環。相 關的庫函數為:
(1)Barrier_Library_Break_Barrier:突破屏障


注意,本實驗的目的是演示屏障的使用效果,所以對蜂鳴器的控制很簡單,只是打開和 關閉而已,沒有提供 2000Hz 的發聲信號,蜂鳴器發出的聲音較小。


2.19.4 實驗效果


(1)構建應用,下載程序。
(2)確認跳線 JP3 和 JP4 處于連接狀態
(3)蜂鳴器發出兩次聲音,隨后暫停運行;數碼管顯示數字 0 - 9,顯示完成后,蜂鳴器 才會再次發聲。


清理工程,將工程恢復原狀,為后續實驗做好準備。


2.20 Mailbox(信箱)


2.20.1 硬件設計


使用 LED,無其它電路。


2.20.2 軟件準備


(1)在主應用中,定位到第 259 行,將第 259 - 261 行轉為有效態。
(2)在 工 程 的 Library 組 中 , 添 加 STC_STC89C52RC_Mailbox_Library.c , 目 錄 為 SourceProcessorSTCSTC89C52RCLibraryMailbox。
(3)在工程的 Application 組中,添加 Nebula_Discover8051_V1_Mailbox_Application.c, 目錄為SourceBoardNebulaDiscover8051_V1ApplicationMailbox。


2.20.3 軟件設計


打開 Nebula_Discover8051_V1_Mailbox_Application.c,察看軟件實現。在應用中建 立兩個線程,即:主線程(不是主應用中的 main 線程)和從線程,前者打開 LED,后者關 閉 LED,兩個線程通過信箱進行通信。信箱在主應用的第 259 行建立,相關的庫函數為:
(1)Mailbox_Library_Write_Mailbox:寫信箱
(2)Mailbox_Library_Read_Mailbox:讀信箱


2.20.4 實驗效果


(1)構建應用,下載程序。
(2)確認跳線 JP1 處于連接狀態

(3)LED 依次亮和滅 清理工程,將工程恢復原狀,為用戶自定義實驗做好準備。


3聯系方式


歡迎技術交流,如果在使用過程中存在疑問或者發現錯誤,請使用如下聯系方式:
(2)QQ群:星云電子工作室(651705849


0.png

為了便于技術交流,請加QQ群:651705849,星云電子工作室。

全部資料下載地址:
Discover8051 V1.zip (2.9 MB, 下載次數: 117)



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2017-9-3 16:51 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:230641 發表于 2017-9-3 17:13 | 顯示全部樓層
admin 發表于 2017-9-3 16:51
好資料,51黑有你更精彩!!!

帖子的初始標題和內容比現在簡單,后臺編輯主動替我做了很多修改工作,非常感謝。
回復

使用道具 舉報

ID:262 發表于 2017-9-6 03:01 | 顯示全部樓層
粗略的看了一下,感嘆51內核操作系統又多了一員猛將啊,希望樓主和咱們一起把星光系統發揚光大.
回復

使用道具 舉報

ID:90140 發表于 2017-9-6 07:59 | 顯示全部樓層
51黑有你更精彩!!!
回復

使用道具 舉報

ID:14237 發表于 2017-9-6 08:53 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:230641 發表于 2017-9-6 13:38 | 顯示全部樓層
heicad 發表于 2017-9-6 03:01
粗略的看了一下,感嘆51內核操作系統又多了一員猛將啊,希望樓主和咱們一起把星光系統發揚光大.

謝謝支持,可以加入QQ群,方便交流。
回復

使用道具 舉報

ID:87745 發表于 2017-9-8 23:10 來自觸屏版 | 顯示全部樓層
51有你更精彩
回復

使用道具 舉報

ID:65845 發表于 2017-9-18 18:40 | 顯示全部樓層
牛,謝謝分享。
回復

使用道具 舉報

ID:218360 發表于 2017-9-20 20:50 | 顯示全部樓層
希望下載下來,對我學習單片機有效,謝謝
回復

使用道具 舉報

ID:230641 發表于 2017-9-21 14:10 | 顯示全部樓層
打雜的 發表于 2017-9-20 20:50
希望下載下來,對我學習單片機有效,謝謝

如果遇到問題,可以加入QQ群,方便交流。
回復

使用道具 舉報

ID:378965 發表于 2019-2-1 20:38 | 顯示全部樓層
下載下來 玩玩
回復

使用道具 舉報

ID:93034 發表于 2019-4-4 01:40 | 顯示全部樓層
牛逼轟轟!
回復

使用道具 舉報

ID:116347 發表于 2019-10-23 15:04 | 顯示全部樓層
heicad 發表于 2017-9-6 03:01
粗略的看了一下,感嘆51內核操作系統又多了一員猛將啊,希望樓主和咱們一起把星光系統發揚光大.

好東西,學習一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美中文字幕一区二区 | 国产一区二区自拍 | 欧州一区二区三区 | 精品三级在线观看 | 国产 日韩 欧美 制服 另类 | 色爱综合 | 亚洲国产精品va在线看黑人 | 中文字幕av色 | 久久久久国产精品一区二区 | 91精品国产91久久久久久三级 | 日本在线小视频 | 精品一二区 | 狠狠狠色丁香婷婷综合久久五月 | 久久国产成人 | 国产成人99久久亚洲综合精品 | 日韩性在线 | 天天久 | 国产成人午夜精品影院游乐网 | 久久久久久成人 | 污免费网站 | 久久久久久久综合色一本 | 亚洲国产精品成人 | 男女羞羞视频大全 | 久久综合爱| 亚洲一区久久 | 天天射天天操天天干 | 美女视频一区二区 | 亚洲五码在线 | 国产第1页 | 亚洲精品电影网在线观看 | 深爱激情综合 | 精品日韩一区 | 欧美一级二级在线观看 | 99精品国自产在线观看 | 懂色中文一区二区三区在线视频 | 久久五月婷 | 免费一级片| 日本免费黄色一级片 | 正在播放国产精品 | 中文字幕av色 | 超碰97人人人人人蜜桃 |