《迷人的8051单片机》——导读

前  言

在单片机的“江湖”中,8051单片机历来都是兵家必争之地。这是因为8051单片机有着悠久的历史和最为庞大的用户群,很多时候它已经成为8位单片机领域的一种行业标准,众多器件都会以8051单片机为例给出驱动代码。作为单片机的初学者,选择从8051单片机起步绝对是一个非常正确的选择。
本书将采用一个全新的方式,带领你从零基础开始学习单片机和C语言编程,不仅让你在学习的过程中认识常用的电子元器件及其识别方式,而且使你快速地掌握8051单片机原理以及如何使用C语言来为其编写程序。当阅读完本书的全部内容后,你将会真正体会到8051单片机的经典传承和“电子DIY”的无穷魅力,从而使你走上电子研发工程师的梦想之旅!
全书共计四篇28章,第一篇是入门篇,主要介绍基础的电子元器件、DIY常用的工具、C语言基础知识,以及如何使用μVision2集成开发环境为8051系列单片机开发应用程序。第二篇是基础篇,重点介绍8051系列单片机内中断、定时器、串行口等的原理及应用。第三篇是应用篇,重点介绍基础的数字电路,以及如何扩展8051系列单片机的I/O口数量并提高总线的驱动能力等。第四篇是提高篇,主要介绍如何利用8051系列单片机强大的编程能力来模拟常用的总线时序,以实现与外围数字器件的通信。
本书不拘泥于概念和原理的探究,而是立足于实践,从系统板和基础电路起步,一章一个例子、一章一个实验、一章一小结、一个模块一套或多套代码,每篇结尾处还有综合的实验环节,让你低投入、快速入门8051系列单片机的开发。
本书定位于学生或电子爱好者的入门指导书,阅读本书没有学历、基础知识的限制,只要享受阅读、勤于动手,读者有无基础都可以在短时间内入门8051系列单片机的开发。本书使用流行的C语言编写全部代码,因此本书还是一本C语言的开发实践书,为用户在今后进行嵌入式开发和程序代码的移植带来方便。
本书的配套视频教程是《我和单片机的21天之旅》,读者可以到优酷网下载观看,该视频教程自2009年在优酷网上推出以来,深受大专院校师生和广大单片机爱好者的喜爱,本书是在该视频教程的基础上,进行了进一步的内容充实和归纳整理,是视频教程的凝练和升华。
由于作者水平所限,加之写作时间仓促,书中难免存在错误,在此恳请读者和有识之士给予批评斧正,也欢迎大家通过互联网与我分享8051系列单片机的开发心得。
本书得以出版,要特别感谢机械工业出版社华章公司缪杰以及幕后的工作人员,他们对本书的选题、立意、编写以及后续的修改给予了大力支持和指导。另外要感谢的是我的哥哥高显功,作为高级电气工程师并出于浓厚的亲情,在百忙的研发工作中抽出了宝贵的时间,担任了本书的校对工作,并对本书的编写方法提出了很多有价值的指导意见。最后要感谢我的家人,在我奋笔疾书的日日夜夜,照顾了我的饮食起居,让我能更加专注于本书的创作。
尺有所短,寸有所长。如果你时常会对电子设备萌发出一些新奇的想法或创意,请一定将其捕捉起来,并通过本书的阅读和实践,努力地将其变为现实,这也许就是你走上研发之路的起点,你的人生也会因此变得更加精彩纷呈。再次感谢您选择阅读本书,祝学业有成,事业顺达!

高显生
2016年4月于哈尔滨

目  录

