第1章 发光二极管的单灯闪烁设计
教学导航
1.1 单片机概述
单片微型计算机简称为单片机,是一种集成电路芯片,是采用超大规模集成电路技术把计算机系统集成到一块硅片上构成的一个小而完善的微型计算机系统,包括具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A-D转换器等电路),并且通过内部的地址总线、数据总线和控制总线将各部分功能电路组合为一个整体,是典型的嵌入式微控制器(Microcontroller Unit,MCU)。单片机内部结构如图1-1所示。
图1-1 单片机内部结构
单片机和计算机相比,只缺少了I/O设备。一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜,为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域。
由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成到复杂的而对体积要求严格的控制设备当中。
现代人类生活中所用的每件电子和机械产品中几乎都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等计算机配件中都配有1~2片单片机。汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作。单片机的数量不仅远超过PC和其他计算机的总和,甚至比人类的数量还要多。
1.1.1 单片机的发展
单片机诞生于1971年,经历了SCM、MCU、SOC三大阶段,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。
早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。20世纪90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
而传统的8位单片机的性能也得到了飞速提高,处理能力比起20世纪80年代提高了数百倍。目前,高端的32位SOC单片机主频已经超过300MHz,性能直追20世纪90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。作为掌上计算机和手机核心处理的高端单片机甚至可以直接使用Windows和Linux操作系统。
1.1.2 单片机的应用
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置电路板,飞机上各种仪表的控制,计算机的网络通信与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制以及程控玩具、电子宠物等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴。
1.智能仪器
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素以及压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(电压表、功率计、示波器及各种分析仪等)。
2.工业控制
单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,用单片机可以构成形式多样的控制系统、数据采集系统、通信系统、信号检测系统、无线感知系统、测控系统以及机器人等应用控制系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.家用电器
现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩色电视机、其他音响视频器材,再到电子称量设备和白色家用电器等。
4.网络和通信
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机、电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话、集群移动通信、无线电对讲机等。
5.医用设备领域
单片机在医用设备中的用途也相当广泛,例如医用呼吸机、各种分析仪、监护仪、超声诊断设备及病床呼叫系统等。
6.模块化系统
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。
在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
7.汽车电子
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、ABS防抱死系统、制动系统以及胎压检测等。
此外,单片机在工商、金融、科研、教育、电力、通信、物流和航空航天等领域都有着十分广泛的用途。
1.1.3 单片机的分类
单片机作为计算机发展的一个重要分支领域,根据目前发展情况,从不同角度单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家用电器型。
1.通用型/专用型
这是按单片机适用范围来区分的。例如,80C51是通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
2.总线型/非总线型
这是按单片机是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展,并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成在片内,因此在许多情况下可以不要并行扩展总线,大大节省封装成本和芯片体积,这类单片机称为非总线型单片机。
3.控制型/家用电器型
这是按单片机大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家用电器的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。
1.2 MCS-51单片机的基本结构与功能
1.2.1 MCS-51单片机的基本组成结构
MCS-51系列单片机内部由CPU、RAM、ROM、定时/计数器、并行接口、串行接口、中断系统和时钟电路组成,MCS-51系列单片机的内部结构示意图如图1-2所示。
图1-2 MCS-51系列单片机的内部结构示意图
1.CPU
中央处理器是单片机的核心,完成运算和控制功能。MCS-51的CPU能处理8位二进制数或代码。
2.RAM
RAM用于存放计算和控制过程中的数据,单元内的数据可读写,掉电后信息会丢失。MCS-51芯片中共有256个RAM单元,但其中高128单元被专用寄存器占用,能作为寄存器供用户使用的只是低128单元,用于存放可读写的数据。因此通常所说的内部数据存储器就是指低128单元,简称为内部RAM。
3.ROM
MCS-51共有4KB内部ROM,用于存放控制单片机工作的程序、原始数据或表格,掉电后不会丢失,称为程序存储器,简称为内部ROM。单片机工作之前必须先将编制好的应用程序下载至芯片的ROM中。
4.定时/计数器
8051共有两个16位的定时/计数器,实现对内部时钟或外部信号的计数功能。当设定的定时/计数数值满足一定的条件后,定时/计数器会做出标记通知CPU,CPU响应后完成相应操作。
5.并行接口
MCS-51共有4个8位的I/O口(P0、P1、P2、P3),以实现数据的并行输入/输出。并行接口可以按8位并行方式使用,也可一位一位使用。
6.串行接口
MCS-51单片机有一个全双工的串行口,提供与外部串行输入/输出设备的连接或通信,只能一位一位地使用。
7.中断系统
中断系统提高了单片机对外部意外事件的感知能力。当外部某一事件发生时,CPU能及时知道、响应并进行相应的处理。8051共有5个中断源,即外中断两个,定时/计数中断两个,串行口中断一个。所有中断可设置为高级和低级共两个优先级别。
8.时钟电路
时钟电路为单片机各部件的工作提供统一的时钟,使各部件能在统一的节拍下进行协调一致的工作。MCS-51芯片的内部有时钟电路,但石英晶体和微调电容需外接。系统允许的晶振频率一般为6MHz和12MHz。
1.2.2 单片机引脚排列及功能
MCS-51系列单片机40引脚双列直插式封装(DIP-40)的外形及引脚排列如图1-3所示。
图1-3 MCS-51单片机引脚及功能
1.输入/输出接口信号引脚
P0口:P0.0~P0.7,8位双向I/O端口。
P1口:P1.0~P1.7,8位双向I/O端口。
P2口:P2.0~P2.7,8位双向I/O端口。
P3口:P3.0~P3.7,8位双向I/O端口。
2.控制信号引脚
ALE:地址锁存控制信号。ALE以晶振固定频率的1/6输出正脉冲。在系统扩展时,ALE用于控制P0口输出的低8位地址锁存,以实现低8位地址和数据的隔离。
N:外部程序存储器的读选通信号。在读外部ROM时, 有效(低电平),以实现外部ROM单元的读取操作。
A:访问程序存储器控制信号。当 信号为低电平时,对ROM的读操作限定在外部程序存储器;当EA信号为高电平时,对ROM的操作从内部程序存储器开始,延至外部程序存储器。
RST:复位信号。当该引脚的信号为高电平,并延续两个机器周期以上时,完成单片机的复位,内部相应单元完成初始化,单片机进入工作状态。当单片机正常工作时,RST为低电平。
3.其他信号引脚
XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,用于外接石英晶体和微调电容。当使用外部时钟时,则XTAL2用于输入外部振荡脉冲,该信号直接送至内部时钟电路,而XTAL1必须接地。
VSS:地线。
VCC:+5V电源。
4.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 :(外部数据存储器读脉冲)。
5.EPROM程序存储器固化
编程脉冲:ALE/PROG。
编程电压(25V): 。
备用电源引入:RST/VPD。
另外,对于AT89S51芯片,内部包含Flash ROM,P1.5、P1.6和P1.7用于程序固化(下载)使用,与内部EPROM的芯片下载不同。
1.2.3 单片机存储器、寄存器结构
计算机的存储空间一般分为存放程序和存放数据两类,存储配置有两种典型结构:哈佛结构和普林斯顿结构。哈佛结构的程序空间(ROM)和数据空间(RAM)分为两个队列寻址。普林斯顿结构的程序空间(ROM)和数据空间(RAM)同在一个空间队列寻址。
本书介绍的MCS-51系列单片机采用的是哈佛结构的存储结构,单片机存储结构如图1-4所示。MCS-51系列单片机的存储器分为ROM和RAM两类。MCS-51系列单片机内部有4KB的ROM,最大可扩展到64KB,所以可使用的最大程序空间为64KB;内部有128B的RAM,还可以扩展外部RAM共64KB。访问外部设备与访问RAM一样,外部设备是与RAM统一编址的。MCS-51系列单片机可访问的片外RAM和外设单元共64KB。MCS-51系列单片机对ROM的访问和片内RAM的访问是用不同指令实现的。
从物理空间看,单片机的存储器结构较为复杂,分为4个部分,即片内ROM、片外ROM、片内RAM和片外RAM。但从逻辑空间上看,实际上存在3个独立的空间。片内、片外的程序存储器在同一个逻辑空间,它们的地址为0x0000~0xffff(64KB),是连续的;片内的数据存储器占一个逻辑空间,地址为0x00~0xff(256B);片外的数据存储器占一个逻辑空间,地址为0x0000~0xffff(64KB)。MCS-51系列单片机会用不同的指令去访问不同的存储器空间。
1.低128个单元内部数据存储区
MCS-51系列单片机的内部数据存储器(RAM)共有256个单元,通常把256个单元分成两部分:低128个单元(0x00~0x7f)和高128个单元(0x80~0xff)。
图1-4 单片机存储器结构
低128个单元内部数据存储器按用途分为寄存器区、位寻址区和用户数据区3个区域:
寄存器区MCS-51系列单片机共有4组工作寄存器,每组8个单元,用R0~R7编号。它们用来暂存数据及中间结果,使用灵活。4组工作寄存器占用内部RAM的0x00~0x1f单元。在某一时刻,CPU只能使用其中的一组工作寄存器(称为当前寄存器)。它由程序状态寄存器(PSW)中的RS1、RS0位的状态决定。单片机复位后,RS1和RS0默认为工作寄存器0组。
位寻址区内部RAM的0x20~0x2f单元既可以字节寻址,作为一般的RAM单元使用,又可以位寻址,进行布尔操作。在使用C51编程时,程序所定义的位变量会被分配在此处空间,最多可以定义128个位变量。
用户数据区内部RAM的0x30~0x7f单元是提供用户使用的数据区。用户的数据存放在此区域,在实际使用时,常把堆栈开辟在此。在使用C51编程时定义data存储数据类型变量将分配在此段RAM空间,同时系统设定的堆栈空间也在此段RAM空间。
2.高128个单元特殊功能寄存器(SFR)区
对于MCS-51系列单片机,在内部数据存储器0x80~0xff的高128个单元中,特殊功能寄存器只占用其中的21个单元,其余单元无定义,用户不能对这些单元进行读写操作。MCS-51系列单片机可寻址的特殊功能寄存器见表1-1。
表1-1 特殊功能寄存器
程序计数器(PC)用于控制程序的执行,不是特殊功能寄存器(SFR)。PC存放将要执行程序的地址,它有自动加1的功能。单片机根据PC的内容取指令执行,PC没有地址,不能赋值,只能通过转移指令改变其内容。
下面介绍一些SFR的用途,其他SFR在后面的章节中介绍。如果能熟练地掌握这些SFR的使用,也就掌握了MCS-51系列单片机的基本技术。
1)累加器A。
累加器A为8位寄存器,它是使用最频繁的寄存器,功能较多,地位重要,直接与运算器打交道。CPU中的算术和逻辑运算都要通过累加器A。MCS-51系列单片机大部分指令的操作都取自累加器A。
2)寄存器B。
寄存器B为8位寄存器,主要用于乘法和除法运算,也可以作为暂存器使用。在乘法运算中,乘数存于寄存器B中,被乘数存于累加器A中。乘法运算后,乘积的高8位存于寄存器B中,低8位存于累加器A中。在除法运算中,除数存于寄存器B中,被除数存于累加器A中。除法运算后,余数存于寄存器B中,商存于累加器A中。
3)程序状态寄存器。
程序状态寄存器(PSW)为8位寄存器,存放程序执行过程中的各种状态信息。有些位是根据程序的执行结果由硬件自动设置的,有些位由软件设置。程序状态寄存器在程序的运行过程中占有重要的地位,各位的具体含义见表1-2。
表1-2 程序状态寄存器的位表
进位标志位(CY):进位标志位(CY)是最常用的标志位,常用于表示最高位向前的进位和借位及位运算。在加、减法运算中,如果操作结果在最高位有进位(加法运算时)或有借位(减法运算时),则该位由硬件置“1”,否则清“0”。在布尔运算中,位传送、位与、位或等操作都是通过进位标志位实现的。
辅助进位标志位(AC):它也称为半进位标志。在进行算术加、减法运算中,当低4位向高4位有进位(加法运算时)或有借位(减法运算时),则该位由硬件置“1”,否则清“0”。
用户标志位F0、F1:其功能与内部RAM中可位寻址区的各位相似。
RS1、RS0:它为工作寄存器组选择位,用于选择CPU当前使用的寄存器组。具体定义见表1-3。单片机复位后,RS1、RS0为00,即当前工作寄存器组为第0组。
表1-3 工作寄存器的地址表
溢出标志位(OV):它反映运算结果是否溢出,一般用于带符号数运算结果的判别,由硬件根据运算结果自动设置。
奇偶标志位(P):它反映累加器A的奇偶性。如果累加器A中有奇数个“1”,则该位由硬件置“1”,否则清“0”。它完全由累加器A中的内容来决定。MCS-51单片机的校验为偶校验。
4)堆栈指针。
堆栈用来暂存数据,按照“先进后出”的原则存取数据,一端固定(栈底)、一端浮动(栈顶)。MCS-51在片内RAM中专门开辟出一个区域(一组连续的存储单元)作为堆栈区,用堆栈指针(SP)来表示堆栈的位置。
系统复位后,SP的内容为0x07,堆栈设在0x07处,程序初始化时SP可设置不同的值,因此堆栈位置是浮动的,SP的内容一经确定,堆栈的位置也就确定下来。堆栈必须设在片内的RAM区,采用C51编译系统会自动设置SP的内容。
5)数据指针寄存器。
数据指针寄存器(DPTR)是16位寄存器,用于存放16位的数据或地址。数据指针寄存器一般用于访问片外RAM或程序存储器,也可以分成两个8位寄存器使用,即存放高8位的寄存器DPH和存放低8位的寄存器DPL。
3.内部程序存储器
MCS-51系列单片机的内部程序存储器(ROM)用于存放编制好的程序和表格常数。有些单元具有特殊的功能,使用时应加以注意。ROM的低地址空间0x0000~0x002a单元被保留,留给上电复位后的引导程序的地址及5个中断服务程序的入口地址。在实际应用系统中,主程序的存放是从0x002b单元后开始的。
1)0x0000~0x0002系统复位后,PC=0x0000,程序从0x0000单元开始取指令执行。
2)0x0003~0x002a共40个单元,被分成5段,作为5个中断源的中断入口地址。中断响应后,按中断种类,自动转到各中断区的首地址去执行程序,因此在中断地址区中理应存放中断服务程序。但通常情况下,8个单元难以存下一个完整的中断服务程序,在C51编译器中,不同的中断入口对应相应的中断向量函数。
0x0003:外部中断0中断入口地址,C51对应的中断向量为interrupt 0。
0x000b:定时/计数器0中断入口地址,C51对应的中断向量为interrupt 1。
0x0013:外中断1中断入口地址,C51对应的中断向量为interrupt 2。
0x001b:定时/计数器1中断入口地址,C51对应的中断向量为interrupt 3。
0x0023:串行中断入口地址,C51对应的中断向量为interrupt 4。
相关资料查询单片机数据手册。
1.2.4 单片机I/O端口
MCS-51单片机有4个8位并行双向I/O端口P0~P3,共32根I/O线。每一根I/O线能独立用作输入或输出。
1)P0端口。
P0由一个输出锁存器、两个三态输出缓冲器,输出驱动电路及控制电路组成。P0口作为I/O口使用时,应接上拉电阻,CPU内部发出控制信号低电平封锁与门,使输出驱动电路上方的场效应晶体管截止,同时又使多路开关MUX把锁存器Q与输出驱动电路下方的场效应晶体管的栅极连通,Q为1时场效应晶体管导通,为0时截止。通道选择器的控制信号为1时,开关接通上侧,为0时接通下侧。P0口是双向口。P0口有两个三态输入缓冲器用于读操作。下方的三态缓冲器用于读引脚信号,上方的三态缓冲器用于读端口锁存器的内容。由两类指令分别产生读引脚和读锁存器的脉冲,用于选通三态缓冲器。当执行一条读引脚指令时,读引脚脉冲把下方三态缓冲器打开,这时端口引脚上的数据经过该缓冲器读入到内部总线。有时,端口已处于输出状态,CPU的某些操作是先将端口原数据读入,经过运算修改后,再写到端口输出,这类指令读入的数据是锁存器的内容,可能改变其值,然后重新写入端口锁存器,称为“读—改—写”指令。
在扩展系统中,P0口作为地址/数据总线使用时可分为两种情况:一种是以P0口引脚输出地址/数据信息。这时CPU内部发出的控制信号高电平打开与门,同时又使多路开关MUX把CPU内部地址/数据线经反相与输出驱动场效应晶体管V2的栅极接通,输出驱动场效应晶体管V1、V2构成推拉式输出电路,其负载能力大大加强;另一种情况由P0输入数据,这时输入信号是从引脚通过输入缓冲器进入内部总线。当P0口被用作地址/数据线时,就无法再作I/O口使用了。
某些系列单片机兼容MCS-51单片机,但在某些功能方面做了修改,如STC厂家生产的51系列单片机的P0口内部连接了上拉电阻。P0口内部结构如图1-5所示。
图1-5 P0口内部结构
2)P1口。
P1口在电路结构上与P0口有所不同,其输出驱动电路场效应晶体管接有上拉电阻。P1口作为通用I/O使用。当P1口作用输入时,也必须先写入锁存器,再读引脚状态。P1口是准双向口。当P1口用作输出时,不必外接上拉电阻。P1端口结构如图1-6所示。
8051的P1、P2、P3端口输出驱动器接有上拉电阻作负载,用作输入时,端口引脚拉成高电平,它们都是准双向口。
3)P2口。
P2口的位结构比P1口多了一个控制转换部分。当P2口作通用I/O时,多路开关MUX使锁存器输出端Q与输出驱动输入端接通,构成一个准双向口。在扩展系统中,P2口输出高8位地址。此时MUX在CPU控制下转向内部地址线,使高8位地址码通过输出驱动器送到P2端口引脚上。P2端口结构如图1-7所示。
图1-6 P1端口结构
图1-7 P2端口结构
4)P3口。
P3口也是多功能口。当第二输出功能端保持高电平时,打开与非门,锁存器输出可通过与非门和输出驱动场效应晶体管送至引脚端,这是用作通用I/O口输出的情况。输入时,仍通过三态缓冲器读出引脚信号。P3端口结构如图1-8所示。
在P3口用于第二功能的情况下,输出时,锁存器输出Q=1。打开与非门,第二功能输出端内容通过与非门和输出驱动场效应晶体管送至端口引脚,输入时,端口引脚的第二功能信号通过缓冲器送到内部第二输入功能端。
1.2.5 单片机时钟结构
图1-8 P3端口结构
在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟电路,常用单片机时钟电路结构如图1-9所示。一般地,电容C1和C2取30pF左右,晶体的振荡频率范围是1.2~12MHz,某些高速单片机芯片的时钟频率已达40MHz。晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。MCS-51在通常应用情况下,使用振荡频率为6MHz或12MHz,使用串口通信的单片机电路通常使用11.0592MHz的晶振。传统MCS-51单片机的晶振经过12分频后作为内部时钟,为CPU、定时器等功能模块提供时钟源。STC单片机的时钟可以不分频,为CPU提供时钟源,理论上是传统MCS-51单片机速度的12倍。在由多片单片机组成的系统中,为了各单片机之间时钟信号的同步,应当引入唯一的公用外部脉冲信号作为各单片机的振荡脉冲。这时,外部的脉冲信号是经XTAL2引脚注入,外部时钟源接法如图1-10所示。
单片机执行指令的最小时间单位为时钟周期,传统的MCS-51单片机的时钟周期的频率为晶振频率的1/12,STC系列单片机的时钟速度是传统单片机的12倍,指令执行速度更快。
图1-9 常用单片机时钟电路结构
图1-10 外部时钟源接法
1.2.6 单片机复位结构
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。例如复位后PC=0000H,使单片机从首地址0000H开始重新执行程序。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
1.复位条件
必须使RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。例如,若时钟频率为12MHz,每机器周期为1μs,则需2μs以上的高电平。
2.复位电路
单片机常见的复位电路如图1-11所示。图1-11a为上电复位电路,它是利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,便能正常复位。图1-11b为按键复位电路。该电路除具有上电复位功能外,在按下RESET复位键时,电源经电阻R1、R2分压,在REAET端产生一个复位高电平,也能够是单片机系统复位。
图1-11 单片机常见的复位电路
a)上电复位电路 b)按键复位及上电复位电路
3.复位状态
复位后,片内各专用寄存器状态如下:
1.3 发光二极管闪烁设计
1.3.1 单片机控制的发光二极管闪烁电路结构
单片机控制的发光二极管电路如图1-12所示。图中发光二极管VD1的阳极由晶体管9012驱动,当单片机的P3口的高4位P3.7~P3.4输出“1000”时,74LS154的输出端“Y8”输出低电平,晶体管VT9导通,在此种情况下当单片机的P2.0端口输出“0”时则发光二极管点亮,当P2.0输出“1”则发光二极管熄灭。当P2.0周期性的输出“0”和“1”则可以看到发光二极管进行“亮”与“灭”的闪烁。根据发光二极管电路的结构,在PC上编写单片机控制程序,编译后生成单片机的CPU可执行的机器码,并将生成的机器码写入单片机的FLASHROM中,单片机启动后执行FLASHROM中的程序。CPU所执行的每条指令都是编写的用户程序。由于MCS-51单片机的软硬件资源有限,因此单片机系统不像PC系统通过操纵系统来管理软硬件资源,所有的软硬件资源都由用户程序直接管理,由CPU根据用户所编写的单片机程序来执行任务。
图1-12 单片机控制的发光二极管电路
1.3.2 伟福编译系统编译单片机程序
1.设置仿真器参数
单片机程序编译调试程序种类有很多,中文编译界面的集成系统有伟福编译环境。使用该编译系统可以通过仿真器进行程序的单步、跟踪、设置断点等方式直接调试设计程序。通过官方网站下载安装后,直接双击快捷方式图标启动。伟福编译器启动界面如图1-13所示。单击界面上的仿真器设置按钮,在图1-14所示的界面中设置各项参数,仿真器选项设置如图1-14所示,选择硬件仿真类型为“V5/S”,仿真头为“POD-H8X5X”,具体单片机型号选择为ATMEL公司的“AT89S51”单片机。仿真头的晶振频率默认为12MHz。如果使用伟福公司的仿真器进行程序调试,则将仿真器选择选项的“√”去掉,如果没有仿真器实物,要设置该选项有效,可以通过编译环境进行虚拟调试,但对于一些器件的交互式操作则不能实现仿真功能。仿真器的编译语言设置如图1-15所示。
图1-13 伟福编译器启动界面
在图1-15所示的语言界面下设置编译器使用编程语言选项,使用C51编写单片机程序方便快捷。可以使用Keil的C51编译器,在编译器路径中指定C51所在的路径。如果使用汇编语言编写单片机程序则可以不设置该选项。
2.编写单片机程序
设置仿真器后可以进行程序设计,本书采用C51编写单片机设计程序。新建源文件“main.c”过程如下:执行菜单命令“文件”→“新建文件”,然后保存文件,将文件名设置为“main.c”,文件名的扩展名需要设置为“.C”。在执行C程序过程中,首先从“main()”函数开始执行。新建源文件界面如图1-16所示。在源文件中输入程序代码,代码如下:
图1-14 仿真器选项设置
图1-15 仿真器的编译语言设置
程序代码的内容中“#include<reg51.h>”的功能为添加功能头文件,C51编译器为MCS-51单片机的特殊功能寄存器进行了定义,使用该行代码可以直接使用“reg51.h”头文件中定义的特殊功能寄存器。
“sbit LED=P2^0;”定义LED变量代表了P2端口的P2.0,直接对“LED”的任何操作即是对P2.0进行操作,而采用宏定义的方式定义对P2.0的置1,清0,取反等操作更有利于程序在不同硬件系统中的移植。
“void Delay_Nms(unsigned int n);”为函数声明,该函数为延时nms的延时函数。该函数定义在“main()”后,而在“main()”中调用了该函数,因此必须在“main()”函数之前对该函数进行声明。
“main()”函数首先进行初始化操作,将P3口的P3.7~P3.4设置为“1000”,而确保74LS154的Y8输出为0,从而使VT9导通,确保了二极管能够被点亮。由于while语句的条件为真,CPU而后始终执行while循环语句,while语句功能为将P2.0的输出状态取反一次,而后延时500ms。循环执行该while语句,结果是发光二极管实现了周期为1s的闪烁功能。
图1-16 新建源文件界面
3.单片机程序的编译
源程序编写后,需要进行编译。编译单片机程序需要建立一个完整的项目。执行菜单命令“文件”→“新建项目”,在弹出的图1-17所示的窗口中选择加入的源文件,新建项目中加载源文件如图1-17所示,加入新建的源文件“main.c”,而后在弹出的窗口中加入项目包含的头文件,在图1-18所示的窗口中选择头文件,如果不需要加入头文件则单击“取消”按钮,本项目中不需要加入其他头文件,选择“取消”按钮,在弹出图1-19所示的窗口中选择保存的项目的名称与路径,保存项目窗口如图1-19所示,将项目名称设置为“LED_FALSH”,并将项目路径与源文件路径设置为同一路径。保存项目用鼠标后双击图1-20所示的“main.c”源文件打开项目中的源文件。鼠标右键单击“模块文件”选项可以添加或移除源文件,项目中源文件管理操作如图1-21所示。鼠标右键单击“包含文件”选择可以添加或移除头文件。
图1-17 新建项目中加载源文件
图1-18 加载头文件窗口0
图1-19 保存项目窗口
图1-20 新建的项目窗口
图1-21 项目中源文件管理操作
执行菜单命令“项目”→“全部编译”,编译系统对项目进行编译,在消息窗口中显示编译的消息结果,当程序无任何错误后,编译器将生成“LED_FLASH.HEX”文件,将该文件下载到单片机,单片机执行程序后将看到对应的发光二极管进行周期约为1s的闪烁操作,项目编译操作如图1-22所示。
图1-22 项目编译操作
4.单片机程序的调试
程序编译后,如果连接了仿真器,可以通过调试工具对程序进行调试,可以进行跟踪调试、单步调试、连续调试以及复位等操作,通过项目观察窗口可以观察I/O端口、寄存器、定义的变量的数值变化。单击图1-23所示的单步调试按钮,则单步调试单片机程序,图1-23中箭头所指的位置为即将执行的程序位置,每单击一次单步运行按钮则执行一行程序,如果遇到函数调用则完成单次的函数调用;跟踪运行按钮遇到函数调用则进入函数内部进行单步运行,单击连续运行则CPU连续运行单片机程序;单击复位按钮则回到起始位置执行程序。在调试过程中如果希望执行到某一行停下来,可以在某行插入断点,先将光标设置在需要插入断点的行,然后执行菜单命令“执行”→“设置或取消断点”,单击连续运行按钮则程序运行到设置断点的位置停下来。通过项目的观察窗口可以观察调试过程中参数的变化,如本项目可以通过观察P2、P3口的变化来验证程序的调试结果。
图1-23 程序调试界面
在调试过程中可以执行菜单命名“外设/端口”单独将P0~P3端口的状态显示出来,设置观察外设状态如图1-24所示,单片机复位后P0~P3端口的电位均为高电平,也可以将定时器、串口、中断等外设显示出来。
在没有使用仿真器的情况下可以使用该仿真功能观察I/O端口的变化,在调试过程中观察外设端口电平如图1-25所示在程序执行的所在位置对应P3口、P2口的输出电平。
图1-24 设置观察外设状态
图1-25 在调试过程中观察外设端口电平
1.4 习题
1.MCS-51单片机的基本组成包括哪几部分?
2.MCS-51单片机的P0口的功能包括哪些?
3.MCS-51单片机的P0口作为I/O端口使用时需要如何进行处理?
4.MCS-51单片机P1口的功能有哪些?
5.MCS-51单片机P2口的功能有哪些?
6.MCS-51单片机P3口的功能有哪些?
7.MCS-51单片机的常用复位方式有哪几种?
8.MCS-51单片机复位后P0~P3口输出的状态是哪种状态?