马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
1、何谓单片机 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。 不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。 功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。 话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。 2、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来完成一系列的实验。 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为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输出高电平,只要写SETB P1.0,要P1.0输出低电平,只要写 CLR P1.0就可以了。 现在我们已经有办法让计算机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?总不能也对计算机也说一声了事吧。要解决这个问题,还得有几步要走。第一,计算机看不懂SETB CLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。计算机能懂什么呢?它只懂一样东西——数字。因此我们得把SETB P1.0变为(D2H,90H ),把CLR P1.0变为 (C2H,90H ),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。第二步,在得到这两个数字后,怎样让这两个数字进入单片机的内部呢?这要借助于一个硬件工具"编程器"。 我们将编程器与电脑连好,运行编程器的软件,然后在编缉区内写入(D2H,90H)见图2,写入……好,拿下片子,把片子插入做好的电路板,接通电源……什么?灯不亮?这就对了,因为我们写进去的指令就是让图2 P10输出高电平,灯当然不亮,要是亮就错了。现在我们再拨下这块芯片,重新放回到编程器上,将编缉区的内容改为(C2H,90H),也就是CLR P1.0,写片,拿下片子,把片子插进电路板,接电,好,灯亮了。因为我们写入的()就是让P10输出低电平的指令。这样我们看到,硬件电路的连线没有做任何改变,只要改变写入单片机中的内容,就可以改变电路的输出效果。 我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。 上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行: 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P10指令,所以以后再也没有机会让灭了。 为了解决这两个问题,我们可以做如下设想,第一,在执行完SETB P10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。 以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入): 第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,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中分出一块区域,称为工作寄存器区。 MCS-51单片机实用子程序库(2--1) (转) 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程 序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数 据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H, 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。 入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。 影响资源:PSW、A、R2、R3 堆栈需求: 6字节 BCDB: LCALL NEG1 ;减数[R1]十进制取补 NEG1: MOV A,R0 ;[R1]十进制取补子程序入口 LCALL NEG ;通过[R0]实现[R1]取补 影响资源:PSW、A、R2、R3 堆栈需求: 2字节 NEG: MOV A,R7 ;取(字节数减一)至R2中 (4) 标号: BRLN功能:多字节BCD码左移十进制一位(乘十) 出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。 影响资源:PSW、A、R2、R3 堆栈需求: 2字节 (5) 标号: MULD功能:双字节二进制无符号数乘法 入口条件:被乘数在R2、R3中,乘数在R6、R7中。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 (6) 标号: MUL2功能:双字节二进制无符号数平方 影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节 (7) 标号: DIVD功能:双字节二进制无符号数除法 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。 出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。 影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节 DVD2: CLR C ;部分商和余数同时左移一位 DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5) (8) 标号: D457功能:双字节二进制无符号数除以单字节二进制数 出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。 影响资源:PSW、A、R3~R7 堆栈需求: 2字节 DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3) (9) 标号: DV31功能:三字节二进制无符号数除以单字节二进制数 入口条件:被除数在R3、R4、R5中,除数在R7中。 出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5 (10) 标号: MULS功能:双字节二进制有符号数乘法(补码) 入口条件:被乘数在R2、R3中,乘数在R6、R7中。 影响资源:PSW、A、B、R2~R7 堆栈需求: 4字节 LCALL MDS ;计算结果的符号和两个操作数的绝对值 (11) 标号: DIVS功能:双字节二进制有符号数除法(补码) 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。 出口信息:OV=0时商在R2、R3中,OV=1时溢出。 影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节 DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值 POP ACC ;溢出,放去结果的符号,保留溢出标志 DVS1: POP PSW ;未溢出,取出结果的符号 MDSE: JB F0,MDS2 ;用补码表示结果 MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号 MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码 (12) 标号: SH2功能:双字节二进制无符号数开平方(快速) 出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH22: ANL A,#0C0H ;被开方数高字节小于40H否? JNZ SQRH ;不小于40H,左规格化完成,转开方过程 (13) 标号: SH4功能:四字节二进制无符号数开平方(快速) 出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH41: ANL A,#0C0H ;被开方数高字节小于40H否? MOV R6,#2 ;每左规一次,被开方数左移两位 SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间 SQR1: MOV B,#0B2H ;第二区间的斜率 SQR2: MOV B,#8DH ;第三区间的斜率 SQR3: MUL AB ;与区间基点的偏移量乘区间斜率 SQR4: SETB C ;用减奇数法校正一个字节的平方根 MOV A,R4 ;当前平方根的两倍加一存入R5R6中 JC SQR5 ;小于,校正结束,已达到一个字节的精度 SQR5: MOV A,R4 ;将一个字节精度的根存入R2 MOV R5,A ;将最终偏移量的低八位存入R5中 MOV R4,#8 ;通过(R5R6/R2)求根的低字节 DJNZ R4,SQR6 ;根的第二字节计算完,在R3中 SQR9: CLR C ;按左规次数右移平方根,得到实际根 (14) 标号: HASC功能:单字节十六进制数转换成双字节ASCII码 出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。 HASC: MOV B,A ;暂存待转换的单字节十六进制数 HAS1: ANL A,#0FH ;将累加器的低四位转换成ASCII码 (15) 标号: ASCH 功能:ASCII码转换成十六进制数 入口条件:待转换的ASCII码(30H~39H或41H~46H)在A中。 出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。 (16) 标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数 入口条件:待转换的单字节十六进制整数在累加器A中。 出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。 影响资源:PSW、A、B、R3 堆栈需求: 2字节 HBCD: MOV B,#100 ;分离出百位,存放在R3中 (17) 标号: HB2功能:双字节十六进制整数转换成双字节BCD码整数 入口条件:待转换的双字节十六进制整数在R6、R7中。 出口信息:转换后的三字节BCD码整数在R3、R4、R5中。 影响资源:PSW、A、R2~R7 堆栈需求: 2字节 HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中 MOV A,R5 ;BCD码带进位自身相加,相当于乘2 MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整 (18) 标号: HBD功能:单字节十六进制小数转换成单字节BCD码小数 入口条件:待转换的单字节十六进制小数在累加器A中。 出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。 HBD: MOV B,#100 ;原小数扩大一百倍 (19) 标号: HBD2功能:双字节十六进制小数转换成双字节BCD码小数 入口条件:待转换的双字节十六进制小数在R2、R3中。 出口信息:转换后的双字节BCD码小数仍在R2、R3中。 影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求:6字节 (20)标号:BCDH功能:单字节BCD码整数转换成单字节十六进制整数 入口条件:待转换的单字节BCD码整数在累加器A中。 出口信息:转换后的单字节十六进制整数仍在累加器A中。 影响资源:PSW、A、B、R4 堆栈需求: 2字节 BCDH: MOV B,#10H ;分离十位和个位 (21)标号: BH2功能:双字节BCD码整数转换成双字节十六进制整数 入口条件:待转换的双字节BCD码整数在R2、R3中。 出口信息:转换后的双字节十六进制整数仍在R2、R3中。 影响资源:PSW、A、B、R2、R3、R4 堆栈需求:4字节 BH2: MOV A,R3 ;将低字节转换成十六进制 (22)标号: BHD功能:单字节BCD码小数转换成单字节十六进制小数 出口信息:转换后的单字节十六进制小数仍在累加器A中。 影响资源:PSW、A、R2、R3 堆栈需求: 2字节 BHD: MOV R2,#8 ;准备计算一个字节小数 ADD A,#0B0H ;剩余部分达到0.50否? (23)标号: BHD2功能:双字节BCD码小数转换成双字节十六进制小数 入口条件:待转换的双字节BCD码小数在R4、R5中。 出口信息:转换后的双字节十六进制小数在R2、R3中。* 影响资源:PSW、A、R2~R6 堆栈需求: 2字节 BHD2: MOV R6,#10H ;准备计算两个字节小数 ADD A,#0B0H ;剩余部分达到0.50否? (24) 标号: MM功能:求单字节十六进制无符号数据块的极值 入口条件:数据块的首址在DPTR中,数据个数在R7中。 出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。 影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节 MOV R6,B ;超过当前最大值,更新最大值存放地址 JNC MM3 ;大于或等于当前最小值,保持当前最小值 MM3: DJNZ R1,MM1 ;处理完全部数据 (25) 标号: MMS功能:求单字节十六进制有符号数据块的极值 入口条件:数据块的首址在DPTR中,数据个数在R7中。 出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。 影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节 MMS2: JB ACC.7,MMS4;差为负,不更新最大值 MMS6: JNB ACC.7,MMS7;差为正,不更新最小值 MMS7: DJNZ R1,MMS1 ;处理完全部数据 (26) 标号: FDS1功能:顺序查找(ROM)单字节表格 入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。 出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。 影响资源:PSW、A、B、R2、R6 堆栈需求: 2字节 FD11: MOV A,R2 ;按顺序号读取表格内容 FD12: INC R2 ;指向表格中的下一个内容 (27) 标号: FDS2功能:顺序查找(ROM)双字节表格 入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。 出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。 影响资源:PSW、A、R2、R6、DPTR 堆栈需求: 2字节 FDS2: MOV A,R7 ;保存表格中数据的个数 (28) 标号:FDD1功能:对分查找(ROM)单字节无符号增序数据表格 入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。 出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。 影响资源:PSW、A、B、R2、R3、R4 堆栈需求:2字节 MOV R2,#0 ;区间低端指针初始化(指向第一个数据) MOV R3,A ;区间高端指针初始化(指向最后一个数据) FD65: JC FD68 ;该点的内容比待查找的内容大否? (29) 标号:FDD2功能:对分查找(ROM)双字节无符号增序数据表格 入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据个数在R7中。 出口信息:OV=0 时顺序号在累加器A中,址在DPTR中;OV=1 时未找到。 影响资源:PSW、A、B、R1~R7、DPTR 堆栈需求:2字节 FDD2: MOV R2,#0 ;区间低端指针初始化(指向第一个数据) MOV R3,A ;区间高端指针初始化,指向最后一个数据 CJNE A,B,FD84;与待查找内容的低字节比较 FD84: JC FD86 ;该点的内容比待查找的内容大否? FD89: MOV DPH,R6 ;相同,恢复首址 (30) 标号: DDM1功能:求单字节十六进制无符号数据块的平均值 入口条件:数据块的首址在DPTR中,数据个数在R7中。 影响资源:PSW、A、R2~R6 堆栈需求: 4字节 DM11: MOVX A,@DPTR ;读取一个数据 LCALL D457 ;求平均值(R4R5/R7-→R3) (31) 标号: DDM2功能:求双字节十六进制无符号数据块的平均值 入口条件:数据块的首址在DPTR中,双字节数据总个数在R7中。 影响资源:PSW、A、R2~R6 堆栈需求: 4字节 DM20: MOVX A,@DPTR ;读取一个数据的高字节 DM21: DJNZ R2,DM20 ;累加完全部数据 LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值 (32) 标号: XR1功能:求单字节数据块的(异或)校验和 入口条件:数据块的首址在DPTR中,数据的个数在R6、R7中。 影响资源:PSW、A、B、R4~R7 堆栈需求: 2字节 XR1: MOV R4,DPH ;保存数据块的首址 XR11: MOVX A,@DPTR ;读取一个数据 (33) 标号: XR2功能:求双字节数据块的(异或)校验和 入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。 影响资源:PSW、A、R2~R7 堆栈需求: 2字节 XR2: MOV R4,DPH ;保存数据块的首址 XR21: MOVX A,@DPTR ;读取一个数据的高字节 (34) 标号: SORT功能:单字节无符号数据块排序(增序) 影响资源:PSW、A、R2~R6 堆栈需求: 2字节 JNC SRT4 ;顺序正确(增序或相同),不必交换 SRT4: DJNZ R2,SRT2 ;完成本遍的比较次数 JB F0,SRT1 ;本遍若进行过交换,则需继续排序 (华强电子世界网讯) 单片机要自动完成计算,它应该具有哪些最重要的部分呢? 我们以打算盘为例计算一道算术题。例:36+163×156-166÷34。现在要进行运算,首先需要一把算盘,其次是纸和笔。我们把要计算的问题记录下来,然后第一步先算163×156,把它与36相加的结果记在纸上,然后计算166÷34,再把它从上一次结果中减去,就得到最后的结果。 现在,我们用单片机来完成上述过程,显然,它首先要有代替算盘进行运算的部件,这就是“运算器”;其次,要有能起到纸和笔作用的器件,即能记忆原始题目、原始数据和中间结果,还要记住使单片机能自动进行运算而编制的各种命令。这类器件就称为“存贮器”。此外,还需要有能代替人作用的控制器,它能根据事先给定的命令发出各种控制信号,使整个计算过程能一步步地进行。但是光有这三部分还不够,原始的数据与命令要输入,计算的结果要输出,都需要按先后顺序进行,有时还需等待。如上例中,当在计算163×156时,数字36就不能同时进入运算器。因此就需要在单片机上设置按控制器的命令进行动作的“门”,当运算器需要时,就让新数据进入。 或者,当运算器得到最后结果时,再将此结果输出,而中间结果不能随便“溜出”单片机。这种对输入、输出数据进行一定管理的“门”电路在单片机中称为“口”(Port)。 在单片机中,基本上有三类信息在流动,一类是数据,即各种原始数据(如上例中的36、163等)、中间结果(如166÷34所得的商4、余数30等)、程序(命令的集合)等。这样要由外部设备通过“口”进入单片机,再存放在存贮器中,在运算处理过程中,数据从存贮器读入运算器进行运算,运算的中间结果要存入存贮器中,或最后由运算器经“出入口”输出。用户要单片机执行的各种命令(程序)也以数据的形式由存贮器送入控制器,由控制器解读(译码)后变为各种控制信号,以便执行如加、减、乘、除等功能的各种命令。所以,这一类信息就称为控制命令,即由控制器去控制运算器一步步地进行运算和处理,又控制存贮器的读(取出数据)和写(存入数据)等。第三类信息是地址信息,其作用是告诉运算器和控制器在何处去取命令取数据,将结果存放到什么地方,通过哪个口输入和输出信息等。 存贮器又分为只读存贮器和读写存贮器两种,前者存放调试好的固定程序和常数,后者存放一些随时有可能变动的数据。 顾名思义,只读存贮器一旦将数据存入,就只能读出,不能更改(EPROM、E2PROM等类型的ROM可通过一定的方法来更改、写入数据——编者注)。而读写存贮器可随时存入或读出数据。 实际上,人们往往把运算器和控制器合并称为中央处理单元——CPU。单片机除了进行运算外,还要完成控制功能。所以离不开计数和定时。因此,在单片机中就设置有定时器兼计数器,其基本结构与本连载之(二)中的举例类似。 到这里为止,我们已经知道了单片机的基本组成,即单片机是由中央处理器(即CPU中的运算器和控制器)、只读存贮器(通常表示为ROM)、读写存贮器(又称随机存贮器通常表示为RAM)、输入/输出口(又分为并行口和串行口,表示为I/O口)等等组成。实际上单片机里面还有一个时钟电路,使单片机在进行运算和控制时,都能有节奏地进行。另外,还有所谓的“中断系统”,这个系统有“传达室”的作用,当单片机控制对象的参数到达某个需要加以干预的状态时,就可经此“传达室”通报给CPU,使CPU根据外部事态的轻重缓急来采取适当的应付措施。 现在,我们已经知道了单片机的组成,余下的问题是如何将它们的各部分连接成相互关联的整体呢? 实际上,单片机内部有一条将它们连接起来的“纽带”,即所谓的“内部总线”。此总线有如大城市的“干道”,而CPU、ROM、RAM、I/O口、中断系统等就分布在此“总线”的两旁,并和它连通。从而,一切指令、数据都可经内部总线传送,有如大城市内各种物品的传送都经过干道进行。 |