前言
第一篇 一切从“芯”开始
第1章 缤纷电世界
1.1 电路中的秘密
1.1.1 欧姆定律
1.1.2 电压、电阻和电流
1.2 小元器件有大智慧
1.2.1 电阻器
1.2.2 电位器
1.2.3 电容器
1.2.4 电感器
1.2.5 继电器
1.2.6 蜂鸣器
1.2.7 晶体振荡器
第2章 神秘的半导体
2.1 二极管
2.1.1 二极管的原理
2.1.2 二极管的功能
2.1.3 发光二极管
2.1.4 稳压二极管
2.2 晶体管
2.2.1 晶体管的原理
2.2.2 晶体管的功能
2.3 场效应晶体管
2.3.1 结型场效应晶体管
2.3.2 绝缘栅型场效应晶体管(MOS管)
2.4 集成电路
2.4.1 集成电路的特点
2.4.2 集成电路的分类
2.5 模拟与数字
2.5.1 模拟信号
2.5.2 数字信号
2.5.3 模拟电子电路
2.5.4 运算放大器
2.5.5 数字电子电路
2.5.6 逻辑状态0和1
2.5.7 逻辑门
第3章 入门C语言
3.1 数据和运算
3.1.1 C语言的由来
3.1.2 数的进制
3.1.3 码制
3.1.4 数据类型
3.1.5 常量
3.1.6 变量
3.1.7 运算符
3.1.8 复合赋值运算符
3.2 语句
3.2.1 控制语句
3.2.2 其他语句
3.3 函数
3.3.1 自定义函数
3.3.2 函数的声明和调用
3.4 程序
3.4.1 程序的构成
3.4.2 程序的注释
3.4.3 局部变量和全局变量
3.5 预处理命令
3.5.1 宏定义
3.5.2 文件包含
3.6 构造类型数据
3.6.1 数组
3.6.2 结构体
3.6.3 共用体
第4章 8051单片机
4.1 内部架构
4.1.1 运算和控制
4.1.2 8051的由来
4.1.3 冯·诺依曼结构
4.1.4 8051的功能组件
4.2 8051的引脚功能
4.2.1 引脚排列
4.2.2 I/O口的内部结构
4.3 基本运行电路
4.3.1 时钟电路
4.3.2 时序
4.3.3 复位电路
第5章 DIY最小系统
5.1 元器件的布放
5.1.1 PCB
5.1.2 洞洞板
5.1.3 面包板
5.2 工具和材料
5.2.1 焊接的工具
5.2.2 焊接的方法
5.2.3 测量工具
5.3 搭建最小系统
5.3.1 确定目标单片机
5.3.2 ISP下载
5.3.3 面包板上的8051
第6章 第一个C程序
6.1 集成开发环境
6.1.1 软件开发流程
6.1.2 工具集
6.2 C51功能扩展
6.2.1 数据类型
6.2.2 存储器类型
6.2.3 存储模式
6.2.4 中断服务程序
6.3 编写C程序
6.3.1 安装集成开发环境
6.3.2 安装ISP下载软件
6.3.3 软件开发项目的建立
6.3.4 编写C程序
6.3.5 程序的编译
6.3.6 烧写目标芯片
第二篇 经典的内部架构
第7章 软件仿真
7.1 位操作
7.1.1 DIY更加可靠的系统
7.1.2 位处理机
7.1.3 位寻址的应用
7.2 软件仿真的方法
7.2.1 μVision2调试器
7.2.2 调试工具
7.2.3 单步调试
7.2.4 使用断点调试
7.2.5 使用监视窗口调试
7.2.6 调试按钮的功能
7.2.7 寄存器的初始状态
7.3 库函数
7.3.1 库函数的分类
7.3.2 库函数的使用
7.3.3 头文件
第8章 驱动数码管
8.1 数码管的原理
8.1.1 内部结构
8.1.2 显示方式
8.1.3 段码
8.2 数码管的驱动
8.2.1 静态显示实例
8.2.2 动态显示实例
第9章 按键解码
9.1 键盘的原理
9.1.1 按键的确认
9.1.2 按键抖动的消除
9.1.3 键盘接口
9.2 键盘的编程
9.2.1 独立键盘的编程
9.2.2 矩阵键盘的编程
第10章 谁打断了我的工作
10.1 中断
10.1.1 中断源
10.1.2 中断的处理过程
10.1.3 中断的优先级
10.1.4 中断的相关寄存器
10.2 外部中断
10.2.1 外部中断的触发方式
10.2.2 外部中断的应用
第11章 肚子里的钟表
11.1 定时/计数器
11.1.1 定时/计数器的结构
11.1.2 定时/计数器的工作原理
11.1.3 定时/计数器的控制寄存器
11.1.4 定时/计数器的配置
11.2 定时/计数器的编程应用
11.2.1 基于中断的定时器应用
11.2.2 基于查询标志位的定时器应用
第12章 串行通信
12.1 通信方式
12.1.1 并行通信和串行通信
12.1.2 单工通信和双工通信
12.1.3 同步通信和异步通信
12.2 通用异步收发器 
12.2.1 UART的结构
12.2.2 UART的控制寄存器
12.2.3 串行口的工作方式
12.2.4 数据的校验
12.2.5 波特率的设定
12.3 串行通信接口
12.3.1 串行接口的电气标准
12.3.2 串行接口的物理标准
12.3.3 多机通信
12.4 串行口的编程应用
第三篇 越来越少的I/O口
第13章 让驱动更给力
13.1 总线收发器
13.1.1 I/O口的驱动能力
13.1.2 74HC245的功能
13.1.3 总线收发器的应用
13.2 总线收发器的编程应用
第14章 数据的闸门
14.1 锁存器
14.1.1 74HC573的功能
14.1.2 74HC573的引脚排列
14.2 锁存器的编程应用
第15章 三八译码器
15.1 三八译码器的原理
15.1.1 74HC138的功能
15.1.2 74HC138的引脚排列
15.1.3 点阵显示块
15.1.4 74HC138的应用
15.2 74HC138的编程应用
15.2.1 显示心形图案
15.2.2 让图像动起来
第16章 串入并出
16.1 串入并出
16.1.1 74HC595的功能
16.1.2 74HC595的引脚排列
16.2 74HC595的编程应用
16.2.1 74HC595驱动数码管
16.2.2 74HC595驱动点阵显示块
第17章 能听话的电动机
17.1 步进电动机的特点
17.1.1 步进电动机的分类
17.1.2 步进电动机的工作原理
17.1.3 步距角的计算方法
17.2 28BYJ48型步进电动机
17.2.1 28BYJ48电动机性能指标
17.2.2 28BYJ48电动机线圈结构
17.2.3 步进电动机的励磁方式
17.3 步进电动机的驱动
17.3.1 ULN2003的功能
17.3.2 ULN2003的驱动电路
17.4 步进电动机的编程应用
第18章 控制无处不在
18.1 脉冲宽度调制
18.1.1 模拟控制与数字控制
18.1.2 PWM的理论基础
18.1.3 PWM波形的特点
18.2 PWM的编程应用
18.2.1 PWM调光实验
18.2.2 PWM调速实验
第四篇 总线魔术师
第19章 被诅咒的玻璃
19.1 1602液晶显示器
19.1.1 1602液晶的特点
19.1.2 1602液晶的引脚功能
19.1.3 1602液晶的显示数据RAM
19.1.4 1602液晶的字符发生器
19.1.5 1602液晶的工作时序
19.1.6 1602液晶的操作指令
19.2 1602液晶的编程应用
19.2.1 通用字符显示
19.2.2 自定义字符显示
第20章 数字万年历
20.1 实时时钟
20.1.1 DS1302的引脚排列
20.1.2 BCD码
20.1.3 DS1302的内部结构
20.1.4 DS1302的寄存器
20.1.5 DS1302的控制指令
20.1.6 DS1302数据传输格式
20.1.7 DS1302初始化
20.2 DS1302的编程应用
第21章 威武的SPI总线
21.1 SPI总线
21.1.1 SPI总线的结构
21.1.2 SPI的通信方式
21.2 存储器93C46
21.2.1 93C46的引脚功能
21.2.2 93C46的操作指令
21.2.3 93C46的传输时序
21.3 93C46的编程应用
第22章 优雅的I2C总线
22.1 I2C总线
22.1.1 I2C总线的特点
22.1.2 I2C总线通信协议
22.1.3 I2C器件的寻址
22.2 存储器24C02
22.2.1 24C02的引脚排列
22.2.2 24C02的操作
22.3 I2C总线的编程应用
第23章 模拟与数字间的转换
23.1 D/A转换器
23.1.1 D/A转换原理
23.1.2 D/A转换器的性能参数
23.2 A/D转换器
23.2.1 A/D转换器的分类
23.2.2 A/D转换器的工作原理
23.2.3 A/D转换器的性能指标
23.3 PCF8591转换器
23.3.1 PCF8591内部功能
23.3.2 PCF8591的控制
23.3.3 PCF8591的D/A转换
23.3.4 PCF8591的A/D转换
23.4 PCF8591的编程应用
23.4.1 D/A转换器的编程应用
23.4.2 A/D转换器的编程应用
第24章 发热的射线
24.1 红外线遥控的特点
24.1.1 红外遥控编码的帧结构
24.1.2 红外编码的方式
24.1.3 红外调制与解调
24.2 红外线的接收与发射
24.2.1 红外线解码
24.2.2 红外线编码
第25章 感受你的体温
25.1 DS18B20的功能介绍
25.1.1 DS18B20的特点
25.1.2 DS18B20的引脚定义
25.1.3 DS18B20的内部结构
25.1.4 温度值的存储方式
25.1.5 DS18B20的工作时序
25.2 DS18B20的控制指令
25.2.1 ROM指令
25.2.2 RAM指令
25.3 DS18B20的编程应用
25.3.1 DS18B20的供电
25.3.2 DS18B20的应用
25.3.3 DS18B20的编程
第26章 梅雨的季节
26.1 湿度传感器的功能
26.1.1 DHT11的性能指标
26.1.2 DHT11的典型应用
26.1.3 DHT11的通信时序
26.2 DHT11的编程应用
第27章 蝙蝠的回声
27.1 超声波测距
27.1.1 超声波测距模块的工作原理
27.1.2 超声波测距模块
27.2 超声波测距的编程应用
第28章 点阵也疯狂
28.1 点阵型液晶
28.1.1 COG液晶的功能
28.1.2 显示屏与显存的对应关系
28.1.3 显存的组织结构
28.1.4 读写时序
28.1.5 UC1701X指令集
28.2 点阵型液晶的应用
28.2.1 液晶显示器的接口电路
28.2.2 汉字的取模方法
28.2.3 图像的取模方法
28.2.4 汉字和图形显示
附录A 8051系列单片机系统板原理图
附录B 搭建系统板所需的材料清单
附录C 8051系列单片机全能型实验板:电立方/大学城系列
后记

时间: 2024-10-30 22:17:36

《迷人的8051单片机》——导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul