中国科学技术大学业余无线电协会编
目 录
韩庚郑爽勇往直前§1 前言 (1)
§2 单片机简介 (2)
2.1 数字电路简介 (2)
2.2 MCS-51单片机简介 (2)
2.3 Easy 51 Kit Pro简介 (5)
2.4 Easy 51 Kit Pro电路功能分析 (5)
§3 MCS-51单片机的C语言编程 (8)
3.1 汇编语言 (8)
3.2 建立你的第一个C项目 (8)
3.3 生成hex文件 (12)
3.4 Keil C语言 (14)
3.5 单片机I/O (18)田朴珺梁家辉
3.6 中断 (25)
3.7 定时器/计数器 (27)
3.8 定时器的应用举例 (29)
3.9 外部中断 (34)
3.10 串行通信 (38)
3.11 定时器2 (43)
3.12 看门狗 (47)
3.13 空闲模式和掉电模式 (50)
§4 MCS-51单片机C语言编程应用进阶 (51)
4.1 扫描式键盘 (51)
4.2 EEPROM芯片AT93C46的读写 (55)
4.3 Keil C的高级使用 (63)
§5 编写高质量的单片机C程序 (64)
女明星代言费
5.1 文件结构 (64)
5.2 程序的版式 (66)
5.3 单片机程序命名规则与变量选择 (70)
5.4 表达式和基本语句 (73)
5.5 函数设计 (77)
5.6 单片机程序框架 (79)置换购车
附图:Easy 51 Kit Pro电路图(最小系统板) (80)
附图:Easy 51 Kit Pro电路图(学习板) (81)
§1 前言
什么是单片机,目前还没有一个确切的定义。普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(I/O)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。简称为单片微机或单片机。利用单片机程序,可以实现对硬件系统的小型化的智能控制。由于单片机的硬件结构与指令系统都是按工业控制要求设计的,常用于工业的检测、控制装置中,因而也称为微控制器(Micro-Controller)或嵌入式控制器(Embedded-Controller)。
单片机的应用十分广泛,我们将以Easy 51 Kit Pro单片机学习板为基础,学习51单片机的入门知识。
本学习资料面向掌握基本电路知识和基础C语言编程的单片机初学者。为使读者能迅速上手,本资料并不深入介绍单片机的内部体系结构和指令系统,而是从读者较熟悉的高级语言开始使读者掌握单片机的C语言编程。通过本资料的大量程序例子,读者应当可以在较短的时间内熟悉单片机的入门编程
以及单片机基本外围电路的连接,从而具备基本的单片机开发能力。然而,本资料的局限性也正在于此,当读者需要更深入地开发单片机或其它控制器时,可能需要进一步了解其内部体系结构和指令系统,这时读者就应查阅其它资料了。
同时,本学习资料还致力于引导读者编写高质量的单片机C语言程序。尽管单片机程序的规模有限,但高质量的单片机程序除了可以优化运行效率外,对程序的开发速度和可维护性也具有重要的影响。
§2 单片机简介
2.1 数字电路简介
在一个控制系统中,单片机是电路的一部分,单片机中的程序是针对其所在的电路编写的。因此,要对单片机编程并实现一定的功能,必须了解整个系统的电路图。单片机编程是针对某个特定的电路进行的,这一点和普通的编程不一样。编程时很可能要经常参照电路图。与单片机直接相关的电路大都是数字电路。数字电路各部分的功能十分明确,因此相对比较容易掌握。
简单地说,数字电路就是只有“0”和“1”两种信号的电路。判别信号究竟是“0”还是“1”是通过电压的大小(常称作“电平”)来判断的。不同的数字器件的电平判断标准是不一样的。常用的数字器件以高电平(超过某一阈值的电平)作为逻辑“1”,以低电平(低于某一阈值的电平)作为逻辑“0”。其中高电平阈
值大于低电平阈值,处于高电平阈值与低电平阈值之间的电压是无效的。高电平阈值与低电平阈值的具体值与数字器件的供电电压有关,如AT89S51单片机的高电平阈值为(0.2Vcc+0.9)V,低电平阈值为(0.2Vcc-0.1)V,其中Vcc为单片机的供电电压。早年常用的数字器件的额定供电电压为5V,现在3.3V、1.8V 等电压的数字器件已经大量使用了。在Easy 51 Kit Pro中,我们仍使用5V供电的单片机。另外,还有一种RS-232电平标准,以-12V~-5V作为逻辑“1”,以5V~12V作为逻辑“0”。电脑上的串口都符合RS-232标准。
还有一个“地”的概念。在电路中“地”并不是通常意义中的地,而是指电路中的一点,这一点的电压被人为地规定为0V。
2.2 MCS-51单片机简介
目前生产单片机产品的公司非常多,当中较有影响力的有intel公司推出的MCS-51系列等。很多公司的产品都是与MCS-51架构兼容(MCS-51 compatible)的。本资料中采用的atmel公司的AT89C51/52或AT89S51/52单片机,就是兼容MCS-51架构的单片机。
Atmel公司的AT89C51(以后简称“C51”)、AT89C52(以后简称“C52”)、AT89C2051(以后简称“C2051”)以及C51、C52的换代产品AT89S51(以后简称“S51”)、AT89S52(以后简称“S52”)容易上手、价格低廉(不超过10元/片)、资料丰富,是初学者入门时广泛采用的单片机。
C51拥有4096字节(1字节=8位)的片内程序存储器、128字节的RAM、32个I/O口、两个定时器、6个中断源、一个串口等。C52、C2051的资源与C51差别不大,其中C52的片内程序存储器为8192字节、RAM为256节、定时器有3个,其它与C51一样; C2051的片内程序存储器为2048字节、I/O口只有15个,另比C51多了一个模拟比较器,工作电压范围比较宽,为2.7V~6V(C51/52、S51/52为4.5~5.5V),其它与C51一样。
I/O、定时器、中断、串口等资源的用法在后面有详细介绍。这里只对程序存储器与RAM 作一下说明。单片机程序代码经过编译(C程序)或汇编(汇编程序)后,要把编译或汇编得到的代码文件(一般来说编译得到hex格式文件、汇编得到bin格式文件)烧写到单片机内,存放这个程序的地方就是程序存储器。显而易见,单片机的程序存储器越大,我们就可以把越大、越复杂的程序放进去。如果我们编写的程序太大,那么单片机的程序存储器就有可能会放不下这个程序。这时,解决办法就只有精简代码、外接程序存储器(前提是所用的单片机支持使用外部程序存储器)或采用程序存储器容量更大的单片机。RAM是单片机程序运行时存放变量的地方,常量也可以放在RAM中。C51中的RAM大小为128字节,这就是说单片机程序中最多只能同时存在128个unsigned char型的变量或64个unsigned int型的变量(在Keil环境中,int型变量的长度为16位,这与VC的32位不一样)或者是相应的
各种不同类型变量的组合。可以看出,单片机程序所允许的规模比Windows或其它操作系统环境下的
程序要小得多。编写单片机程序时一定要注意不要滥用资源。
S51与S52分别是C51、C52的换代产品。从用户的角度看,S5x单片机比相对应的C5x 单片机多了看门狗与在线编程(ISP)功能,另外最高运行速度有所增加(C5x最高支持24MHz 的时钟频率,而S5x最高支持33MHz的时钟频率,但市面上比较容易买到的S5x单片机仍只最高支持24MHz的时钟频率)。
杨洋郑爽看门狗的使用在后面会有详细介绍,我们来看看单片机的在线编程(ISP)功能。要把程序烧写到AT89C系列单片机中,最常用的做法是把单片机插入专用的编程器中,通过编程器把程序烧到单片机里。这样做的麻烦之处是在调试程序时,编程者对程序作出的每次修改,都要把单片机从电路中拔出来,插到编程器,烧好后又要把单片机重新插回电路板。可以想象,这种工作是吃力不讨好的。利用S5x单片机的ISP功能,我们就无须来回插拔单片机,只要在电路中把单片机的ISP编程引脚接出来,并且这几个引脚所接的外围电路对ISP没有影响,就可以用ISP编程器对单片机进行烧写了。另外,支持AT89C系列单片机的编程器成本要比ISP下载线高最少几倍。一根并口ISP下载线的成本仅几元钱。
除了S系列、C系列外,atmel公司的MCS-51兼容产品也有其它系列,它们的主要区别在于供作电压范围,在此就不作介绍了。
值得注意的是,一片单片机可以反复擦写的次数是有限的,atmel的C系列、S系列单片机的声称可重
复擦写次数为1000次。
梦见被够狗咬了预示着什么
下面以S52为例,对其引脚功能一一作出说明。C51、C52以及S51的引脚功能与S52大致相同,如有遇到不同的地方会用粗斜体字特别说明。
图2.2  AT89C2051引脚功能图
图2.1  AT89S52引脚功能图
1、电源引脚
Vcc 40 电源引脚
GND 20 接地引脚
工作电压为4V~5.5V。
2、外接晶体引脚