图书简介:
目 录
项目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
展开
前 言
程序设计是理工科专业学生都要学习的课程。C语言既有高级语言的特性,接近自然语言和数学公式计算机语言,又有直接操纵硬件的能力,并以其丰富灵活的控制和数据结构、简洁高效的语句表达、清晰的程序结构和良好的可移植性被选为程序设计首选语言。程序设计学习是有难度的,鉴于高职学生的学习特点和就业岗位的针对性,程序设计类课程更需要针对性地应用落地学习才更有效。且C语言也是智能控制产品或系统的软件开发首选编程语言,故本书将C语言程序设计与最基础的51内核单片机知识融合。
本教材有如下特点:
1. 重渔——程序设计方法
曾有学生在有程序设计内容的课堂上问“你是怎么想到的?”他这是求捕鱼之法,而不是简单的“怎么写?”“求鱼”!这一问也道出了程序设计教学的根本所在——“教学生如何想到的思维方法,进而训练其编程能力”。故“思维训练”是本教材的核心,按照程序开发流程:问题→算法设计→数据抽象→流程设计→语句选择→程序书写→调试、测试与判定→总结,解决学生 “怎么想?(思想方法)怎么写(编程落地)?”的疑问,培养学生分析和解决问题的捕鱼能力,而不是直接给鱼,即“例程”!同时,本书也努力建立全局意识,先整体后模块,通过算法设计、程序框架、程序流程等强调从整体上把控设计,而不是只记得零星的句式或语法;还特地安排强化逻辑思维训练项目,包括“歌星大赛计分”、“推理车号”、“谁是罪犯”、“百钱百鸡”、“数据排序”等任务,既为掌握程序设计的思想和方法来培养程序员,更重要的是训练思维解决实际问题,培养学生探索创新精神和实践能力。这对每个人都非常有用。
2.理论、仿真、实践相融合
针对高职学生乐于形象思维,适合在做中学的学习特点,本书应用最先进的单片机和嵌入式系统及电子电路仿真软件PROTEUS作为仿真教学与仿真实践的平台,将各种仿真调试工具融入其中,培养学生会想、会写、会调、会测试的综合能力。
仿真设计实践使学习如虎添翼,通过仿真实践快速完成程序设计,再经开发板实物测试,虚实无缝对接,使虚拟仿真落地生根,有效增强学习信心,培养学生程序设计能力。
3.趣味任务驱动,循序渐进
本书共设计了8个项目,包括42个任务、32个进阶任务,实用、上手快,与实际接轨,即学即用。项目任务的选取融合了知识、技术、技能、趣味性,如对象与工具、花样灯、键控灯、思维训练、小球计数、秒闪灯、测量正脉冲宽度、看谁反应快、键控PWM调光灯、可调时钟、多功能秒表、打地鼠游戏、生日快乐歌、串口控制8×8点阵、LCD显示的简易电压表、简易波形发生器等。
遵循学习规律和人的发展规律,以项目为导向,将知识点与技能、技巧、规范融入任务中,化解学习难度,通过完成任务来学习知识、训练技能、培养专业素养,力求让读者在完成每一个任务项目的实践中解决若干个技术难点。整体内容组织由易到难,由浅入深,由单一到综合,循序渐进,可操作性强。每一个任务都以步步高式层次化内容及组织安排,在进阶设计环节设置了思路点拨,满足不同能力学生的提升需求,举一反三,触类旁通。
4.注意工程意识的培养,强调编程书写规范、模块化设计
源码编写注重规范,有注释有说明有层次,引导学生规范的意识。
全书共8个项目,项目1是认识编程载体——单片机和编程开发环境,项目2~3是花样灯及键控灯,训练单片机输入/输出口应用及C51的基本运算、函数和语句结构。项目4~5突出算法设计、流程设计及测试,项目4是逻辑思维训练,包含数据类型、数据的存储模式&存储器类型、外部函数调用、数组、穷举、排序、逻辑运算、数据串口输出检测等;项目5主要是定时&计数器、外中断等内部资源应用。项目6~8为综合应用,突出结构化程序设计、程序框架设计,包含的主要技术有指针应用、动态扫描、键盘、串口应用、LCD、串行AD、DA等。其中一些实用模块头文件如dly_nms.h、seg_dis.h、key16.h、lcd1602.h、ADC0831.h、serial_init.c可移植到其他项目中。各任务的源程序均通过仿真测试、实物运行成功,保证正确性。
5.强调程序调试
运行测试异常或运行有问题时需要进行调试,而源码调试是解决问题的重要方法。本书讲解了Keil调试、PROTEUS调试及用串口助手实时监测数据。
本书项目1及2.1~2.2节、6.3~6.6节由周灵彬编写,2.3~2.7节及项目3.1~3.5节由刘红兵编写,3.6~3.9节及项目4由江伟编写,项目5和附录由蒋鸣东编写,项目7~8由疏晓宇编写。配套的实验板由周灵彬设计,全书由周灵彬主编并统稿。何炜杰、周晨翔、罗冬冬、潘蒙坤、陈文俊、沈翃等同学对本书所有程序进行了验证与调试。
感谢徐爱钧教授和王荣华工程师提出许多宝贵意见!
感谢张靖武教授鼓励和指导!
感谢绍兴职业技术学院与绍兴市教育局的重视与政策支持!感谢家人的默默付出与支持!感谢可爱的同学的配合与建议!感谢广州市风标电子技术有限公司、浙江利勃海尔中车交通公司、祈禧电器公司的大力支持!
本书可作为各类大专院校、高职高专院校、各类培训用C51程序设计教学用书,也可作为单片机技术应用的爱好者、程序发烧友的自学用书。相信通过本书的学习,读者能掌握51单片机的基本硬件知识,具备C51程序设计的基本技能。
由于作者水平有限,书中难免存在的谬误之处,敬请读者批评指正!
编 者
2016.6
展开