C51单片机项目设计实践教程(第2版)
上QQ阅读APP看书,第一时间看更新

第1篇 理论知识

第1章 单片机知识概述

1.1 单片机简介

单片机是单片微型计算机的简称。单片机将计算机必需的运算器、控制器、存储器、输入单元、输出单元五大部件集成在一个芯片上,从结构和功能上看,都具有微型计算机的特点,因此称为单片微型计算机。单片机主要用来完成小型智能系统的控制功能,因此也称为微控制器,英文名为 Micro Control Unit(MCU)。

单片机应用已深入人们的生活,主要体现在家用电器领域。据统计,2000年,一般美国家庭中的单片机应用数量达到226个。随着物质生活水平的提高,人们对于智能电器的需求也将越来越广泛。因此掌握单片机应用系统设计技术,是电子工程师的硬性要求。

目前常用的单片机型号有多种,如ATMEL公司的以AT89 系列为代表的51单片机和ATMEG系列AVR单片机、TI公司的MSP430单片机、Microchip公司的PIC单片机等。各种单片机从功耗、内部结构、存储容量、引脚结构等方面都有一定区别。设计者应从产品需求、成本控制、自我熟悉程度等角度来选择合适的单片机型号进行产品设计。虽然各种型号单片机硬件上有较大区别,但单片机的开发思想和流程基本相同。本书将以经典的51系列单片机为例,深入介绍单片机应用系统的设计开发方法,以期读者能活学活用,举一反三,熟练掌握单片机技术。

1.2 单片机中的数据存储格式与数制转换

1.2.1 单片机中的数据存储格式

单片机作为计算机的一个种类,在数据存储上与计算机具有一致性。计算机存储信息的最小单位是一个二进制位(bit)。一位可存储一个二进制数(0或1),每8位组成1字节(B)。常用的数据存储格式有如下几种。

字节:存储器中存取信息的基本单位。我们常说某存储器容量是64MB,就是说该存储器有64兆字节(64MB,1MB=220字节)。

字:一个字16位,占用2字节。

双字:一个双字32位,由4字节组成。

四字:一个四字64位,由8字节组成。

计算机内部数据的存储模式可分为大端模式和小端模式两种,51单片机内部数据存储采用了大端模式。所谓的大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。例如,有一个整型数据 15 536,其存储于单片机的存储器中时,将占据2个字节,假设这两个字节将存储于地址为51和52的存储器单元中。将15 536转换成十六进制数,结果为3CB0,此时,如果3C存储于地址51,B0存储于地址52,就称为大端模式;如果3C存储于地址52,B0存储于地址51,就称为小端模式。

大端模式

小端模式

下面结合一个例子说明数据在单片机数据存储器中的存取过程。

假设要使用单片机对一个脉冲信号计数,每计满 1 000 个脉冲时,计数值清零并重新开始计数,计数值要通过显示器显示出来。工作模型如图1.1.1所示。

图1.1.1 单片机数据存储原理

要对单片机外部脉冲计数,并将计数值显示出来,我们先要定义一个计数变量。由于要求计1 000个脉冲,则计数值范围为0~999,最大计数值超过了1字节所能表示的范围,因此我们需要一个存储空间为双字节(字)的计数变量,当第一字节(低字节,如图1.1.1中30H)计满(FFH)时,可以将其清零,同时将第二字节(高字节,如图1.1.1中31H)加1,依次进行下去。当计到999时,高字节(31H)中的值达到03H,低字节(30H)中的值达到E7H。实际上,在用C语言完成此任务时,我们只要定义一个整型变量作为计数变量即可。编译器在给整型变量分配存储空间时,就是分配了两个连续的字节,在加1过程中的低字节向高字节进位也是自动的。在定义好计数变量后,CPU只要检测到外部脉冲,就会将变量加 1。如果要对计数值进行显示,一般处理方法是,开辟一个显示缓冲区(如图1.1.1中60H开始处),将计数变量的值的百位、十位、个位分离出来,转存至显示缓冲区,CPU最后调用显示函数,把显示缓冲区中的数字显示出来。

