第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--);
……