在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 4678|回复: 5

学习单片机

[复制链接]
发表于 2009-1-17 23:34:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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来完成一系列的实验。
单片机教学(2)
单片机的内部、外部结构(一)
一、单片机的外部结构
拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。 1、 电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。 2、 振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。 3、 复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。 4、 EA引脚:EA引脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工作了。
图1
二、 任务分析
我们的第一个任务是要用单片机点亮一只发光二极管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。
单片机教学(3)
单片机的内外部结构分析(二)
一、 程序的完善
  上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:
SETB P10
CLR P10
……
这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P10指令,所以以后再也没有机会让灭了。
  为了解决这两个问题,我们可以做如下设想,第一,在执行完SETB P10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。
以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):
;主程序:
LOOP: SETB P10     ;(1)
    LCALL DELAY   ;(2)
    CLR P10     ;(3)
    LCALL DELAY   ;(4)
    AJMP LOOP    ;(5)
;以下子程序
DELAY: MOV R7,#250  ;(6)
D1: MOV R6,#250    ;(7)
D2: DJNZ R6,D2    ;(8)
  DJNZ R7,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中分出一块区域,称为工作寄存器区。
MCS-51单片机实用子程序库(2--1) (转)
子程序库的使用方法如下:
1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺
点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程
序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是
需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明
定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:
1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数
据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无
关的或非消耗性的信息,程序就具有较好的透明性。
(1) 标号: BCDA功能:多字节BCD码加法
入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求: 2字节
BCDA: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0 调整数据指针
DEC R1
MOV A,@R0
ADDC A,@R1 按字节相加
DA A 十进制调整
MOV @R0,A 和存回[R0]
DJNZ R2,BCD1 ;处理完所有字节
RET
(2) 标号: BCDB功能:多字节BCD码减法
入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影响资源:PSW、A、R2、R3 堆栈需求: 6字节
BCDB: LCALL NEG1 ;减数[R1]十进制取补
LCALL BCDA ;按多字节BCD码加法处理
CPL C ;将补码加法的进位标志转换成借位标志
MOV F0,C ;保护借位标志
LCALL NEG1 ;恢复减数[R1]的原始值
MOV C,F0 ;恢复借位标志
RET
NEG1: MOV A,R0 ;[R1]十进制取补子程序入口
XCH A,R1 ;交换指针
XCH A,R0
LCALL NEG ;通过[R0]实现[R1]取补
MOV A,R0
XCH A,R1 ;换回指针
XCH A,R0
RET
(3) 标号: NEG功能:多字节BCD码取补
入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
NEG: MOV A,R7 ;取(字节数减一)至R2中
DEC A
MOV R2,A
MOV A,R0 ;保护指针
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0 按字节十进制取补
MOV @R0,A 存回[R0]
INC R0 调整数据指针
DJNZ R2,NEG0 处理完(R2)字节
MOV A,#9AH 最低字节单独取补
SUBB A,@R0
MOV @R0,A
MOV A,R3 恢复指针
MOV R0,A
RET
(4) 标号: BRLN功能多字节BCD码左移十进制一位乘十
入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
BRLN: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV R3,#0 ;工作单元初始化
BRL1: DEC R0 ;调整数据指针
MOV A,@R0 ;取一字节
SWAP A ;交换十进制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字节移出的十进制高位
XCHD A,@R0 ;换出本字节的十进制高位
MOV R3,A ;保存本字节的十进制高位
DJNZ R2,BRL1 ;处理完所有字节
RET
(5) 标号: MULD功能:双字节二进制无符号数乘法
入口条件:被乘数在R2、R3中,乘数在R6、R7中。
出口信息:乘积在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 计算R2R7
MOV B,R7
MUL AB
ADD A,R4 累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 计算R2R6
MOV B,R6
MUL AB
ADD A,R3 累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
(6) 标号: MUL2功能:双字节二进制无符号数平方
入口条件:待平方数在R2、R3中。
出口信息:结果在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节
MUL2: MOV A,R3 ;计算R3平方
MOV B,A
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R2 ;计算R2平方
MOV B,A
MUL AB
XCH A,R3 ;暂存部分积,并换出R2和R3
XCH A,B
XCH A,R2
MUL AB 计算2×R2×R3
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2 累加溢出量
MU20: XCH A,B 累加部分积
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
(7) 标号: DIVD功能双字节二进制无符号数除法
入口条件被除数在R2R3R4R5除数在R6R7中。
出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV 溢出
RET
DVD1: MOV B,#10H 计算双字节商
DVD2: CLR C 部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C 保存溢出位
CLR C
SUBB A,R7 计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 结果判断
JC DVD3
MOV R2,A 够减存放新的余数
MOV A,R1
MOV R3,A
INC R5 商的低位置一
DVD3: DJNZ B,DVD2 计算完十六位商(R4R5)
MOV A,R4 将商移到R2R3
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
(8) 标号: D457功能:双字节二进制无符号数除以单字节二进制数
入口条件:被除数在R4、R5中,除数在R7中。
出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
影响资源:PSW、A、R3~R7 堆栈需求: 2字节
D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV 商溢出
RET
DV50: MOV R6,#8 求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
(9) 标号: DV31功能:三字节二进制无符号数除以单字节二进制数
入口条件:被除数在R3、R4、R5中,除数在R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV 商溢出
RET
DV30: MOV R2,#10H R3R4R5/R7-→R4R5
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3 四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET 商在R4R5
(10) 标号: MULS功能:双字节二进制有符号数乘法(补码)
入口条件:被乘数在R2、R3中,乘数在R6、R7中。
出口信息:乘积在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R7 堆栈需求: 4字节
MULS: MOV R4,#0 清零R4R5
MOV R5,#0
LCALL MDS ;计算结果的符号和两个操作数的绝对值
LCALL MULD ;计算两个绝对值的乘积
SJMP MDSE ;用补码表示结果
(11) 标号: DIVS功能:双字节二进制有符号数除法(补码)
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0时商在R2、R3中,OV=1时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节
DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值
PUSH PSW ;保存结果的符号
LCALL DIVD ;计算两个绝对值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去结果的符号,保留溢出标志
RET
DVS1: POP PSW ;未溢出,取出结果的符号
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果
CLR OV ;结果为正,原码即补码,计算成功
RET
MDS: CLR F0 ;结果符号初始化
MOV A,R6 ;判断第二操作数的符号
JNB ACC.7,MDS1;为正,不必处理
CPL F0 ;为负,结果符号取反
XCH A,R7 ;第二操作数取补,得到其绝对值
CPL A
ADD A,#1
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号
JNB ACC.7,MDS3;为正,不必处理
CPL F0 ;为负,结果符号取反
MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV 运算成功
RET
(12) 标号: SH2功能双字节二进制无符号数开平方快速
入口条件:被开方数在R2、R3中。
出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET 被开方数为零不必运算
SH20: MOV R7,#0 左规次数初始化
MOV A,R2
SH22: ANL A,#0C0H 被开方数高字节小于40H
JNZ SQRH 不小于40H,左规格化完成转开方过程
CLR C ;每左规一次,被开方数左移两位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;左规次数加一
SJMP SH22 ;继续左规
(13) 标号: SH4功能:四字节二进制无符号数开平方(快速)
入口条件:被开方数在R2、R3、R4、R5中。
出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET 被开方数为零不必运算
SH40: MOV R7,#0 左规次数初始化
MOV A,R2
SH41: ANL A,#0C0H 被开方数高字节小于40H
JNZ SQRH 不小于40H,左规格化完成
MOV R6,#2 ;每左规一次,被开方数左移两位
SH42: CLR C ;被开方数左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 被开方数左移完两位
INC R7 左规次数加一
SJMP SH41 ;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H 第一区间的斜率
MOV R4,#80H 第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H 第二区间的斜率
MOV R4,#0A0H第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH 第三区间的斜率
MOV R4,#0D0H第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 求偏移量存放在R2R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A 保存新的偏移量
MOV R3,B
SJMP SQR4 继续校正
SQR5: MOV A,R4 将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C 保存最终偏移量的最高位
MOV A,R3
MOV R5,A 将最终偏移量的低八位存入R5
MOV R4,#8 通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 根的第二字节计算完R3
MOV A,R7 取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
(14) 标号: HASC功能:单字节十六进制数转换成双字节ASCII码
入口条件:待转换的单字节十六进制数在累加器A中。
出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。
影响资源:PSW、A、B 堆栈需求: 4字节
HASC: MOV B,A ;暂存待转换的单字节十六进制数
LCALL HAS1 ;转换低四位
XCH A,B ;存放低四位的ASCII码
SWAP A ;准备转换高四位
HAS1: ANL A,#0FH ;将累加器的低四位转换成ASCII码
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 标号: ASCH 功能:ASCII码转换成十六进制数
入口条件待转换的ASCII(30H39H41H46HA中。
出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。
影响资源:PSW、A 堆栈需求: 2字节
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
MCS-51单片机实用子程序库(二) (转)
(16) 标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数
入口条件:待转换的单字节十六进制整数在累加器A中。
出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。
影响资源:PSW、A、B、R3 堆栈需求: 2字节
HBCD: MOV B,#100 ;分离出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余数继续分离十位和个位
XCH A,B
DIV AB
SWAP A
ORL A,B ;将十位和个位拼装成BCD码
RET
(17) 标号: HB2功能:双字节十六进制整数转换成双字节BCD码整数
入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加相当于乘
ADDC A,R5
DA A 十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
(18) 标号: HBD功能:单字节十六进制小数转换成单字节BCD码小数
入口条件:待转换的单字节十六进制小数在累加器A中。
出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。
影响资源:PSW、A、B 堆栈需求: 2字节
HBD: MOV B,#100 ;原小数扩大一百倍
MUL AB
RLC A ;余数部分四舍五入
CLR A
ADDC A,B
MOV B,#10 ;分离出十分位和百分位
DIV AB
SWAP A
ADD A,B ;拼装成单字节BCD码小数
DA A ;调整后若有进位,原小数接近整数1
RET
(19) 标号: HBD2功能:双字节十六进制小数转换成双字节BCD码小数
入口条件:待转换的双字节十六进制小数在R2、R3中。
出口信息:转换后的双字节BCD码小数仍在R2、R3中。
影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求:6字节
HBD2: MOV R4,#4 ;四位十进制码
HBD3: MOV A,R3 ;原小数扩大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC 保存溢出的一位十进制码
DJNZ R4,HBD3 计算完四位十进制码
POP ACC 取出万分位
MOV R3,A
POP ACC 取出千分位
SWAP A
ORL A,R3 拼装成低字节BCD码小数
MOV R3,A
POP ACC 取出百分位
MOV R2,A
POP ACC 取出十分位
SWAP A
ORL A,R2 拼装成高字节BCD码小数
MOV R2,A
RET
(20)标号:BCDH功能单字节BCD码整数转换成单字节十六进制整数
入口条件:待转换的单字节BCD码整数在累加器A中。
出口信息:转换后的单字节十六进制整数仍在累加器A中。
影响资源:PSW、A、B、R4 堆栈需求: 2字节
BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
(21)标号: BH2功能:双字节BCD码整数转换成双字节十六进制整数
入口条件:待转换的双字节BCD码整数在R2、R3中。
出口信息:转换后的双字节十六进制整数仍在R2、R3中。
影响资源:PSW、A、B、R2、R3、R4 堆栈需求:4字节
BH2: MOV A,R3 ;将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 ;将高字节转换成十六进制
LCALL BCDH
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R3 ;和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)标号: BHD功能:单字节BCD码小数转换成单字节十六进制小数
入口条件:待转换的单字节BCD码数在累加器A中。
出口信息:转换后的单字节十六进制小数仍在累加器A中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
BHD: MOV R2,#8 ;准备计算一个字节小数
BHD0: ADD A,ACC ;按十进制倍增
DA A
XCH A,R3
RLC A ;将进位标志移入结果中
XCH A,R3
DJNZ R2,BHD0 ;共计算8bit小数
ADD A,#0B0H ;剩余部分达到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1: MOV A,R3 ;取结果
RET
(23)标号: BHD2功能:双字节BCD码小数转换成双字节十六进制小数
入口条件:待转换的双字节BCD码小数在R4、R5中。
出口信息:转换后的双字节十六进制小数在R2、R3中。*
影响资源:PSW、A、R2~R6 堆栈需求: 2字节
BHD2: MOV R6,#10H ;准备计算两个字节小数
BHD3: MOV A,R5 ;按十进制倍增
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3 ;将进位标志移入结果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共计算16bit小数
MOV A,R4
ADD A,#0B0H ;剩余部分达到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4: RET
(24) 标号: MM功能:求单字节十六进制无符号数据块的极值
入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节
MM: MOV B,R7 ;保存数据个数
MOVX A,@DPTR ;读取第一个数据
MOV R6,A ;作为最大值的初始值
MOV R7,A ;也作为最小值的初始值
MOV A,DPL ;取第一个数据的地址
MOV R3,A ;作为最大值存放地址的初始值
MOV R5,A ;也作为最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B 取数据个数
DEC A 减一得到需要比较的次数
JZ MME ;只有一个数据,不需要比较
MOV R1,A ;保存比较次数
PUSH DPL ;保护数据块的首址
PUSH DPH
MM1: INC DPTR ;指向一个新的数据
MOVX A,@DPTR ;读取这个数据
MOV B,A ;保存
SETB C ;与最大值比较
SUBB A,R6
JC MM2 ;不超过当前最大值,保持当前最大值
MOV R6,B ;超过当前最大值,更新最大值存放地址
MOV R2,DPH ;同时更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B 与最小值比较
CLR C
SUBB A,R7
JNC MM3 大于或等于当前最小值保持当前最小值
MOV R7,B 更新最小值
MOV R4,DPH 更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 处理完全部数据
POP DPH 恢复数据首址
POP DPL
MME: RET
(25) 标号: MMS功能:求单字节十六进制有符号数据块的极值
入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节
MMS: MOV B,R7 ;保存数据个数
MOVX A,@DPTR ;读取第一个数据
MOV R6,A ;作为最大值的初始值
MOV R7,A ;也作为最小值的初始值
MOV A,DPL ;取第一个数据的地址
MOV R3,A ;作为最大值存放地址的初始值
MOV R5,A ;也作为最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取数据个数
DEC A ;减一,得到需要比较的次数
JZ MMSE ;只有一个数据,不需要比较
MOV R1,A ;保存比较次数
PUSH DPL ;保护数据块的首址
PUSH DPH
MMS1: INC DPTR ;调整数据指针
MOVX A,@DPTR ;读取一个数据
MOV B,A ;保存
SETB C ;与最大值比较
SUBB A,R6
JZ MMS4 ;相同,不更新最大值
JNB OV,MMS2 ;差未溢出,符号位有效
CPL ACC.7 ;差溢出,符号位取反
MMS2: JB ACC.7,MMS4;差为负,不更新最大值
MOV R6,B ;更新最大值
MOV R2,DPH ;更新最大值存放地址
MOV R3,DPL
SJMP MMS7
MMS4: MOV A,B 与最小值比较
CLR C
SUBB A,R7
JNB OV,MMS6 差未溢出符号位有效
CPL ACC.7 差溢出符号位取反
MMS6: JNB ACC.7,MMS7差为正不更新最小值
MOV R7,B 更新最小值
MOV R4,DPH 更新最小值存放地址
MOV R5,DPL
MMS7: DJNZ R1,MMS1 处理完全部数据
POP DPH 恢复数据首址
POP DPL
MMSE: RET
(26) 标号: FDS1功能:顺序查找(ROM)单字节表格
入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
影响资源:PSW、A、B、R2、R6 堆栈需求: 2字节
FDS1: MOV B,A ;保存待查找的内容
MOV R2,#0 ;顺序号初始化(指向表首)
MOV A,R7 ;保存表格的长度
MOV R6,A
FD11: MOV A,R2 ;按顺序号读取表格内容
MOVC A,@A+DPTR
CJNE A,B,FD12;与待查找的内容比较
CLR OV ;相同,查找成功
MOV A,R2 ;取对应的顺序号
RET
FD12: INC R2 ;指向表格中的下一个内容
DJNZ R6,FD11 ;查完全部表格内容
SETB OV ;未查找到,失败
RET
(27) 标号: FDS2功能:顺序查找(ROM)双字节表格
入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。
出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
影响资源:PSW、A、R2、R6、DPTR 堆栈需求: 2字节
FDS2: MOV A,R7 ;保存表格中数据的个数
MOV R6,A
MOV R2,#0 ;顺序号初始化(指向表首)
FD21: CLR A ;读取表格内容的高字节
MOVC A,@A+DPTR
XRL A,R4 ;与待查找内容的高字节比较
JNZ FD22
MOV A,#1 ;读取表格内容的低字节
MOVC A,@A+DPTR
XRL A,R5 ;与待查找内容的低字节比较
JNZ FD22
CLR OV ;相同,查找成功
MOV A,R2 ;取对应的顺序号
RET
FD22: INC DPTR ;指向下一个数据
INC DPTR
INC R2 ;顺序号加一
DJNZ R6,FD21 ;查完全部数据
SETB OV ;未查找到,失败
RET
(28) 标号:FDD1功能:对分查找(ROM)单字节无符号增序数据表格
入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
影响资源:PSW、A、B、R2、R3、R4 堆栈需求:2字节
FDD1: MOV B,A ;保存待查找的内容
MOV R2,#0 ;区间低端指针初始化(指向第一个数据)
MOV A,R7
DEC A
MOV R3,A ;区间高端指针初始化(指向最后一个数据)
FD61: CLR C ;判断区间大小
MOV A,R3
SUBB A,R2
JC FD69 ;区间消失,查找失败
RRC A ;取区间大小的一半
ADD A,R2 ;加上区间的低端
MOV R4,A ;得到区间的中心
MOVC A,@A+DPTR读取该点的内容
CJNE A,B,FD65与待查找的内容比较
CLR OV 相同查找成功
MOV A,R4 取顺序号
RET
FD65: JC FD68 该点的内容比待查找的内容大否
MOV A,R4 偏大取该点位置
DEC A 减一
MOV R3,A 作为新的区间高端
SJMP FD61 继续查找
FD68: MOV A,R4 偏小取该点位置
INC A 加一
MOV R2,A 作为新的区间低端
SJMP FD61 继续查找
FD69: SETB OV 查找失败
RET
(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 A,R7
DEC A
MOV R3,A ;区间高端指针初始化,指向最后一个数据
MOV R6,DPH ;保存表格首址
MOV R7,DPL
FD81: CLR C ;判断区间大小
MOV A,R3
SUBB A,R2
JC FD89 ;区间消失,查找失败
RRC A ;取区间大小的一半
ADD A,R2 ;加上区间的低端
MOV R1,A ;得到区间的中心
MOV DPH,R6
CLR C ;计算区间中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A 读取该点的内容的高字节
MOVC A,@A+DPTR
MOV B,R4 与待查找内容的高字节比较
CJNE A,B,FD84不相同
MOV A,#1 ;读取该点的内容的低字节
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84与待查找内容的低字节比较
MOV A,R1 取顺序号
CLR OV 查找成功
RET
FD84: JC FD86 该点的内容比待查找的内容大否
MOV A,R1 偏大取该点位置
DEC A 减一
MOV R3,A 作为新的区间高端
SJMP FD81 继续查找
FD86: MOV A,R1 偏小取该点位置
INC A 加一
MOV R2,A 作为新的区间低端
SJMP FD81 继续查找
FD89: MOV DPH,R6 相同恢复首址
MOV DPL,R7
SETB OV ;查找失败
RET
(30) 标号: DDM1功能:求单字节十六进制无符号数据块的平均值
入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:平均值在累加器A中。
影响资源:PSW、A、R2~R6 堆栈需求: 4字节
DDM1: MOV A,R7 ;保存数据个数
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;读取一个数据
ADD A,R5 ;累加到累加和中
MOV R5,A
JNC DM12
INC R4
DM12: INC DPTR 调整指针
DJNZ R2,DM11 累加完全部数据
LCALL D457 求平均值(R4R5/R7-→R3)
MOV A,R3 取平均值
POP DPL
POP DPH
RET
(31) 标号: DDM2功能:求双字节十六进制无符号数据块的平均值
入口条件:数据块的首址在DPTR中,双字节数据总个数在R7中。
出口信息:平均值在R4、R5中。
影响资源:PSW、A、R2~R6 堆栈需求: 4字节
DDM2: MOV A,R7 ;保存数据个数
MOV R2,A ;初始化数据指针
PUSH DPL ;保持首址
PUSH DPH
CLR A 初始化累加和
MOV R3,A
MOV R4,A
MOV R5,A
DM20: MOVX A,@DPTR ;读取一个数据的高字节
MOV B,A
INC DPTR
MOVX A,@DPTR ;读取一个数据的低字节
INC DPTR
ADD A,R5 ;累加到累加和中
MOV R5,A
MOV A,B
ADDC A,R4
MOV R4,A
JNC DM21
INC R3
DM21: DJNZ R2,DM20 累加完全部数据
POP DPH 恢复首址
POP DPL
LJMP DV31 R3R4R5/R7-→R4R5,得到平均值
(32) 标号: XR1功能:求单字节数据块的(异或)校验和
入口条件:数据块的首址在DPTR中,数据的个数在R6、R7中。
出口信息:校验和在累加器A中。
影响资源:PSW、A、B、R4~R7 堆栈需求: 2字节
XR1: MOV R4,DPH ;保存数据块的首址
MOV R5,DPL
MOV A,R7 ;双字节计数器调整
JZ XR10
INC R6
XR10: MOV B,#0 ;校验和初始化
XR11: MOVX A,@DPTR ;读取一个数据
XRL B,A ;异或运算
INC DPTR ;指向下一个数据
DJNZ R7,XR11 ;双字节计数器减一
DJNZ R6,XR11
MOV DPH,R4 ;恢复数据首址
MOV DPL,R5
MOV A,B ;取校验和
RET
(33) 标号: XR2功能:求双字节数据块的(异或)校验和
入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。
出口信息:校验和在R2、R3中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节
XR2: MOV R4,DPH ;保存数据块的首址
MOV R5,DPL
MOV A,R7 ;双字节计数器调整
JZ XR20
INC R6
XR20: CLR A ;校验和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;读取一个数据的高字节
XRL A,R2 ;异或运算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;读取一个数据的低字节
XRL A,R3 ;异或运算
MOV R3,A
INC DPTR ;指向下一个数据
DJNZ R7,XR21 ;双字节计数器减一
DJNZ R6,XR21
MOV DPH,R4 ;恢复数据首址
MOV DPL,R5
RET
(34) 标号: SORT功能:单字节无符号数据块排序(增序)
入口条件:数据块的首址在R0中,字节数在R7中。
出口信息:完成排序(增序)
影响资源:PSW、A、R2~R6 堆栈需求: 2字节
SORT: MOV A,R7
MOV R5,A ;比较次数初始化
SRT1: CLR F0 ;交换标志初始化
MOV A,R5 ;取上遍比较次数
DEC A ;本遍比上遍减少一次
MOV R5,A ;保存本遍次数
MOV R2,A ;复制到计数器中
JZ SRT5 ;若为零,排序结束
MOV A,R0 ;保存数据指针
MOV R6,A
SRT2: MOV A,@R0 ;读取一个数据
MOV R3,A
INC R0 ;指向下一个数据
MOV A,@R0 ;再读取一个数据
MOV R4,A
CLR C
SUBB A,R3 ;比较两个数据的大小
JNC SRT4 ;顺序正确(增序或相同),不必交换
SETB F0 ;设立交换标志
MOV A,R3 ;将两个数据交换位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一个数据
SRT4: DJNZ R2,SRT2 ;完成本遍的比较次数
MOV A,R6 ;恢复数据首址
MOV R0,A
JB F0,SRT1 ;本遍若进行过交换,则需继续排序
SRT5: RET ;排序结束
END

[单片机的组成介绍 ]
2005-5-31 13:33:38 
  (华强电子世界网讯) 单片机要自动完成计算,它应该具有哪些最重要的部分呢?   我们以打算盘为例计算一道算术题。例: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口、中断系统等就分布在此总线的两旁,并和它连通。从而,一切指令、数据都可经内部总线传送,有如大城市内各种物品的传送都经过干道进行。
发表于 2009-1-22 07:08:59 | 显示全部楼层
楼主很实在,大家都发附件了现在
头像被屏蔽
发表于 2009-1-24 17:47:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-2-9 22:34:33 | 显示全部楼层
楼主好人啊
发表于 2016-1-15 23:52:29 | 显示全部楼层
楼主好人啊
发表于 2016-4-13 16:59:05 | 显示全部楼层
回复 2# zephyr_bj


    哇哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-10 05:07 , Processed in 0.062278 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表