图1.1.1中,地址为30H的字节单元存储了数据FFH,根据数制转换的基础可知,30H单元的8个位都为二进制数“1”。计数变量的值为01FFH,即十进制数511。要注意的是,不同的单片机编译器,其给变量分配地址的规律可能不同。以一个整型变量为例,430单片机的IAR编译器在分配时,高字节在前,低字节在后,和图1.1.1中所示一致,因此采用的是小端模式;51单片机的KEIL编译器在分配时,刚好相反,就变成了(30H)=01H,(31H)=FFH,采用的是大端模式。

1.2.2 计算机中的常用数制

计算机中的进位计数制有4种,即二进制、八进制、十进制、十六进制。常用的数制有3种,即二进制数、十进制数和十六进制数。

1.十进制数

十进制数是我们最熟悉的一种进位计数制,其由0、1、2、3、4、5、6、7、8、9不同的基本数码符号构成,基数为10。所谓基数,在数学中指计数制中所用到的数码的个数。十进制数进位规则是“逢十进一”,一般在数的后面加符号D表示十进制数。

2.二进制数

二进制数是计算机内的基本数制。任何二进制数都只由 0 和 1 两个数码组成,其基数是2。进位规则是“逢二进一”。一般在数的后面用符号B表示这个数是二进制数。如数据10000110B,表示一个二进制数10000110,其转换成符合人们计数习惯的十进制方法为:1×27+0×26+0×25+0×24+0×23+1×22+1×21+0×20,即134。

3.十六进制数

十六进制数是计算机软件编程时常采用的一种数制。十六进制数由16个数符构成:0、1、2、…、9、A、B、C、D、E、F,其中A、B、C、D、E、F分别代表十进制数的10、11、12、13、14、15,其基数是 16。进位规则是“逢十六进一”。一般在数的后面加一个字母H表示是十六进制数。

1.2.3 数制间的转换

1.二进制数与十六进制数的转换

(1)二进制数转换成十六进制数

采用4位二进制数合成一位十六进制数的方法,以小数点开始分成左侧整数部分和右侧小数部分,如:10010110.0110B=96.6H。

(2)十六进制数转换成二进制数

将十六进制数的每位分别用4位二进制数码表示,然后把它们连在一起即为对应的二进制数,如:F8.7H=11111000.0111B。

2.二进制数与十进制数间的转换

(1)二进制数转换成十进制数

将二进制数按权展开后相加即得到对应的十进制数。例如,将数 1001.101B 转换为十进制数。

1001.101B=1×23+0×22+0×21+1×20+1×2−1+0×2−2+1×2−3=8+1+0.5+0.125=9.625

(2)十进制数转换成二进制数

十进制数的整数部分和小数部分转换成二进制数的方法不同,要将它们分别转换,然后将结果合并到一起即得到对应的二进制数。

十进制整数转换成二进制整数的常用方法是“除2取余法”,即用2连续去除要转换的十进制数和所得的商,直到商小于2为止,依次记下各个余数,然后按最先得到的余数为最低位,最后得到的余数为最高位依次排列,就得到转换后的二进制整数。

如将十进制数168转换成二进制数:

十进制小数转换成二进制小数的常用方法是“乘2取整法”,即用2连续去乘要转换的十进制小数部分和前次乘积后的小数部分,依次记下每次乘积的整数部分,直到小数部分为0或满足所需要的精度为止,然后按最先得到的整数为二进制小数的最高位,最后得到的为最低位依次排列,就得到转换后的二进制小数。

如将0.686转换成二进制小数:

0.686×2=1.372K−1=1

0.372×2=0.744K−2=0

0.744×2=1.488K−3=1

0.488×2=0.976K−4=0

0.976×2=1.952K−5=1

