找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18313|回复: 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, 下载次数: 116)

评分

参与人数 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 单片机教程网

快速回复 返回顶部 返回列表