单片机概述.docx
- 文档编号:10975219
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:26
- 大小:267.29KB
单片机概述.docx
《单片机概述.docx》由会员分享,可在线阅读,更多相关《单片机概述.docx(26页珍藏版)》请在冰豆网上搜索。
单片机概述
单片机概述
单片机培训第一讲:
单片机概述,SoC和51
本讲座包括如下三部分内容:
单片机概述
SOC和51
初学单片机几个不易掌握的概念
单片机概述
这一部分包括以下内容:
单片机概念
MCS51单片机和8051、8031、89C51等的关系
CISC与RISC
一.何谓单片机一台能够工作的计算机要有这样几个部份构成:
CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:
串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一
既然如此,单片机的功能肯定不强,干吗要学它呢?
话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?
应用的关键是看是否够用,是否有很好的性能价格比。
所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
二、MCS51单片机和8051、8031、89C51等的关系
我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系?
MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。
INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的。
以后我们将用89C51来完成一系列的实验。
三.CISC与RISC
CISC,ComplexInstructionSetComputer,复杂指令系统计算机。
RISC,ReducedInstructionSetComputer,精简指令系统计算机。
虽然这两个名词是针对计算机的,但下文我们仍然只对指令集进行研究。
(1)CISC的产生、发展和现状
一开始,计算机的指令系统只有很少一些基本指令,而其他的复杂指令全靠软件编译时通过简单指令的组合来实现。
举个最简单的例子,一个a乘以b的操作就可以转换为a个b相加来做,这样就用不着乘法指令了。
当然,最早的指令系统就已经有乘法指令了,这是为什么呢?
因为用硬件实现乘法比加法组合来得快得多。
由于那时的计算机部件相当昂贵,而且速度很慢,为了提高速度,越来越多的复杂指令被加入了指令系统中。
但是,很快又有一个问题:
一个指令系统的指令数是受指令操作码的位数所限制的,如果操作码为8位,那么指令数最多为256条(2的8次方)。
那么怎么办呢?
指令的宽度是很难增加的,聪明的设计师们又想出了一种方案:
操作码扩展。
前面说过,操作码的后面跟的是地址码,而有些指令是用不着地址码或只用少量的地址码的。
那么,就可以把操作码扩展到这些位置。
举个简单的例子,如果一个指令系统的操作码为2位,那么可以有00、01、10、11四条不同的指令。
现在把11作为保留,把操作码扩展到4位,那么就可以有00、01、10、1100、1101、1110、1111七条指令。
其中1100、1101、1110、1111这四条指令的地址码必须少两位。
然后,为了达到操作码扩展的先决条件:
减少地址码,设计师们又动足了脑筋,发明了各种各样的寻址方式,如基址寻址、相对寻址等,用以最大限度的压缩地址码长度,为操作码留出空间。
就这样,慢慢地,CISC指令系统就形成了,大量的复杂指令、可变的指令长度、多种的寻址方式是CISC的特点,也是CISC的缺点:
因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。
除了个人PC市场还在用x86指令集外,服务器以及更大的系统都早已不用CISC了。
x86仍然存在的唯一理由就是为了兼容大量的x86平台上的软件。
(2)RISC的产生、发展和现状
1975年,IBM的设计师JohnCocke研究了当时的IBM370CISC系统,发现其中占总指令数仅20%的简单指令却在程序调用中占了80%,而占指令数80%的复杂指令却只有20%的机会用到。
由此,他提出了RISC的概念。
事实证明,RISC是成功的。
80年代末,各公司的RISCCPU如雨后春笋般大量出现,占据了大量的市场。
到了90年代,x86的CPU如pentium和k5也开始使用先进的RISC核心。
RISC的最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。
由于下文所讲的CPU核心大部分是讲RISC核心,所以这里就不多介绍了,对于RISC核心的设计下面会详细谈到。
RISC目前正如日中天,Intel的Itanium也将最终抛弃x86而转向RISC结构。
SoC和51系列
一.SOC
由于集成规模的扩大,原先由许多IC组成的电子系统有可能集成在一个单片上,构成所谓系统芯片(SystemOnChip,简称SOC)。
系统芯片与集成电路(IC)相比,不再是一种功能单一的单元电路,而是将信号采集、处理和输出等完整的系统集成在一起,成为一个有某种应用目的的电子系统单片。
电子系统传统的设计方法是在PCB(PrintedCircuitBoard)级完成的。
系统设计人员利用各IC制造商生产的通用集成电路,在PCB上构成系统,系统的调试也在PCB上进行。
这种开发设计方法要求设计者具有丰富的硬件知识和调试能力,产品开发周期长,投资较大,涉及修改困难。
此外,由于PCB连线的延时、空间尺度、重量和可靠性等制约,整机性能受到很大限制。
如果能将整个系统最终集成在一个单片上,无疑对于提高产品性能、缩小产品体积具有极大帮助。
因而,SOC是电子系统开发设计的合理选择。
微电子技术的近期发展成果,为SOC的实现提供了多种途径。
对于经过验证而又具有批量的系统芯片,可以做成专用集成电路(ApplicationSpecificIntegratedCircuit,简称ASIC)大量生产。
而对于一些仅小批量应用或出于开发阶段的SOC,若马上投入流片生产,需要投入较多的资金,承担较大的试制风险。
近十几年发展起来的高密度可编程逻辑器件(DensityProgrammableLogicDevice,简称HDPLD),则提供了另一种实现途径。
可编程逻辑器件(PLD)是一种由IC制造商大批量定型生产的半定制产品,器件内部的逻辑功能由户设计和制造,是一种价格低廉、而硬件功能可多次编程重构的器件。
可编程逻辑器件的出现,使得系统设计人员有可能在不改变系统硬件结构的前提下,修改完善甚至重新设计系统的硬件功能,使电子系统的硬件具有了“柔性”,极大地改变了硬件的刚性结构状态,甚至可以使电子系统的硬件功能状态调整,以适应外界使用环境的变化。
可编程逻辑器件产生于20世纪70年代,其出现的最初目的是为了用较少的PLD品种替代种类繁多的各式中小规模逻辑电路。
在30多年的发展过程中,PLD的结构、工艺、功耗和工作速度等性能都得到了重大改进。
尤其是在20世纪80年代,出现了HDPLD,可编程逻辑器件的单片集成度由原来的数百到数千门,发展到数万、数十万甚至数百万门,芯片的I/O引脚也有20~24脚发展到400~1000个引脚,为用户提供了大量的可编程逻辑资源和触发器,可以实现各种逻辑功能(包括组合逻辑和时序逻辑),有的PLD制造商还推出了嵌入系统级功能模块的核,使之具有强大功能。
因此,完全可能将一个电子系统集成在一个HDPLD单片上,为SOC的实现提供了一种简单易行而又成本低廉的手段,极大地促进了SOC的发展。
SOC的设计理念与传统IC不同。
SOC把系统的处理机制、模型算法、芯片结构、各层次电路直到器件的设计紧密结合,在一个或若干个单片上完成整个系统的功能。
与普通IC的设计不同,SOC的设计以IP核为基础,以硬件描述语言为系统功能的主要描述手段,借助于以计算机为平台的EDA工具进行。
SOC的出现是电子设计领域的一场革命。
如果说在上个世纪,电子系统的设计主要是在PCB层次上将各种元器件合理连接,那么进入本世纪后,电子系统的设计将主要使以HDPLD或ASIC为物理载体的系统芯片的设计,它对电子信息产业的影响将不亚于20世纪60年代集成电路的出现所产生的影响。
二.51系列
一)、单片机的外部结构
拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。
1、电源:
这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。
2、振蒎电路:
单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶振,电容,连上就可以了,按图1接上即可。
3、复位引脚:
按图1中画法连好,至于复位是何含义及为何需要复位,在单片机功能中介绍。
4、EA引脚:
EA引脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
图
二)、任务分析
我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?
单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。
(见图1,其中R1是限流电阻)
按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。
因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。
即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?
叫它什么名字呢?
设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。
名字有了,我们又怎样让它变'高'或变'低'呢?
叫人做事,说一声就可以,这叫发布命令,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。
让一个引脚输出高电平的指令是SETB,让一个引脚输出低电平的指令是CLR。
因此,我们要P1.0输出高电平,只要写SETBP1.0,要P1.0输出低电平,只要写CLRP1.0就可以了。
现在我们已经有办法让计算机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?
总不能也对计算机也说一声了事吧。
要解决这个问题,还得有几步要走。
第一,计算机看不懂SETBCLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。
计算机能懂什么呢?
它只懂一样东西——数字。
因此我们得把SETBP1.0变为(D2H,90H),把CLRP1.0变为(C2H,90H),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。
第二步,在得到这两个数字后,怎样让这两个数字进入单片机的内部呢?
这要借助于一个硬件工具"编程器"。
我们将编程器与电脑连好,运行编程器的软件,然后在编缉区内写入(D2H,90H)见图2,写入……好,拿下片子,把片子插入做好的电路板,接通电源……什么?
灯不亮?
这就对了,因为我们写进去的指令就是让
图2
P10输出高电平,灯当然不亮,要是亮就错了。
现在我们再拨下这块芯片,重新放回到编程器上,将编缉区的内容改为(C2H,90H),也就是CLRP1.0,写片,拿下片子,把片子插进电路板,接电,好,灯亮了。
因为我们写入的()就是让P10输出低电平的指令。
这样我们看到,硬件电路的连线没有做任何改变,只要改变写入单片机中的内容,就可以改变电路的输出效果。
三)、单片机内部结构分析
我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?
这个地方就是单片机内部的只读存储器即ROM(READONLYMEMORY)。
为什么称它为只读存储器呢?
刚才我们不是明明把两个数字写进去了吗?
原来在89C51中的ROM是一种电可擦除的ROM,称为FLASHROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。
四)、程序的完善
上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。
怎样才能让灯不断地闪烁呢?
实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10不断地输出高和低电平。
怎样实现这个要求呢?
请考虑用下面的指令是否可行:
SETBP10
CLRP10
……
这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETBP10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLRP10指令,灯又亮了,所以根本分辨不出灯曾灭过。
第二,在执行完CLRP10后,不会再去执行SETBP10指令,所以以后再也没有机会让灭了。
为了解决这两个问题,我们可以做如下设想,第一,在执行完SETBP10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就可以分辨出灯曾灭过了。
第二在执行完第二条指令后,让计算机再去执行第一条指令,不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。
以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):
;主程序:
LOOP:
SETBP10 ;(1)
LCALLDELAY ;(2)
CLRP10 ;(3)
LCALLDELAY ;(4)
AJMPLOOP ;(5)
;以下子程序
DELAY:
MOVR7,#250 ;(6)
D1:
MOVR6,#250 ;(7)
D2:
DJNZR6,D2 ;(8)
DJNZR7,D1 ;(9)
RET ;(10)
END ;(11)
按上面的设想分析一下前面的五条指令。
第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。
第二和第四条实现的原理稍后谈,先看第五条,LJMP是一条指令,意思是转移,往什么地方转移呢?
后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP,所以很直观地,我们可以认识到,它要转到第一条指令处。
这个第一条指令前面的LOOP被称之为标号,它的用途就是给这一行起一个名字,便于使用。
是否一定要给它起名叫LOOP呢?
当然不是,起什么名字,完全由编程序的人决定,可以称它为A,X等等,当然,这时,第五条指令LJMP后面的名字也得跟着改了。
第二条和第四条指令的用途是延时,它是怎样实现的呢?
指令的形式是LCALL,这条指令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,显然,这也是一个标号。
这条指令的作用是这样的:
当执行LCALL指令时,程序就转到LCALL后面的标号所标定的程序处执行,如果在执行指令的过程中遇到RET指令,则程序就返回到LCALL指令的下面的一条指令继续执行,从第六行开始的指令中,可以看到确实有RET指令。
在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8,9条指令后将遇到第10条令:
RET,执行该条指令后,程序将回来执行第三条指令,即将P10清零,使灯亮,然后又是第四条指令,执行第四条指令就是转去执行第6,7,8,9,10条指令,然后回来执行第5条指令,第5条指令就是让程序回到第1条开始执行,如此周而复始,灯就在不断地亮、灭了。
在标号DELAY标志的这一行到RET这一行中的所有程序,这是一段延时程序,大概延时零点几秒,至于具体的时间,以后我们再学习如何计算。
程序的最后一行是END,这不是一条指令,它只是告诉我们程序到此结束,它被称为"伪指令"。
五).延时程序分析
为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号,就从R1开始,R1被称之为工作寄存器。
什么是工作寄存器呢?
让我们从现实生活中来找找答案。
如果出一道数学题:
123+567,让你回答结果是多少,你会马上答出是690,再看下面一道题:
123+567+562,要让你要上回答,就不这么容易了吧?
我们会怎样做呢?
如果有张纸,就容易了,我们先算出123+567=690,把690写在纸上,然后再算690+562得到结果是1552。
这其中1552是我们想要的结果,而690并非我们所要的结果,但是为了得到最终结果,我们又不得不先算出690,并记下来,这其实是一个中间结果,计算机中做运算和这个类似,为了要得到最终结果,往往要做很多步的中间结果,这些中间结果要有个地方放才行,把它们放哪呢?
放在前面提到过的ROM中可以吗?
显然不行,因为计算机要将结果写进去,而ROM是不可以写的,所以在单片机中另有一个区域称为RAM区(RAM是随机存取存储器的英文缩写),它可以将数据写进去。
特别地,在MCS-51单片机中,将RAM中分出一块区域,称为工作寄存器区。
我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。
DELAY:
MOVR7,#250 ;(6)
D1:
MOVR6,#250 ;(7)
D2:
DJNZR6,D2 ;(8)
DJNZR7,D1 ;(9)
RET ;(10)
1.MOV:
这是一条指令,意思是传递数据。
说到传递,我们都很清楚,传东西要从一个人的手上传到另一个人的手上,也就是说要有一个接受者,一个传递者和一样东西。
从指令MOVR7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:
并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。
它的意义也很明显:
将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。
在250前面有个#号,这又是什么意思呢?
这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。
那么MOVR6,#250是什么意思,应当不用分析了吧。
2.DJNZ:
这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。
D2在本行的前面,我们已学过,这称之为标号。
标号的用途是什么呢?
就是给本行起一个名字。
DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?
可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。
本条指令的最终执行结果就是,在原地转圈250次。
3.执行完了DJNZR6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是DJNZR7,D1,请大家自行分析一下这句话执行的结果。
(转去执行MOVR6,#250,同时R7中的值减1),最终DJNZR6,D2这句话将被执行250*250=62500次,执行这么多次同一条指令干吗?
就是为了延时。
4.一个问题:
如果在R6中放入0,会有什么样的结果。
六)、时序分析:
前面我们介绍了延时程序,但这还不完善,因为,我们只知道DJNZR6,D2这句话会被执行62500次,但是执行这么多次需要多长时间呢?
是否满足我们的要求呢?
我们还不知道,所以下面要来解决这个问题。
先提一个问题:
我们学校里什么是最重要的。
(铃声)校长可以出差,老师可以休息,但学校一日无铃声必定大乱。
整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。
这个铃是按一定的时间安排来响的,我们可以称之为“时序时间的顺序”。
一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格的时序。
事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。
计算机要完成的事更复杂,所以它的时序也更复杂。
我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:
计算机访问一次存储器的时间,称之为一个机器周期。
这是一个时间基准,好象我们人用“秒”作为我们的时间基准一样,为什么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯。
一个机器周期包括12个时钟周期。
下面让我们算一下一个机器周期是多长时间吧。
设一个单片机工作于12M晶振,它的时钟周期是1/12(微秒)。
它的一个机器周期是12*(1/12)也就是1微秒。
(请计算一个工作于6M晶振的单片机,它的机器周期是多少)。
MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。
这也不难再解,不是吗?
我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。
为了恒量指令执行时间的长短,又引入一个新的概念:
指令周期。
所谓指令周期就是指执行一条指令的时间。
INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些指令是需要记住的,如DJNZ指令是双周期指令。
下面让我们来计算刚才的延时。
首先必须要知道晶振的频率,我们设所用晶振为12M,则一个机器周期就是1微秒。
而DJNZ指令是双周期指令,所以执行一次要2个微秒。
一共执行62500次,正好125000微秒,也就是125毫秒。
练习:
设计一个延时100毫秒的延时程序。
要点分析:
1、一个单元中的数是否可以超过255。
2、如何分配两个数。
七)、复位电路
任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?
它就象是我们上课之前打的预备铃。
预备铃一响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是没有老师干预的,对单片机来说,是程序还没有开始执行,是在做准备工作。
显然,准备工作不需要太长的时间,复位只需要5ms的时间就可以了。
如何进行复位呢?
只要在单片机的RST引脚上加上高电平,就可以了,按上面所说,时间不少于5ms。
为了达到这个要求,可以用很多种方法,这里提供一种供参考,见图1。
实际上,我们在上一次实验的图中已见到过了。
这种复位电路的工作原理是:
通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作。
八).第三个实验
上两次我们做过两个实验,都是让P1.0这个引脚使灯亮,我们可以设想:
既然P1.0可以让灯亮,那么其它的引脚可不可以呢?
看一下图1,它是8031单片机引脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都可以让灯亮呢?
除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个引脚,前面我们以学过7个引脚,加上这32个这39个了。
它们都以P字开头,只是后面的数字不一样,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 概述