0.686≈0.10101B

3.十六进制数和十进制数间的转换

(1)十六进制数转换成十进制数

将十六进制数按权展开后相加即得到对应的十进制数。

(2)十进制数转换成十六进制数

与二进制相似,十进制整数和小数要分别转换。

十进制整数转换成十六进制整数的方法是“除16取余法”,即用16连续去除要转换的十进制整数和所得的商,直到商小于16为止,依次记下各个余数,然后按最先得到的余数为最低位,最后得到的余数为最高位依次排列,就得到所转换的十六进制数。

十进制小数转换成十六进制小数的常用方法是“乘16取整法”,即用16连续去乘要转换的十进制小数部分和前次乘积的小数部分,依次记下每次乘积的整数部分,直到小数部分为零或满足所需要的精度为止,然后按最先得到的整数为十六进制小数的最高位,最后得到的为最低位依次排列,就得到所转换的十六进制小数。

练习题:

1.将下列二进制数转换成十进制数。

11110010110000  1101.11

2.将下列二进制数转换成十六进制数。

10111100     11010010.1101

3.将下列十进制数转换成二进制数。

100       95.3     55.625

1.3 单片机的特点及应用领域

美国Intel公司分别于1971年生产出4位单片机4004和1972年生产出8位单片机8008。随着1976年MCS-48单片机的问世,单片机的发展进入了全盛时期,并在其后的30年里多次更新换代,大约每3年集成度就增大一倍、性能强度翻一番。

单片机由于其体积小、功耗低、价格低廉,且具有逻辑判断、定时计数、程序控制等多种功能,广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。

单片机具有较强的实时数据处理能力和控制功能,可以使系统保持在最佳工作状态,提高系统的工作效率和产品质量,所以在工业测控、航空航天、尖端武器等各种实时控制系统中,都作为控制器件使用。

全世界单片机的年产量数以亿计,应用范围之广,种类之多,一时难以详述。单片机应用的意义绝不仅仅限于它的广阔应用范围及所带来的经济效益,更重要的还在于它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分硬件控制电路,现在可以使用软件编程的方法来实现。这种以软代硬的控制技术称为微控制技术。微控制技术的不断发展和日趋完善,必将使单片机的应用更加深入、更加广泛。

1.4 单片机的发展趋势

目前单片机正朝着高性能和多品种方向发展,今后将进一步向低功耗、小体积、大容量、高性能、低价格、高速率、高可靠性方向发展。

1.低电压、低功耗

目前新一代的单片机大都具有 SLEEP、STOP 等省电运行方式,可以在适当的时候唤醒单片机。电源电压也呈下降趋势,3.3V的单片机越来越成为主流,而一些低电压供电的单片机电源下限可达1~2V。目前0.8V供电的MSP430单片机已经问世。

同时单片机的功耗已从mA级降到µA级,甚至1µA以下。低功耗的效应不仅是功耗降低,同时带来了产品的高可靠性、高抗干扰能力及便携化。

2.大容量

以前标准的8031单片机没有ROM,8051单片机只有4KB的ROM,二者RAM均为128B。这在一些复杂控制的场合这些存储容量常常是不够的,必须进行外接扩充。目前,包括51在内的许多单片机都已经将内部存储器做到了足够大,能满足复杂计算和控制应用对单片机存储容量的要求。如STC的STC12C5A60系列,其内部FLASH有60KB,RAM有1280B;TI公司的MSP430f149单片机内部FLASH有60kB,RAM有2KB。

3.高速率

这主要是指进一步改进CPU的性能,加快指令运算的速度和提高系统控制的可靠性。采用精简指令集(RISC)结构和流水线技术,可以大幅度提高运行速度。当前指令速度最高者已达100MIPS(Million Instruction Per Seconds,兆指令每秒),并加强了位处理功能、中断和定时控制功能。美国Cygnal集成产品公司的C8051F系列单片机采用流水线结构,指令周期以时钟周期为单位,由标准的12个系统时钟周期降为1个系统时钟周期,处理能力大大增强,运行速度比标准的51单片机快10倍以上。

