




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
工程一点亮一个发光二极管
1.1工程说明1.2根底知识1.3工程实施1.4工程评价1.5拓展与提高1.1项目说明
工程任务
利用MCS-51单片机(简称51单片机)的并行I/O口驱动一个发光二极管,利用C51编程点亮该发光二极管。
知识培养目标
(1)掌握微型计算机硬件系统的构成。
(2)掌握51系列单片机的内部结构及存储器配置。
(3)掌握51单片机的最小系统。
(4)掌握字节寻址与位寻址。
(5)掌握C51程序结构及变量的定义。
(6)理解51系列单片机存储器扩展的方法。能力培养目标
(1)能利用所学知识设计出所需原理图。
(2)能利用所学知识正确地选择元器件。
(3)能利用KEILC软件建立工程文件。
(4)培养解决问题的能力。
(5)培养沟通表达、团队协作的能力。1.2基础知识
1.2.1微型计算机的硬件系统
计算机分为巨型机、大型机、中型机、小型机与微型机等类型。计算机的开展一是朝着高速度、大容量、高性能的巨型机方向开展,如我国的银河系列巨型机;二是朝着体积小、可靠稳定、本钱低廉的微型机方向开展。而微型机也有两个方向,一是朝着高速度、大容量、高性能的高档PC机方向开展;二是朝着体积小、可靠稳定、本钱低廉的单片机方向开展。下面以PC机为例介绍微型机硬件的构成及各局部的作用。
微型计算机由硬件系统与软件系统构成,图1-1所示为微型计算机硬件系统结构图。
由图1-1可知,微型计算机的硬件系统由CPU、存储器、I/O接口及外设四大局部组成,其中,CPU、存储器、I/O接口之间是通过地址总线AB、数据总线DB、控制总线CB(简称三总线)相连的。图1-1微型计算机硬件系统结构图1. CPU
CPU即中央处理单元,是执行指令的部件。CPU通过执行指令,在其管脚上发出一系列上下电平来指挥其他部件按要求工作,从而完成相应的任务。由于单条指令的功能非常有限,因此CPU要执行一系列有序排列的指令(即程序)才能完成某一任务。我们通常所说的486、586、双核或四核,就是指CPU,双核的性能优于586,四核肯定更好。仅由CPU这一个部件就可以大体上区分出计算机的性能,因此CPU是计算机系统中最重要的部件。CPU的外形结构如图1-2所示。图1-2CPU的外形结构2.存储器
CPU要执行的程序及程序所需的数据就储存在存储器中,或者说CPU只执行储存在存储器中的程序。每一块存储器内部都有一定数量的存储单元,与CPU通过三总线相连后,每一个存储单元都有一个地址。存储器的外形结构如图1-3所示。图1-3存储器的外形结构存储器是半导体集成器件,根据数据的存取方式分类,可分为:半导体存储器可分为只读存储器(ROM)和随机存取存储器(RAM)两大类。只读存储器(ROM)是一种非易失性存储器,其特点是信息一旦写入,就固定不变,掉电后,信息也不会丧失;随机存取存储器RAM是一种易失性存储器,其特点是在使用过程中,信息可以随机写入或读出,使用灵活,但信息不能永久保存,一旦掉电,信息就会自动丧失。
我们购置计算机时,总要问一下它的硬盘是多少G、内存是多少G,G即GB,是存储器的容量单位。在计算机内部,数据、地址及指令都是用0或1表示的,二进制代码中的1个0或1称为1位(bit),用b表示,位是存储器的最小单位;连续的8个0或1称为1个字节(Byte),用B表示,1B=8b,字节是存储器的根本单位。常用存储器容量单位还有千字节(KB)、兆字节(MB)、千兆字节(GB),它们之间的关系为
1KB = 1024B = 210B1MB = 1024KB = 220B
1GB = 1024MB = 230B
1个或几个字节组成1个字,字是计算机内部数据处理的根本单位。1个字所包含的0或1的位数称为字长,典型计算机CPU的字长有8位、16位、32位、64位,51系列单片机CPU的字长是8位。读和写是存储器的根本操作。CPU将数据存入存储单元称为写操作,CPU取出存储单元中的数据称为读操作。不管是读还是写,必须要在存储器中找到该单元,即要给出该单元的地址,然后才能对之进行读或写。就像要到一栋楼房中去找某个人时,必须知道他所在房间的房门号一样,只不过存储器中每个单元的地址与单元中存储的数据都是用0、1表示的一串二进制数,初学时不容易区分。每个存储单元中只能存放1个字节,即8位0或1,16个二进制位就要占用2个单元。每个存储单元地址的位数与存储器的容量有关,存储器的容量越大,地址的位数就越多。如果存储器有2根地址线A1、A0,那么就有4个地址00、01、10、11,最多能区分4个存储单元;3根地址线,那么有000~111共8个地址,最多能区分8个存储单元;4根地址线可区分16个存储单元;以此类推。因此,存储器容量与地址线的关系为:容量 = 2nB,n为地址线的位数。如某存储器有10根地址线A0~A9,那么其寻址范围(即容量)为210B = 1024B = 1KB,地址范围为000H~3FFH;容量为4KB的存储器,由于4KB = 212B,所以共需要12根地址线,地址范围为000H~FFFH。3. I/O接口
I/O接口是CPU与外设连接的桥梁,每一个I/O接口都有一个地址,称做端口地址。不同的外设端口地址是不同的,CPU就是通过端口地址来区分各个外设的。
4.外设
外设可分为输入设备与输出设备,主要包括显示器、键盘、鼠标、打印机、耳麦、摄像头、硬盘、光驱等。外部设备是根据不同的使用场合来配置的,办公室里通常要配备打印机,而网吧里那么不需要打印机。在这里一定要注意:硬盘及光驱也属于外部设备,其作用是存储程序或文件。硬盘外形如图1-4所示。图1-4硬盘硬盘与存储器的区别:存储器是半导体集成器件,其工作速度快,能与CPU的工作速度相匹配,但容量有限;而硬盘是磁介质存储器件,工作速度相对较慢,容量无限。通常将系统软件或应用软件装在硬盘中,在执行某一程序时需要先将该程序从硬盘调入存储器才能执行。5.总线
在单片机系统中,CPU是核心器件,其他器件都要与之相连,并且要求各器件之间协调工作,这样所需连线就很多,因此采用各个器件共同享用连线的方法,这些共同享用的连线就是总线。总线好比高速公路,各种物资须经过它进行传送,只是总线上传送的是0或1。其中,为存储器或I/O接口提供地址的所有连线称为地址总线AB,用于选定某一存储单元或I/O接口;控制各器件工作状态的所有连线称为控制总线CB,实现对选定单元的读或写;用于传输数据的公共连线称为数据总线DB,对选定单元读/写的信息是通过数据总线DB传送的。下面通过分析计算机的启动过程进一步加深对计算机硬件系统的理解。
当我们按下计算机的电源开关后,CPU就开始执行存储器中的指令了。存储器是由一系列存储单元构成的,通常每个单元能存储8个二进制位,即以字节为单位存储信息,每8个二进制位构成一个字节,如某一单元存储的数值为10010111等。每个单元都有一个地址,究竟从哪个单元开始执行呢?不同的CPU上电复位后开始执行指令的地址是不同的,51系列单片机中的CPU从0000H单元开始执行,而PC机中的CPU是从FFFF0H单元开始执行的。这是第一步,即CPU得电后,它就要从存储器中的某一单元开始执行指令序列。如果PC机中的存储器都是由RAM构成的,那么这台计算机就不能正常工作,因为上电后RAM中的值是随机的,它不可能完成任何任务,因此PC机的存储器必须由ROM与RAM两局部组成。开机后,CPU先执行ROM中的程序,这些程序是由生产厂家写入的,叫做BIOS程序,即根本的输入、输出程序,功能是初始化主要接口,将硬盘上存储的Windows操作系统的核心文件调入存储器中,然后CPU从存储器中执行这些核心文件,计算机就处于Windows操作系统的管理之下,这时完成计算机的启动。计算机启动后,如果从桌面上或开始菜单下运行Word,首先要从硬盘的某一路径下找到应用程序Word.exe,然后将该程序从硬盘调入存储器中,CPU才能够执行该程序,进入编辑状态。1.2.2单片机结构
1.单片机的概念
微型计算机是由CPU、存储器、I/O接口及外设组成的,其中前三局部组成了计算机的主机。如将CPU、存储器、I/O接口集成在一块芯片上就构成了单片机,即单芯片微型计算机。单片机由于其低廉的价格,稳定可靠的性能,因此在国防、交通、工农业生产等各行各业都得到了广泛的应用。在日常生活中,如智能冰箱、智能空调、智能电饭锅等,都离不开单片机的控制。目前生产单片机的公司非常多,如Intel、LG、STC、Atmel、Philips、Dallas、Winbond、Zilog、Microchip、Motorola等。由于Intel公司将MCS-51的核心技术授权给了很多其他公司,所以许多厂家生产的单片机与MCS-51单片机具有良好的兼容性,包括指令兼容、总线兼容与引脚兼容,这使51系列单片机成为事实上的单片机工业标准。2. 51系列单片机的内部结构
51系列单片机是Intel公司于20世纪80年代推出的8位单片机,目前已经有十多个品种,包括51子系列(如8031/8051/8751/8951)、52子系列(如8032/8052/8752/8952)。制造时,一般采用HMOS工艺和CHMOS工艺,产品型号中凡带C的为CHMOS工艺芯片,如80C51;不带C的为HMOS工艺芯片,如8051。在功能上,51系列单片机有根本型和增强型两类,以芯片型号的未位数字来区分。“1〞表示根本型,如8031/8051/8751/8951或80C31/80C51/87C51/89C51为根本型;“2〞表示增强型,如8032/8052/8752/8952或80C32/80C52/87C52/89C52为增强型。
表1-1为51系列单片机的主要型号及性能指标。
51单片机的主要资源为:5V电源,8位CPU,4KB片内程序存储器(ROM),256B片内数据存储器(RAM),4个8位并行I/O口,1个全双工串行口,2个可编程定时/计数器,5个中断源,2个优先级,片外程序存储器、数据存储器最大可扩展至64KB。51单片机的内部结构如图1-5所示。表1-151系列单片机的主要型号及性能指标
图1-551单片机内部结构(1) CPU。CPU是单片机的核心部件,通过执行指令发出指挥信号,协同其他部件完成相应的任务。单片机执行哪条指令受程序计数器PC控制,PC是一个16位计数器,具有自动加1功能,最大寻址范围为64KB。CPU每读取一个字节的指令,PC就自动加1,然后指向将要执行的下一条指令,为读取下一条指令作好准备;当下一条指令被取出执行时,PC的值又加1,这样在PC的控制下,指令被一条条地顺序执行。假设当执行分支程序或调用子程序时,是通过转移或调用指令来改变PC值的,使其指向子程序对应的地址处,那么开始执行相应的子程序。(2)存储器。51单片机存储器分为程序存储器和数据存储器,它们分开编址,这是51单片机的一个重要特点。
程序存储器主要用来存放用户编写的程序及运行该程序用到的数据、表格等,由只读存储器构成,在51单片机芯片内集成了4KB的ROM存储器;数据存储器用于存放输入数据、输出数据或运算产生的中间结果等随时有可能变动的数据,由随机存取存储器构成,51单片机芯片内集成了256B的RAM存储器。当51单片机内部的程序存储器、数据存储器容量不够用时,可以进行片外扩展,最大容量可以扩展至64KB;当单片机的I/O接口不够用时,也可以进行片外扩展,片外扩展的I/O接口与片外数据存储器统一编址。
(3) I/O接口。51单片机的I/O接口是单片机控制外围设备的重要接口,是与外设进行信息交换的途径。51单片机的I/O接口主要包括了并行口、串行口、定时/计数器及中断控制器等。
并行口有P0、P1、P2、P3四个,主要实现数据的并行输入/输出。所谓并行方式就是n位数据由n个通道同时传送。串行口主要用于单片机与其他设备间采用串行方式传送数据。所谓串行方式就是一个通道分时传送n位数据。
定时/计数器有T0、T1两个,主要实现定时或计数功能。
中断控制系统主要实现对2个外部中断、2个定时/计数器中断及1个串口中断的管理。
3. 51单片机引脚说明
51单片机的封装有DIP、TQFP、PLCC等多种形式。DIP封装的51单片机引脚图及逻辑符号如图1-6所示。图1-651单片机引脚图及逻辑符号单片机的40个引脚大致可分为电源、时钟、控制引脚和并行I/O口四类。
1)电源
VCC——芯片电源,接+5V。
GND——接地端。
2)时钟
XTAL1、XTAL2——外接晶振引脚。XTAL1是片内振荡电路的输入端,XTAL2是片内振荡电路的输出端。3)控制引脚
ALE/—地址锁存允许/片内EPROM编程脉冲。片外扩展存储器时,ALE用于锁存由P0口送出的低8位地址;功能,在对片内EPROM编程期间,此引脚输入编程脉冲。
—片外程序存储器选通信号。
RST/VPD—复位/备用电源。RST(Reset)指复位信号输入端,当该引脚上所加高电平大于10ms时,单片机进行复位初始化操作,使单片机内部的一系列存储单元恢复到初始值,SP的值为07H,P0~P3的值为FFH,其余存放器的值为00H,且将程序计数器PC的值置为0000H。因此51单片机上电或复位后,是从0000H单元开始执行程序的。VPD的功能是指在VCC掉电情况下所接的备用电源。/VPP——片内、片外程序存储器选择端/片内EPROM编程电源。51单片机内部有4KB的ROM,当接高电平时,单片机先从片内ROM中读取指令数据,片内ROM读完后自动读取片外ROM;当接低电平时,单片机直接读取片外ROM。现在的单片机芯片一般都具有片内ROM,所以在设计电路时始终接高电平。VPP的功能是指片内为EPROM芯片时,在EPROM编程期间,施加编程电源VPP。4)并行I/O口
51单片机有4个8位并行I/O端口:P0、P1、P2、P3,共占用了32个引脚,4个并行I/O口中的每一位都可以单独控制。因此它们的字节地址和位地址分别是:
字节地址 位地址
P0口 P0.0~P0.7
P1口 P1.0~P1.7
P2口 P2.0~P2.7
P3口 P3.0~P3.7
4个并行端口中P1口只能用作I/O接口,其他3个端口除了用作I/O接口外还可实现其他功能。由并行总线进行片外扩展时,P2口、P0口共同构成地址总线,提供16位地址,P2口传送A15~A8,P0口传送A7~A0,P0口分时用作数据总线。
P3口的每一位都有独立的功能,含义如下:
P3.0RXD,串行数据接收端;
P3.1TXD,串行数据发送端;
P3.2,外部中断0输入;
P3.3,外部中断1输入;P3.4T0,定时/计数器0的计数脉冲输入;
P3.5T1,定时/计数器1的计数脉冲输入;
P3.6,片外数据存储器写选通信号;
P3.7,片外数据存储器读选通信号。
单片机引脚虽多,但要分类记忆就比较简单:电源2个(VCC和GND),晶振2个,复位1个,1个,剩下还有34个,29脚、30脚ALE只有片外扩展数据/程序存储器时才有特定用处,一般情况下不用考虑,最终就只剩下4个8位I/O口的32个引脚,这32个引脚的用法就是学习单片机的重点了。4.单片机最小系统
单片机最小系统,或者称为单片机最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应包括单片机、复位电路、时钟电路,如图1-7所示。
(1)单片机:具有片内ROM的51系列单片机或与51兼容的单片机。
(2)=1:表示单片机在复位后从片内ROM的0000H单元开始执行指令。图1-751单片机最小系统(3)复位电路:为引脚RST提供单片机复位所需的高电平(>10ms)。51单片机常用复位电路如图1-8所示,复位电路有上电自复位、上电自复位加手动复位两种复位方式。上电自复位电路是在系统刚上电时,利用电容两端电压不能突变的工作原理,为RST引脚提供所需宽度的高电平,高电平持续的时间由电路中的RC值来决定,适中选取RC就可以使单片机实现上电自复位,一般推荐C取22μF,R取
10kΩ。上电自复位加手动复位电路不仅可以实现上电自复位,而且在需要时也可以由按键来实现手动复位。图1-8复位电路(4)时钟电路:为单片机提供工作所需的时钟脉冲。在用串口通讯的场合,为了准确地得到9600波特率和19200波特率,晶振必须为11.0592MHz;在精确定时的场合,可选用12MHz的晶振,以产生精确的μs级时间基准,从而方便定时操作。HOT-51实验板上的晶振为11.0592MHz。
因为最小系统中单片机未接任何外设(输入或输出设备),所以实际上单片机并不能完成任何具体的任务。5. 51单片机存储器的配置
51系列单片机存储器的特点是将程序存储器和数据存储器分开编址。按其物理结构可分为片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器4个空间;按其逻辑结构可分为程序存储器、片外数据存储器、片内数据存储器3个空间。51单片机存储器的配置如图1-9所示。图1-951单片机存储器配置1)程序存储器
程序存储器用于存放用户编写的程序及运行该程序所用到的数据、表格等。片内、片外程序存储器统一编址,以程序计数器PC为地址指针,最大容量为64KB,地址范围为0000H~FFFFH。单片机究竟是访问片内ROM还是片外ROM由决定。当端接低电平时,CPU从片外程序存储器中读取程序,片内4KB的ROM就好似不存在一样;当接高电平时, CPU先从片内ROM中读取程序, 当PC的值超过片内ROM的最大地址0FFFH时,CPU才会自动转向片外ROM读取程序。2)片外数据存储器
在51单片机中,片外数据存储器与接口是统一编址的,地址范围为0000H~FFFFH,最大容量为64KB。通常情况下扩展片外数据存储器的主要原因是接口资源不够,如控制系统中常用的A/D或D/A转换器,由于51单片机内部没有集成这类接口,因此只能片外扩展。3)片内数据存储器
片内数据存储器用于存放输入数据、输出数据或运算产生的中间结果等随时有可能变动的数据。51单片机芯片内的数据存储器共有256B,分为两局部:地址在00H~7FH范围的低128B为用户数据RAM;地址在80H~FFH范围的高128B为特殊功能存放器(SFR)。
片内低128B在结构上又分为工作存放器区、位寻址区和用户区。片内数据存储器配置如图1-10所示。图1-10片内数据存储器配置(1)工作存放器区。地址为00H~1FH的32个字节称为工作存放器区。32个字节被平均分为四局部,称为0~3区。每个工作存放器区均包含8个字节,均命名为R0~R7。CPU任何时刻只能使用其中的一组工作存放器,CPU当前正在使用的一组工作存放器由程序状态字存放器PSW中的RS1、RS0确定,根据RS1、RS0的状态,才能获得R0~R7的实际物理地址,如表1-2所示。
(2)位寻址区。地址为20H~2FH的16个单元是位寻址区。CPU不仅可以对这16个单元进行字节寻址,也可以对这16个单元的128个二进制位直接进行位寻址,如“置1〞、“置0〞等操作。128个位地址为00H~7FH,位地址分配如表1-3所示。表1-2RS1、RS0与工作存放器的关系表1-3位地址分配表
字节寻址与位寻址是对存储单元进行读/写操作的两种寻址方式。字节寻址时需给出存储单元的字节地址,如P0、P1、20H等,读/写操作的对象是1个字节(8位二进制数),如P0 = 30H、20H = 56H等;位寻址时需给出可位寻址的存储单元中某一位的位地址,如P0.1、P1.1、20H等,读/写操作的对象是1位二进制数,即0或1,如P0.1 = 0、20H = 1。特别是20H = 56H与20H = 1的区别,前者执行的结果是使20H单元的数值为56H即01010110B,由表1-3可知后者只是将24H单元的最低位置1。
字节寻址是C51编程时的根本寻址方式,51单片机中所有存储单元均可字节寻址,但只有片内RAM中20H~2FH这16个单元和字节地址能被0或8整除的特殊功能存放器可以位寻址。(3)用户区。地址为30H~7FH的80个字节为用户RAM区,只能字节寻址。该区域主要用做堆栈、数据暂存。
(4)特殊功能存放器。片内数据存储器中地址为80H~FFH的高128B为特殊功能存放器区,简称为SFR区。SFR是51单片机内部具有特殊用途的存放器(如并行口存放器、串行口、定时/计数器存放器等)的总称,主要用于管理单片机内的功能部件,如定时/计数器、中断系统等。在这128个字节中,只用了其中21个(51系列单片机)或27个(52系列单片机),字节地址以0或8结尾的SFR既可以进行字节寻址,又可以进行位寻址。特殊功能存放器(SFR)如表1-4所示。对SFR区中没有使用的单元进行读/写操作是无意义的。表1-4特殊功能存放器(SFR)下面介绍几种常用的特殊功能存放器:
①累加器A— 最常用的一个8位专用存放器, 用于向CPU提供运算所需的操作数,运算后的结果也存于A中。
②存放器B— 一个8位存放器,主要用于乘、除法指令。
③程序状态字(PSW)— 一个8位存放器,反映了指令执行后CPU的工作状态。 PSW的一些位由用户软件设置,有些位那么在指令执行后由硬件自动设置。程序状态字(PSW)存放器的格式如表1-5所示。表1-5程序状态字(PSW)存放器PSW.7(CY)——进位/借位标志。有进位/借位时,CY=1;无进位/借位时,CY=0。位操作时作累加位使用。
PSW.6(AC)——辅助进位/借位标志。低4位向高4位进位或借位时,AC=1;否那么AC=0。常用于十进制调整。
PSW.5(F0)——用户标志位,由用户定义的标志位。
PSW.4、PSW.3(RS1和RS0)——当前工作存放器区选择位,如表1-2所示。
PSW.2(OV)—溢出标志。如果两个有符号数的运算结果超过了8位二进制数所能表示数据的范围(-128~+127)时表示产生溢出,OV=1;无溢出时,OV=0。PSW.1—保存位,未使用。
PSW.0(P)—奇偶校验位。累加器A中1的个数为奇数时,P=1;1的个数为偶数时,P=0。
④数据指针DPTR—一个16位存放器,也可拆成两个8位存放器DPH和DPL使用,其中DPH为高8位,DPL为低8位。DPTR存放的是片外数据存储器中某存储单元的地址,CPU通过DPTR访问片外数据存储器。⑤堆栈指针SP—堆栈就是一段连续存储单元,位于片内RAM的用户区中,堆栈中数据的存取原那么是“后进先出〞,堆栈的具体位置由堆栈指针SP来决定。堆栈指针SP是一个8位存放器,它指示堆栈顶部在片内RAM中的位置。设置堆栈主要是为了保护断点和现场,单片机无论是转入子程序或执行中断效劳程序,执行完后都要返回主程序,在转入子程序和中断效劳程序前,必须将断点地址、重要的数据保存在堆栈中,否那么返回时CPU就不知道原来程序执行到哪一步,应该从何处开始接着往下执行了,断点地址的存取是由硬件自动完成的。⑥P0~P3并行口存放器—通过对存放器P0~P3的读/写,就可以实现数据从相应并行I/O口的输入/输出。假设要使P0口8个引脚全部输出高电平,只要将FFH写入P0口即可,即P0 = 0xff。1.2.3数制及转换
首先我们来看下面3个式子是否正确。
1+1=1;
1+1=2;
1+1=10。
应当说,这3个式子都是正确的。1+1=1是逻辑运算,逻辑运算表示的是事物之间的因果关系,不表示大小;1+1=2当然是我们最熟悉的十进制运算;1+1=10仍是数值运算,只不过是用二进制表示数的大小,逢二进一。因此,数制是表示数大小的一种方法。我们最熟悉的是十进制数,但在数字电路中只有高、低两种电平,这就决定了数字电路是以二进制数为根底的。CPU是数字电路开展取得的伟大成果之一,它是典型的数字产品,因此CPU只能处理二进制信息。但是通常在计算机系统中,根本的存储单位为字节,即8位二进制数,如一存储单元的值为00111100B,写这样一串二进制数很容易出错,不如写成十六进制数3CH方便,因此需要熟悉二进制、十六进制及其转换。1.二进制
任意一个二进制数都是由0或1两个数码组成的,二进制数的运算规律为“逢二进一〞,其权为2n,后缀为B。如二进制数1101B按权的展开式为
1101B = 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 13
2.十六进制
十六进制数的数码有16个,分别为0~9和A~F,A~F表示十进制数10~15。其运算规律为“逢十六进一〞,其权为16n,后缀为H,如8CH。用C语言编程时,在十六进制数的前面加“0x〞,如0x8C。3.二进制数与十六进制数的转换
(1)二进制数转换为十六进制数的方法:从二进制的最低位开始,每四位为一组,最后缺乏4位时补0,然后分别转换为十六进制数码。如11010110B,可分为1101与0110两组,那么对应的十六进制数为D6H。
(2)十六进制数转换为二进制数的方法:将每个十六进制数码用四位二进制数替代。如89H,8对应的二进制数是1000,9对应的二进制数是1001,所以89H=10001001B。1.2.451单片机存储器的扩展
当单片机片内资源不够时,需要片外扩展程序存储器或数据存储器。由于单片机技术的进步,目前单片机程序存储器的容量根本都能满足要求,不需要扩展,但是由于单片机提供的I/O接口有限,控制任务复杂时经常需要扩展接口,而51单片机中接口地址与片外数据存储器是统一编址的,因此存储器的扩展对于单片机的应用仍有重要的意义。
1.存储器引脚介绍
CPU与存储器之间通过三总线相连,因此存储器应提供地址、数据、控制三类引脚。1) ROM存储器
ROM存储器在工作时,只允许读出不允许写入,掉电后信息不丧失,在51单片机中用作程序存储器,因此ROM型存储器控制线除片选外只需要一个控制信号。 一个ROM存储器应具有如下引脚:
()—片选端,低电平有效。当为低电平时,允许对存储器进行读操作;当为高电平时,芯片不工作。
—输出使能端,低电平有效。当为低电平时,存储单元与数据线相连可以读出数据;当为高电平时,存储单元与数据线之间为高阻状态,即断开,不能读出数据。An~A0—地址线。用于传送待读单元的地址,A0为最低位。
D7~D0—数据线。用于传送选定单元中存储的数据,D0为最低位。
图1-11(a)所示为8KBROM存储器的逻辑图,由于8KB=213B,所以访问该存储器共需A12~A013根地址线。只有当、同时有效为0时,由地址线A12~A0选定存储单元的数据才会送至数据线D7~D0,实现读操作。只要
、有任意一个为无效状态1,存储单元与数据线之间呈高阻状态,就不能读出存储单元的数据。图1-11存储器的逻辑图2) RAM存储器
RAM存储器在51单片机中用作数据存储器,可随机读写,掉电后信息会丧失,因此它与ROM的区别主要在控制线上。除了片选端外,RAM还需要(读信号)、(写信号)两个控制信号,和不能同时处于有效状态。图1-11(b)所示为8KBRAM的逻辑图。
当=1无效时,该存储器不工作;当=0有效时,如果与均无效,这时数据线与内部存储单元之间为高阻状态,既不能读出也不能写入数据;当、同时有效为0时,才能读出由地址线A12~A0选定单元中存储的数据,实现读操作;当、同时有效为0时,可将数据存入由地址线A12~A0选定的单元,实现写操作。2. 51单片机三总线结构
在进行片外扩展连接时,51单片机要提供三类总线以便与其他器件交换信息,51单片机的三总线结构如图1-12所示。
51单片机进行片外扩展时,提供16位地址总线、8位数据总线及所需的控制线。地址总线的高8位由P2口提供,低8位由P0口提供,当地址信息在地址总线上稳定后,在地址允许锁存端ALE锁存脉冲的作用下,将P0口的低8位地址信息存入片外地址锁存器中,然后将P0口用作数据总线发送数据。控制信号线有3个,其中、是片外数据存储器的读/写控制信号,是片外程序存储器的读选通信号。图1-12单片机片外扩展三总线3. 51单片机与存储器的扩展连接
图1-13所示为某单片机控制系统片外存储器扩展连接图,试分析芯片RAM与ROM的地址范围。
不管是ROM还是RAM,要使其工作,片选端必须有效,图1-13中端与3线-8线译码器的端相连,要使
端有效,那么A15、A14、A13这3根地址线的信号必须为001。当A12~A0全为低电平时,选中ROM与RAM中的最低地址单元;当A12~A0全为高电平时,选中ROM与RAM中的最高地址单元。故这两块存储器的地址范围为0010000000000000B~0011111111111111B,即2000H~3FFFH。ROM与RAM两个芯片的地址范围完全一样,发送一个地址会同时选中两个单元,这两个单元不会冲突。通过读取地址为2000H单元的数据,就可以看出ROM与RAM区别如下:
(1)由地址总线P2、P0口输出16位地址0010000000000000B,即2000H。
(2)当地址总线上的地址信号稳定后,由地址信号允许锁存端ALE发出锁存脉冲,将P0口的低8位地址锁存在锁存器中。
(3)由P2口、锁存器提供的16位地址,选中存储器ROM与RAM中的2000H单元,但此刻选中单元与数据线之间仍呈高阻状态。图1-13单片机存储器扩展连接图(4)CPU根据指令码区分出是访问ROM还是RAM。如果是访问ROM的指令,那么使有效,、无效,故只能读出ROM中2000H单元的数据,而RAM中2000H单元由于控制信号无效,故与数据总线断开;如果是读RAM的指令,那么使、无效,有效,只能读出RAM中2000H单元的数据。
从(4)可以看出,片外程序存储器ROM与片外数据存储器RAM的地址范围相同,都为2000H~3FFFH,但由于使用不同的控制信号,所以不会产生冲突。当然在片外扩展时,也可为ROM、RAM分配不同的地址空间。1.2.5C51根底
1.计算机编程语言简介
单片机是一种大规模的数字集成电路,它只能识别0和1,因此最早的程序就是由一连串的0和1组成的。这种由二进制代码0和1表示的,能被计算机直接识别和执行的语言称为机器语言,由机器语言编写的程序可以被CPU直接执行,并且速度快。例如要将30H赋给累加器A,那么机器码为0111010000110000B,可表示为74H30H。由于机器语言难记、难写、难读,因此人们将这种由0、1组成的指令用英文助记符来表示,并称为汇编语言。如上述任务可用指令MOVA,#30H来实现。用汇编语言编写的源程序,CPU不能直接执行,必须通过汇编程序将汇编语言源程序翻译成机器语言程序后才可运行。汇编语言目前在控制领域的应用仍然十分广泛,它的效率高、实时性强,但是汇编语言与机器语言一样都是面向机器的,这使汇编语言程序的移植性差,要求编程者对硬件一定要十分熟悉,初学者较难熟练掌握。为了更好地开发利用计算机,产生了高级语言。高级语言接近于数学语言与自然语言,是目前绝大多数编程者的选择。与汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如堆栈、存放器等,这样不仅为编程者带来了方便还缩短了源程序。目前高级语言种类很多,如C语言、FORTRAN、VB、PASCAL等。不管是用何种高级语言编写的源程序,CPU都不能直接执行,均必须通过相应的编译程序将其翻译成机器语言程序(称为目标程序)后,CPU才能
执行。由于C语言功能丰富,表达能力强,使用灵活方便,应用面广,兼顾了多种高级语言的特点,目标程序效率高,能直接对计算机硬件进行操作,因此针对51单片机的C51语言已成为专业化的实用高级语言,在控制领域越来越多的人选用C语言作为开发工具。2. C51程序结构
一个C51源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,因此C51采用函数结构。一个源程序不管由多少个源文件组成,都有一个且只能有一个main函数,即主函数,不管main()函数写于何处,程序总是从main()函数开始执行,最后回到main()函数结束。main()函数可调用其他函数,但不能被调用;其他函数也可以互相调用;中断函数不能被任何函数调用,包括主函数。编写C51源程序时,常采用的结构如下所示:函数一般由函数定义和函数体两局部组成。函数定义局部包括函数类型、函数名、形式参数等,函数名后面必须跟一个圆括号();形式参数在()内定义。函数体由一对花括号“{}〞括起来。如果一个函数内有多个花括号,那么最外层的一对“{}〞为函数体的内容。函数体一般由声明语句和执行语句两局部组成。声明语句用于定义函数中用到的变量,也可对函数体中调用的函数进行声明。执行语句由假设干语句组成,用于完成一定的功能。如果函数体只有一对花括号“{}〞时,称之为空函数,什么也不做。C51中的每条语句必须以分号“;〞作为结束符,但是预处理命令、函数定义和花括号“}〞之后不能加分号“;〞。只有一个分号的语句称为空语句。例如:要实现z=x+y,x、y、x为整数,可写作:
intx,y,z;
main()
{
x=5; //给x、y赋值
y=6;
z=x+y;
}
为了使源程序便于阅读和维护,C51源程序书写时应遵循如下规那么:
(1)每行只写一个说明或一条语句。
(2)用“{}〞括起来的局部,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。
(3)低一层次的语句或说明可比高一层次的语句或说明缩进后书写。
(4)用“/*……*/〞或“//〞作注释,以增加程序的可读性。
(5) C51对字母的大小写比较敏感,在程序中,同一个字母的大小写系统是作不同处理的。
编程时力求遵循这些规那么,以养成良好的编程习惯。3. C51中的根本数据类型
1)变量
变量的值在程序运行过程中是可以变化的,C51中用到的所有变量必须作强制定义,即先定义后使用。一般从数据类型、存储类型、作用域三个方面定义一个变量,在本节中,仅介绍变量的数据类型,存储类型、作用域在后续工程中介绍。
数据类型是根据被定义变量的性质、表示形式、占据存储空间的多少以及构造特点对变量进行定义的,即定义了变量的大小。常用的数据类型有根本数据类型、构造数据类型、指针类型、空类型4大类。(1)根本数据类型。根本数据类型最主要的特点是其值不可以再分解为其他类型,根本数据类型是自我说明的。根本数据类型是最根本的,C51中常用的根本数据类型及其大小如表1-6所示。
表1-6中,bit、sbit、sfr、sfr16为C51的扩充数据类型,主要是针对51系列单片机而设置的。51单片机内部有21个特殊功能存放器,每个存放器在存储器中都分配有唯一的地址和名称,单片机只能识别地址。我们记忆名称较为方便、快捷,因此当我们编程读写这些存放器时,必须要在程序开始时用关键字sfr、sfr16对这些存放器加以定义,实际就是给每个存放器起一个我们已经约定好的名字,这样编译器才能将这些名称与RAM中的存储单元进行绑定,对它进行读/写操作。当然也可以起其他的名字,但是不利用互相交流和学习。表1-6C51根本数据类型及其大小①sfr——定义一个8位特殊功能存放器。一般形式为
sfr8位SFR名称=地址;
例如:
sfrP0=0x80;
P0口是单片机4个并行I/O口中的一个,由表1-3可知它在片内RAM中的地址是80H。通过这样定义后,编译器就会知道,P0就代表了80H单元,对P0口进行读/写操作实际上是对80H单元进行读/写。例如,执行语句“P0=0xfe;〞结果是使P0.0为低电平,P0.1~P0.7为高电平,指令采用字节寻址同时设置P0口的8个输出位。
②sfr16 ——定义一个16位特殊功能存放器。一般形式为
sfr1616位SFR名称=地址;
③sbit——定义位地址,即可位寻址的特殊功能存放器中的某一位地址。一般形式为
sbit位地址名=位地址;
式中位地址一般有三种形式:直接位地址、特殊功能存放器字节地址值带位号、特殊功能存放器名称带位号。如采用特殊功能存放器名称带位号时,需在定义位地址之前用sfr/sfr16对特殊功能存放器进行定义,且字节地址与位号之间、特殊功能存放器名称与位号之间用“^〞作间隔。例如:
sbitled1=0x80; //直接位地址
sbitled1=0x80^0; //特殊功能存放器字节地址值带位号
sbitled1=P0^0; //特殊功能存放器名称带位号
上述3条指令的作用都是给P0口最低位的位地址P0.0起名字为led1,由led1可以知道该引脚外接一个发光二极管,可提高程序的可读性;如果外接一按键时,可定义为sbitkey=P0^0;。如在程序中执行语句“led1=0;〞的结果就是使P0.0引脚输出低电平,P0.1~P0.7保持原状态不变。对P0~P3进行位寻址时需先定义位地址。④bit——定义位变量,一般形式为
bit位变量名;
例如:
bitb1;
定义了一个位变量b1,编译时由系统将b1与位寻址区(片内RAM的20H~2FH单元)中128个位地址中的一个绑定(由编译器决定)。当b1被修改后,b1对应的位地址所在字节单元的内容也会随之改变。关键字bit与sbit的区别在于,sbit用于定义51单片机内部可以位寻址的特殊功能存放器的某一位,定义的同时需要给出位地址(在片内RAM高128B),位地址与名称之间的关系要符合表1-4;而bit定义的是任意的位变量,名称可以由用户随便命名,位变量对应的位地址由编译器在编译时给出(在片内RAM低128B的位寻址区),在定义位变量的同时是否赋初值由需要而定。
如果每次编程时都重新定义SFR,去查找SFR的实际地址,这样做势必很麻烦,也没有必要。在头文件reg51.h或reg52.h中,已经对51或52系列单片机中用到的特殊功能存放器和可位寻址位作了定义,我们可以通过文件包含命令直接使用。reg51.h或reg52.h中的局部内容如下:sfrP0=0x80;
sfrP1=0x90;
……
sbitCY=PSW^7;
sbitAC=PSW^6;
(2)构造数据类型。构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的,即一个构造类型的值可以分解成假设干个“成员〞或“元素〞,每个“成员〞都是一个根本数据类型或又是一个构造类型。在C语言中,数组类型、结构类型、联合类型都属于构造类型。(3)指针类型。指针是一种特殊的,同时又具有重要作用的数据类型。指针的值是存储器中某个单元的地址,根据指针的值可以取出该单元中存储的数据。虽然指针变量的取值类似于整型量,但它们是两个类型完全不同的量,因此不能混为一谈。
(4)空类型。在调用函数时,通常应向调用者返回一个函数值。如果调用后不需要返回函数值时,可将该函数定义为空类型,其类型说明符为void。
定义变量时,变量名要“见名知义〞,除此之外还应注意以下几点:①允许在一个类型说明符后,说明多个相同类型的变量,各变量名之间用逗号分隔。类型说明符与变量名之间至少用一个空格间隔,最后一个变量名之后必须以“;〞号结尾。
在定义变量的同时可以为其赋初值,这种方法称为初始化。一般形式为
类型说明符变量1=值1,变量2=值2,……;
例如:
unsignedchara=4,b=45,c=0x45;
unsignedintx=32,y=344,z=7544;
应注意,在定义中不允许连续赋值,如unsignedchara=b=c=5是不合法的。②变量定义必须放在变量使用之前,一般是放在函数体的开头局部。
③给变量赋适宜的数值。定义了变量的数据类型后,编译器编译时就会根据该变量的数据类型在单片机的存储器中为其分配一定的空间,变量的数据类型不相同,所分配的存储单元也就不同,为了合理地利用单片机的存储空间,编程时就要设定适宜的数据类型。变量的数据类型确定后,变量数据的大小就受到了限制,编程时就不能随意给一个变量赋值了。例如:
unsignedchara;定义了一个无符号字符变量a,编译器就分配1个存储单元用于存放a的数值,如果给a赋大于255的数值,如a=987;时,由于存放987需要2个存储单元,所以数据就会丧失,影响程序的执行结果。
④定义变量时,要考虑51单片机内存储器容量。51单片机内片内数据存储器256B中仅低128B由用户使用,片内程序存储器也只有4KB,因此定义变量类型时,最好结合实际情况,尽可能定义为unsignedchar、signedchar类型,然后定义为unsignedint、signedint类型,充分利用51单片机有限的存储器实现各种控制功能。⑤在C51源程序中,如果出现数据类型不一致的情况,会按照隐式转换的顺序进行转换。例如:
bit→char→int→long→float
signed→unsigned
也就是说,当一个bit量与一个int量进行运算时,系统会自动将位变量bit变为整型量int,然后再与int量进行运算,结果为int量。
2)常量
常量在程序执行时是不会改变的。常量也有数据类型,在源程序中,常量是可以不经定义而直接引用的。最常用的是整型常量即整常数:十进制整数如10、240等;十六进制整数要加前缀“0x〞或“0X〞,如0x30、0xfe等。注意:0xfe与0xFE都是正确的。4.文件预处理
C51编译器在对源程序进行编译之前,先要对程序中的一些特殊命令进行预处理。预处理命令主要包括宏定义define和文件包含include。预处理命令以符号“#〞开头。
(1)宏定义#define。宏定义#define的功能是用一个指定的标识符来代表一个字符串或常量。其一般形式为
#define标识符字符串(或常量)
例如:
#defineBYTEunsignedcharunsignedchar的另一个名字就是BYTE,然后可以用BYTE来定义数据类型。例如:
BYTEx;
BYTEy;
那么变量x、y为unsignedchar型。
(2)文件包含#include。所谓文件包含是指一个源文件可以包含另一个源文件,通过命令#include来实现。其一般形式为
#include“文件名〞
或#include<文件名>
文件包含的执行过程如图1-14所示。预处理时,先把“文件名〞指定的文件内容复制到文件包含命令所在的位置,再对合并后的文件进行编译。
文件包含在C51编程时非常有用,它可以最大限度地防止编程人员重复劳动,提高工作效率。例如,在编写51单片机的应用程序时,第一条总是写“#include<reg51.h>或#include<reg52.h>〞,它的作用就是将特殊功能存放器定义头文件reg51.h或reg52.h包含到自已的源文件中,就不必再对特殊功能存放器重新定义了。图1-14文件包含示意图另外,利用C51的库函数能使程序代码简单、结构清晰。每个库函数在相应的头文件中给出了函数原型声明,用户使用这些库函数时,在源文件开始处利用#include,将相关的函数声明头文件包含进来,系统在编译连接时会将该函数的程序代码从函数库中调出,嵌入到源文件中。在下例中,通过math.h头文件中的externfloatsin(floatval)声明语句,系统在编译连接时会将sin(x)的源代码从函数库中调出,嵌入到该程序中,用户不必了解sin(x)实现的方法。例如:
#include<math.h>
floatx,y;
main()
{
x=1.23;
y=sin(x);
…
}C51常用头文件如下:
reg51.h/reg52.h 定义了51/52系列单片机中的特殊功能存放器与可位寻址的SFR的位地址
intrins.h 定义了C51的内部函数
math.h 定义了常用的数学函数
absacc.h 包含允许直接访问51单片机各存储区的宏定义
stdio.h 定义了51单片机的串口输入/输出函数
string.h 定义了字符串操作函数
stdlib.h 定义了动态内存分配函数5. while语句
while语句是C51中的循环语句,它的一般形式为
while(表达式)
{
语句;(可为空语句)
}
说明:表达式为循环条件,语句为循环体。
特点:先判断表达式,后执行循环体语句。
while语句执行时先判断表达式的值,如果表达式的值为真,就执行循环体语句;假设表达式的值为假,那么直接执行while后面的语句。while语句执行流程如图1-15所示。图1-15while语句执行流程图注意:
(1)在C语言中,真是指“非0〞,假是指“0〞,例如1、2、10等任何非零的数值都为真。
(2)表达式可以是一个常数、一个关系表达式、一个逻辑表达式或一个带返回值的函数。
(3)循环体语句可以是空语句,即“;〞。
(4)当循环体语句只有一条语句时,可不写大括号。“while(1);〞是最简单的while语句,它的表达式为1,永远为真,而它的循环体为空语句,什么也不需要做,所以while语句构成了一个死循环,一直执行空语句,相当于使单片机停机。在C语言中,while的循环体语句中一定要有使循环趋于结束的语句,以免构成死循环;而在C51中,却常常需要形成死循环。这也是C语言与C51的区别之一。
“while(1);〞中的分号“;〞一定不能省,否那么会将while(1)后的第一条语句作为它的循环体,后面没有语句时,那么是错误的while语句。
例如:试分析下述3个while语句的循环体。①while(1)
P0=0x88;
P1=0x33;
②while(1);
P0=0x88;
P1=0x33;
③while(1)
{
P0=0x88;
P1=0x33;
}根据while语句的要求可知,第一个while语句的循环体为“P0=0x88;〞,语句“P1=0x33;〞不被执行;第二个while语句的循环体为“;〞,语句“P0=0x88;P1=0x33;〞不被执行;第三个while语句的循环体为“P0=0x88;P1=0x33;〞,反复执行这两条语句。1.3项目实施
1.3.1硬件设计方案
发光二极管(LED)是最简单的输出设备,通过它的亮、灭可以反映出程序运行的结果。发光二极管的内部为一个PN结,具有单向导电性,当给LED加正向电压时,可以发出不同颜色的光。由于发光二极管为非线性元件,因此当驱动LED时,应该串接限流电阻,限流阻值的大小应根据LED所需的工作电流来选择。常用发光二极管的工作电压VD一般为1.5V~2V,工作电流ID一般取10mA~20mA。I/O接口是单片机与外设交换信息的桥梁,图1-16中给出了用51单片机的并行I/O口驱动发光二极管的三种连接方法。当I/O口输出低电平时,方式2、方式3中所接LED均可正偏;当I/O口输出高电平时,方式1所接LED正偏。但是不是三种连接方法都能点亮LED,还要先了解一下51单片机并行I/O口的带负载能力。51单片机所接负载一般有灌电流负载和拉电流负载两种情况。灌电流负载是指当并行I/O口输出低电平时,负载电流由外设流入单片机I/O口,I/O口被动接受负载电流,所以称之为灌电流,此时所接外设称为灌电流负载,如图1-16中的方式2、方式3;拉电流负载是指当并行I/O口输出高电平时,单片机I/O口主动给负载提供输出电流,所以称之为拉电流,此时所接负载称为拉电流负载,如图1-16中的方式1。图1-1651单片机驱动发光二极管51单片机的带负载能力如何呢?查阅相关资料可知,当51单片机I/O口输出高电平时,P0口可接8个,P1~P3仅能驱动3个TTL门电路,而每个门电路的输入电流是μA级,因此可知并行I/O口能提供的拉电流非常小;I/O口能承受的灌电流较为特殊,一个I/O口允许灌入的最大电流为10mA,8位I/O接口P1~P3口允许灌入的总电流之和不超过15mA,P0口较大可达26mA,P0~P3允许灌入的电流之和不能超过71mA。由此可见,单片机带灌电流负载的能力要远远大于带拉电流负载的能力。
根据51单片机的带负载能力,可知在方式1中,当I/O口输出高电平使LED满足正偏条件时,却无法提供LED所需的工作电流,因此方式1的接法是错误的。在方式2中,当I/O口输出低电平VOL(0.3V)时,LED正向偏置,电流灌入I/O口,当电流小于单个I/O口允许的灌电流时,就可以平安点亮LED。该方式适合于LED工作电流较小、数量较多但不同时点亮的场合。限流电阻R为
式中,VD、ID为LED的工作电压、电流。当LED的参数为2V/10mA时,R = 270Ω。在方式3中,利用三极管来驱动LED,灌入I/O口的是三极管的基极电流,因此是正确的。该方式适用于LED工作电流较大或数量较多且同时点亮的场合。例如:要求用P0口连接8个LED,每个LED工作电流为20mA,且8个LED可能同时点亮时,方式3是唯一平安可靠的接法。方式3原理如图1-17所示,三极管构成了一个电子开关,由单片机控制电子开关,当I/O口输出低电平时,三极管饱和导通相当于开关闭合,由VCC提供LED所需工作电流,点亮LED;当I/O口输出高电平时,三极管截止相当于开关断开,LED不能点亮。图1-17发光二极管驱动方式3等效电路为了保证I/O口输出低电平VOL=0.3V时(即三极管基极输入电压),三极管可以工作于饱和区,需要选取适宜的R1、R2。假设三极管β=100,LED的参数为2.2V/20mA,三极管的饱和压降UCE = 0.3V,那么
当VCC = 5V时,R2 = 120Ω。
如何选择R1呢?当三极管工作在饱和区时,必须满足βIb>Ic,且Ib<10mA(一个I/O口允许的灌电流),由图1-17可知,Ib=(VCC-UBE-VOL)/R1,Ic=ID,因此R1应满足
式中,当VCC = 5V、UBE = 0.7V时,R1 < 20kΩ。取R1 = 10kΩ时,Ib = 0.4mA满足
Ib < 10mA,应选R1 = 10kΩ。
根据工程一的要求,确定本工程采用方式2在P2口连接8个发光二极管。工程一硬件电路如图1-18所示。图1-18工程一硬件电路图1.3.2软件设计方案
1.点亮一个发光二极管
工程要求编程点亮图1-18中的一个发光二极管,下面以点亮P2.0所接LED0为例介绍软件设计。
编程依据:当I/O口输出低电平时,点亮该I/O口所接LED;当I/O口输出高电平时,该I/O口所接LED熄灭。
51单片机的4个并行I/O口P0~P3寻址方式灵活,既可字节寻址,也可位寻址。字节寻址是一次向P2口发送一个字节即8位二进制数,但是只有最低位P2.0是我们需要的,根据编程依据使P2.0为低电平0;P2.1~P2.7没有用,可以为任意值,但是为了与P2.0作区别,全取1,最终P2口的数据见表1-7。表1-7P2口的数据
1)源程序(字节寻址)
#include<reg51.h> //包含头文件reg51.h
main() //主函数
{
P2=0xFE; //字节寻址,点亮LED0、熄灭LED1~LED7
while(1); //动态停机
}命令“#include<reg51.h>〞的作用是将头文件reg51.h中定义51单片机特殊功能存放器的全部内容包含在该源程序中,在此就不必再定义了。编译时,是先将reg51.h中的全部内容复制到命令“#include<reg51.h>〞所在位置后,再进行编译。如果没有这条文件包含命令时,需要添加上语句“sfrP2=0xA0;〞,否那么编译器就不知将P2的数值存往何处。注意:头文件reg51.h或reg52.h中定义的所有名称均为大写字母,如果后面使用时写成小写字母,编译器将会不认识“p2〞,会提示“未定义(undefine)〞。“//〞为注释符号,每个“//〞只能注释一行。添加注释后,可方便阅读程序。
语句“P2=0xFE;〞为字节寻址,同时控制P2口的8个I/O引脚,0xFE是十六进制整数,转换为二进制数11111110后,只有P2.0为0,因此图1-18中LED0点亮、LED1~LED7熄灭。
本工程的任务非常简单,只用一条语句就可实现功能,之后单片机就无事可做,但是51单片机是不能停机的,除非给它断电,“while(1);〞语句的作用就是让单片机停止,但又不是真正的停机,它仍在执行“while(1);〞,因此称之为动态停机。2)源程序(位寻址)
位寻址时只需为P2.0发送点亮LED0所需的低电平0。
#include<reg51.h>
sbitLED0=P2^0;//给P2.0起名字为LED0
main()
{
LED0=0; //位寻址,点亮LED0、熄灭LED1~LED7
while(1); //动态停机
}51单片机的4个并行I/O口都是可以位寻址的,采用位寻址也可点亮一个LED,大家可能会想,不是已经将头文件reg51.h包含进来了吗?为什么还要用语句“sbitLED0=P2^0;〞定义P2.0呢?在KEILC中选中头文件reg51.h,单击鼠标右键,在快捷菜单中,选中“openreg51.h〞就可以翻开该文件。浏览该文件可以看到,4个并行I/O口P0~P3只定义了字节地址,并没有定义每一个的位地址,所以在对P0~P3的任意位进行位寻址时,源程序中必须用关键字“sbit〞进行定义。语句“sbitLED0=P2^0;〞的作用是给P2口的最低位P2.0重新起了一个名字LED0,当然你可以给它起其他的任何名字,但最好能见名知意。语句“LED0=0;〞的作用是使引脚P2.0输出低电平,所接LED0正偏点亮。源程序中我们并没有控制P2口的P2.1~P2.7,为什么LED1~LED7也和字节寻址时一样熄灭?这是因为图1-18电路中的复位电路在上电自复位后,P0~P3的初值为全1,即FFH。
2.点亮假设干发光二极管
学会点亮一个发光二极管后,用相同的方法可以点亮8个发光二极管中的任意个。例如,点亮LED1、3、5、7四个发光二极管时,如果采用字节寻址,那么P2口的数据见
表1-8。表1-8P2口的数据
1)源程序(字节寻址)
#include<reg51.h> //包含头文件reg51.h
main() //主函数
{
while(1) //死循环
P2=0x55; //字节寻址,点亮LED1、3、5、7,熄灭LED0、2、4、6
}2)源程序(位寻址)
位寻址时,每条语句只能点亮或熄灭一个LED。编程时需要先用关键字“sbit〞定义P2.1、P2.3、P2.5、P2.7四个I/O口,在主函数中,用4条位寻址语句才能够点亮4个发光二极管。
#include<reg51.h>
sbitLED1=P2^1; //定义P2.1为LED1
sbitLED3=P2^3; //定义P2.3为LED3
sbitLED5=P2^5; //定义P2.5为LED5
sbitLED7=P2^7; //定义P2.7为LED7
main(){
while(1) //死循环
{
LED1=0; //位寻址,点亮LED1
LED3=0; //位寻址,点亮LED3
LED5=0; //位寻址,点亮LED5
LED7=0; //位寻址,点亮LED7
}
}通过比较前述两段源程序可以看出,当点亮的发光二极管较多时,位寻址的源程序会很长,而字节寻址不管点亮8个发光二极管中的几个,都只需要一条语句。因此编程时要依据实际情况选择适宜的寻址方式,字节寻址适用于操作位数较多的情况,而位寻址那么适合于操作位数较少的情况。
再比较本工程中的四段源程序,可以发现,在点亮一个发光二极管的源程序中,向I/O口发送一次代码后,while语句使CPU无数遍执行空语句,相当于动态停机;而在点亮假设干个发光二极管的源程序中,将发送代码的语句作为while的循环体,因此单片机上电后,CPU是在无数遍地向I/O口发送代码。1.3.3程序调试
1.实验板电路分析
HOT-51实验板上,8个LED的连接方法如图1-19所示,采用图1-19中的方式2,8个LED与P0口相连。由于未加驱动电路,考虑到P0口的带负载能力,所以在练习编程时,每次尽可能只点亮一个发光二极管,如果点亮假设干个发光二极管,那么可缩短实验板的通电时间。图1-19HOT-51实验板LED电路2. KEILC介绍
单片机的程序设计要在特定的编译器中进行,编译器可以完成源程序的编辑、编译等工作,生成可下载文件,现在最常用的是Keil公司的μVision集成开发环境,它支持C51语言和汇编语言的程序设计。
KeilμVision2中有一工程管理器,用于管理工程文件。KeilμVision2在使用时要先新建工程,然后再新建源程序文件,当源程序文件编辑好后,最后通过编译生成可下载文件。
(1)启动。从开始菜单或桌面上启动KeilμVision2,图1-20中圈出的即为“KeilμVision2〞图标,启动后界面如图1-20所示。图1-20KeilμVision2主窗口
(2)新建工程。
①创立新工程。选择按钮“Project\NewProject〞,出现如图1-21对话框。选择好存储路径,键入工程名称后单击“保存〞按钮。工程的扩展名为.uv2。
(2)新建工程。
①创立新工程。选择按钮“Project\NewProject〞,出现如图1-21对话框。选择好存储路径,键入工程名称后单击“保存〞按钮。工程的扩展名为.uv2。
如果使用前一次创立的工程,选择“Project\OpenProject〞,再从弹出的窗口中选择已有的工程即可。图1-21创立新工程窗口②选择单片机型号。选择好存储路径、键入工程名称后单击“保存〞按钮,弹出如图1-22所示单片机型号选择窗口,选择“Atmel\AT89S51或AT89S52〞,单击“确定〞按钮,将出现如图1-23所示的提示窗口,单击“是〞按钮,新工程创立成功。
在工程工作区窗口ProjectWorkspace显示框内,单击文件夹Target1左侧的符号“+〞,展开后如图1-24所示。在后面编辑源程序时,Target1应一直保持展开状态。图1-22单片机型号选择窗口图1-23提示窗口图1-24新建工程后工程工作区窗口③选择创立扩展名为.HEX的文件。单击图1-25(a)所圈快捷图标或选择“Project\BuildTarget〞,会弹出如图1-25(b)所示窗口,单击第三个选项“Output〞,选中“CreateHEXFile〞,单击“确定〞按钮即可。
每次新建工程后,都需作此选择。HEX文件的名称默认与工程名相同,也可以在图1-25(b)中的“NameofExecutable〞后键入所需名称;HEX的文件默认与工程存放在同一文件夹,也可单击图1-25(b)中“SelectFolderforObjects...〞按钮,在弹出的窗口中重新选择存储路径。图1-25创立扩展名为 .HEX的文件窗口(3)新建源程序文件。
①创立新的源程序文件。单击“File\New〞后,会弹出如图1-26所示的文本编辑窗口。
②保存源程序文件。选择“File\Saveas〞,会弹出如图1-27所示的窗口,选择好存储路径(和工程保存在同一文件夹),并键入源程序文件名(注意:一定要键入源程序文件扩展名 .c),如“一个LED(位寻址).c〞,单击“保存〞按钮后进入编辑界面。源程序文件在先保存后编辑时,C51的关键字将会高亮显示,以便检查错误。图1-26创立新的源程序文件窗口图1-27C51源程序文件保存窗口
③将新建的源程序文件添加至工程中。如图1-28(a)所示,在工程工作区窗口ProjectWorkspace显示框内,展开文件夹Target1左侧的符号“+〞,再右击文件夹“SourceGroup1〞,将弹出图1-28(a)所示界面,单击“AddFilestoGroup‘SourceGroup1’〞后,会弹出如图1-28(b)所示对话框,选择刚刚创立的源程序文件“一个LED(位寻址).c〞后,单击“Add〞,再单击“Close〞关闭该对话框。源程序文件添加后工程工作区窗口如图1-28(c)所示,多了一行显示,即刚添加的源程序文件名。如果不需要文件夹“SourceGroup1〞中的源文件,可以用鼠标左键单击不需要的“文件名〞,弹出如图1-28(d)所示界面,选择“RemoveFile‘一个LED(位寻址).c’〞,将其从“SourceGroup1〞移除后,可重新添加新的源程序文件。
文件夹“SourceGroup1〞中可以添加假设干个源文件,但是一个工程中只能有一个主函数,因此在针对HOT-51实验板练习时,每次只能添加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市场营销的未来挑战及考点分析试题及答案
- 小自考视觉传播设计前沿试题及答案
- 2025至2030年中国中西餐软体家具行业投资前景及策略咨询研究报告
- 2025至2030年中国中效空气过滤棉市场调查研究报告
- 体检中心测试题及答案
- 重点突破小自考行政管理考试试题及答案
- 《Unit 3 How old are you 》(教学设计)-2024-2025学年湘少版(三起)(2024)英语三年级上册
- 直击2024年税务师试题及答案
- 文秘专员笔试题库及答案
- 小自考视觉传播设计与制作分类考题及答案2024
- 2024-2030年中国预应力锚具行业发展现状及竞争趋势分析报告
- CHB-系列温控仪表说明书
- 应急逃生培训
- 2025年全国保安员职业技能上岗证考试题库(含答案)
- 智研咨询发布-2025年中国少儿编程行业市场竞争格局、行业政策及需求规模预测报告
- 前程无忧招聘测评题库及答案
- 2024年黑龙江省哈尔滨市中考化学试卷(附答案)
- JJF 2114-2024 矿用二氧化碳气体检测报警器校准规范
- 2024安全生产法律法规知识培训
- 《健康住宅评价标准》
- DB52T 046-2018 贵州省建筑岩土工程技术规范
评论
0/150
提交评论