4.低噪声和高可靠性

为提高单片机的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片机厂家在单片机内部电路中都采取了新的技术措施。

5.小体积、低价格化

与大容量化相反,以 4 位、8 位机为中心的小体积、低价格化也是一个趋势。这类单片机的特点是把原来用集成电路组成的控制电路单片化,可广泛用于家电产品。

6.集成多种外设功能

随着集成度的不断提高,越来越多的单片机把各种外围设备的功能器件集成在片内。除了一般必须具有的 CPU、ROM、RAM、定时/计数器等以外,片内集成的部件常见的还有A/D转换器、D/A转换器、I2C总线、CAN总线、SPI总线、DMA控制器、PWM控制器、声音发生器、监视定时器、锁相电路等。

1.5 51单片机开发平台与设计流程

目前,常用的51单片机软件开发平台为KEIL µVision3,仿真软件为PROTEUS ISIS 7。限于篇幅,本书不在这里介绍软件的详细菜单等内容,只介绍如何使用开发平台快速地开发一个微型项目——LED闪烁,读者可在此基础上多加探索与练习,熟练掌握单片机应用系统的设计流程。

【任务一】设计单个LED闪烁

任务目的

通过完成本任务,掌握单片机单片机应用系统的设计流程。

任务要求

使用PROTEUS ISIS 7仿真软件构建系统硬件环境,使用KEIL µVision3开发平台进行程序设计,完成单个LED间隔1秒左右闪烁的功能。

任务完成时间

2学时。

任务描述

1.使用PROTEUS ISIS 7构建系统硬件环境

首先,打开PROTEUS ISIS 7,如图1.1.2所示,单击图中方框图突出的器件模式,并单击选择器件,会弹出图1.1.3所示器件库界面。

图1.1.2 查找器件1

在Keywords中输入需要查找的器件名称,如“AT89C51”,这时,在中间的Results (8)区域显示找到的器件,最右边还有对应的器件外形和封装预览。在 Results(8)区域双击我们需要的单片机型号如“AT89C51”,这时可以看到图 1.1.4 所示的界面,与图1.1.2所示界面相比,在用户元件库(下面的空白区域)中,可以看到“AT89C51”已被载入。接下来,按照相同的方法,在Keywords中依次输入“res”“crystal”“cap”“cap-elec”“led-red”,将电阻、晶振、瓷片电容、电解电容、红色LED加入用户元件库。

按图1.1.5所示的电路进行连接。连接电路过程中,可以用鼠标右键单击元件进行方向调整、用鼠标左键双击器件进行参数属性调整等。单击左栏按钮表示的Terminal Mode,找到电源和地。

图1.1.3 查找器件2

图1.1.4 将器件加入用户元件库

图1.1.5 单个LED闪烁硬件电路图

至此,硬件环境构建完成,将它进行保存。此时,如果单击左下角中的三角形给电路上电运行,是不会看到LED闪烁的,因为还没有给单片机装入程序。接下来将进行程序设计,并将设计好的程序导入单片机。

2.使用KEIL μVision3开发平台进行程序设计

首先,单击图标运行KEIL μVision3程序,如图1.1.6所示。KEIL μVision3对于单片机软件是采用项目(project)进行管理的,一个项目(project)对应一个具体的应用,而根据项目的大小、复杂程度,可能需要设计多个程序文件。这种使用项目(project)来管理程序文件的模式在绝大多数软件开发环境中都获得了广泛使用。比如,本次任务“设计单个LED闪烁”就可以看做是一个项目(project)。本次任务比较简单,只需要一个程序文件即可,但项目(project)也是必须建立的。接下来,分4步完成程序设计任务。

第一步,新建项目。单击Project菜单,选择new\μVision project(选项会因为KEIL版本不同可能略有差异)。在弹出的“Creat New Project”界面中选择保存的路径并输入新项目的名称(自定义,需要强调的是,最好新建一个文件夹来保存新项目,如以路径C:\KEIL\WORK\LED保存)。如图1.1.7所示,项目名称在这里举例为led-flash,单击“保存”按钮。在弹出的图1.1.8所示的界面中选择目标器件,这里选择ATMEL公司的AT89C51。单击“确定”按钮,即可看到图1.1.9所示的界面,表示项目已建好。

第二步,新建程序文件。这一步是程序设计的重要步骤。单击File\New,会弹出一个文本编辑框,先不需要输入任何信息,单击File\Save,在弹出的保存界面中选择保存路径(默认在项目所在文件夹led中即可),输入程序文件的名称LED.ASM(因为本例采用的是汇编语言,所以程序文件扩展名为.ASM,如果是C语言编写的程序,扩展名为.C),如图1.1.10所示。

图1.1.6 KEIL µVision3初始界面

图1.1.7 保存项目

图1.1.8 选择目标器件

图1.1.9 新建项目

图1.1.10 保存程序文件

在文本编辑框中输入以下代码并保存。

   LED BIT P1.7

   ORG 0000H

   SJMP MAIN

   ORG 0030H

MAIN:  CPL LED

   ACALL DELAY

   SJMP MAIN

DELAY: MOV R7,#4

LOOP1: MOV R6,#250

LOOP2: MOV R5,#250

   DJNZ R5,$

   DJNZ R6,LOOP2

   DJNZ R7,LOOP1

   RET

   END

第三步,将程序文件加入项目。双击,在弹出的窗口中,将文件类型选择为第二项:“Asm Source File”,即可找到刚才建立的程序文件LED.ASM。选中该文件,单击“添加”按钮,即可看到图1.1.11所示的添加完成界面。

图1.1.11 程序文件加入项目

第四步,编译项目,生成机器码。在项目文件夹Target1上面用鼠标右键单击,选择“Options for Target1”,在弹出的图 1.1.12 所示选项卡中选择 Output,将Output选项卡下的“Create HEX File”勾上,单击“确定”按钮;在 KEIL μVision3 主界面下选择 Project\build target,可以看到图 1.1.13 所示的编译信息,显示已编译成功并生成机器码。

图1.1.12 选中生成机器码

图1.1.13 编译项目

至此,程序设计完成,生成了目标代码:led-flash.hex。

3.软硬件调试

打开PROTEUS ISIS 7绘制的单个LED闪烁硬件电路图,双击单片机,在弹出的图1.1.14所示的界面中,单击 Program File 框右边的图标,在弹出的窗口“查找范围”中找到C:\keil\work\led文件夹,即可看到led-flash.hex,选中该文件,单击“OK”按钮,退到PROTEUS ISIS 7主界面。单击左下角,给电路上电运行,即可看到LED间隔大约1秒的闪烁。

图1.1.14 给单片机装载程序(.HEX文件)

任务总结

通过本任务,了解了单片机应用系统设计的一般流程,初步掌握了开发工具(KEIL μ Vision3,PROTEUS ISIS 7)的应用方法。

拓展理论学习

单片机应用系统一般的开发流程如图1.1.15所示。

图1.1.15 单片机应用系统开发流程

【思考与练习】

1.单片机中的数据是如何进行存储的?

2.单片机应用系统设计过程中,常用的进位计数制有哪些?十进制数如何快速转换成二进制数?

3.单片机在单片机应用系统中主要作用是什么?

4.列举生活中常见的单片机应用实例。

5.单片机目前的应用情况如何?单片机发展趋势有哪些?

6.使用KEIL软件进行程序开发的步骤有哪些?使用KEIL软件最后能得到什么?

7.简述使用PROTEUS ISIS软件进行原理图绘制的方法。