单片机是把CPU、一定容量的存储器和必要的I/O接口电路集成在一个芯片上构成的具有计算机的完整功能的一种微机。
1.工业控制 2.事物处理 3.计算机辅助设计和辅助制造(CAD/CAM) 4.教学培训 5.家庭娱乐和家政事务管理 6.科学和工程计算 7.人工智能
十进制数是用0,1,2,…,8,9十个不同的符号来表示数值,它采用的是“逢十进一,借一当十”的原则。
基数为10的记数制叫十进制;基数为2的记数制叫做二进制。 二进制数的计算规则是“逢二进一,借一当二”。
八进制数是基数为八的计数制。八进制数主要采用0,1,2,…,7这八个阿拉伯数字。 八进制数的运算规则为“逢八进一,借一当八”。 八进制表示数值方法如下: 例:
基数为16,用0 - 9 、A - F 十五个字符来数值,逢十六进一。 各位的权值为 16^I 十六进制表示数值方法如下: 例:
二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值。
八进制数从低位到高位(即从右往左)计算,第0位的权值是8的0次方,第1位的权值是8的1次方,第2位的权值是8的2次方,依次递增下去,把最后的结果相加的值就是十进制的值。
十六进制数从低位到高位(即从右往左)计算,第0位的权值是16的0次方,第1位的权值是16的1次方,第2位的权值是16的2次方,依次递增下去,把最后的结果相加的值就是十进制的值。
除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。
取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置照旧。
取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位二进制按权相加,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后,取到最高(最低)位时候,如果无法凑足四位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足四位。
取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。
利用二进制实现转换
BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即:
[-127 , 127]
反码的表示方法是: * 正数的反码是其本身 * 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
补码的表示方法是: * 正数的补码就是其本身 * 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
已知:计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
对于复数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可见原码, 反码和补码完全不同。 对于计算机, 加减乘除是最基础的运算, 要设计的尽量简单。于是人将符号位也参与运算。 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。 计算十进制的表达式: 1-1=0 首先看原码:
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数. 为了解决原码做减法的问题, 出现了反码:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在”0”这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0. 于是使用补码, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
(-1-127)的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的) 使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]. 因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
CPU是大规模集成电路技术做成的芯片,芯片内集成有控制器、运算器和寄存器等相关部件,完成对计算机系统内各部件进行统一协调和控制。 包括:寄存器阵列(RS)、算术和逻辑运算单元(ALU)、控制器、内部总线及缓冲器 * 控制器:根据程序中的命令发出各种控制信号,使各部分协调工作以完成指令所要求的各种操作。 * 运算器:对信息进行加工、运算的部件,执行算术运算和逻辑运算。
功能:存放程序和数据。 存储器=内存+外存。 内存是半导体存储器,外存通常是指光盘,硬盘等可长期保存信息。 半导体存储器包含RAM和ROM。 RAM:随机读写存储器(random access memory)。 RAM主要用来存放各种数据,中间结果以及外存交换信息和作 为堆栈。程序运行的时候通常从外存读入内存ram中,然后再 由cpu从ram中读取并运行。 Sram静态存储器,cache。 Dram动态存储器用于主存。SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器。 Rom:只读存储器(read only memory)。 Flash memory:闪速存储器,又叫闪存,是一种特殊的rom。
注意: 存储单元的地址和该地址单元中存放的内容是两个不同的概念。
把编制好的程序和数据一起先送入存储器中保存起来。启动机器运行后,根据给出的程序中第一条指令的存储地址,控制器就可以根据存储程序中的程序周而复始的取出指令、分析指令、执行指令,直至完成全部指令操作,即控制器通过指令流的串行驱动实现程序控制。
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。 * 计算机的各个部件挂在总线上,总线使得计算机功能部件之间的相互关系变成各个功能部件面向总线的单一关系。 * 优点: * 结构简单 * 扩展维护方便
从处理器引出的若干信号线,CPU通过它们与存储器或I/O设备进行信息交换。一个部件只要满足总线标准,就可以连接到采用这种总线标准的系统中。 系统总线分为: 地址总线 控制总线 * 数据总线
传递地址信息的总线,即AB。CPU在地址总线上输出将要访问的内存单元或I/O端口的地址,该总线为单向总线。
传递控制信息的总线,即CB。 一部分是从CPU输出:通过对指令的译码,由CPU内部产生,由CPU送到存储器、输入/输出接口电路和其它部件。如读写控制信号等。 另一部分是由系统中的其他外设产生,送往CPU,如:中断请求信号、总线请求信号、状态信号。
传递数据信息的总线,即DB。 在CPU进行读操作时,内存或外设的数据通过数据总线送往CPU; 在CPU进行写操作时,CPU数据通过数据总线送往内存或外设,数据总线是双向总线。
系统软件和应用软件 系统软件包括操作系统、各种高级语言处理程序、编译系统和其他服务程序、数据库管理系统等软件。这些软件不是用来解决具体应用问题的,而是利用计算机自身的功能,合理的组织解题流程,管理计算机软、硬件各种资源,提供人-机间的接口,从而简化或代替各环节中人所承担的工作。还可以为用户使用机器提供方便,扩大机器功能,提高工作效率。 应用软件是由用户利用计算机及其系统软件编制的解决实际应用问题的程序。
Intel 8086 微处理器有16位寄存器和16位外部数据总线,20位地址总线,寻址为1MB的地址空间。Intel 8088 微处理器的外部数据总线为8位,其他与8086是一样的。
8086 CPU从功能上划分成两部分:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit).
BIU根据EU的请求,将指令送到指令流队列中排队,为EU提供即将执行的指令;EU从BIU的指令队列取得的指令和数据,来对片外操作数(片外就是指CPU以外存储数据的地方,比如存储器,IO接口等)进行访问的。这样EU与BIU可独立工作,BIU在保证EU与片外传输操作数的前提下,可进行指令预取,与EU可重叠操作。取指部分与执行部分可分开进行,提高CPU的利用率。(8086指令队列出现2个空字节,且EU未占总线,BIU自动取指令填充队列。)
它主要用来存放将要执行的下一条指令的偏移量,与CS联合形成下一条指令的物理地址。
它用来计算物理地址的,物理地址的形成: 理地址 = 段基地址×10H + 偏移量 8086微处理器有20条地址总线,可寻址1MB的存储器空间。由于8086微处理器是一个16位结构,段寄存器均为16位,这样16位寄存器就无法存放20位地址了。为了解决这个问题,8086内部就设置了一个20位的地址加法器,它首先将16位的段地址左移4位,然后再与16位的偏移地址相加形成20位的物理地址,如图: 每当取指令的时,则自动选择代码段寄存器CS,再加上由指令指针寄存器(IP)提供的16位偏移量,按上述方法计算后得到所要取的指令的20位物理地址。
它是一个6B的先进先出缓冲器。8086微处理器具有指令预取功能,当执行部件(EU)不使用总线接口部件与片外进行数据传送,总线接口部件就可以从存储器中读取指令填充指令队列缓冲器。 8088微处理器的指令队列缓冲器只有4B深度。
这部分电路是处理器与外部总线的接口,它首先把已形成的20位地址码经地址线送出片外,然后经数据总线进行操作数或指令代码的传输。操作数送相关寄存器或由相关寄存器送到片外,而指令代码从片外存储器读入到指令队列等待译码执行。
其中: AX: 具有累加功能,可作16位累加器,AL可作为8位累加器。 BX: 在基址变址寻址时作为基址寄存器。 CX: 在循环类与串处理类指令执行时作为默认的计数器寄存器。 DX: 作为数据寄存器使用,在双字运算中存放高16位数据。
SP(Stack Pointer):堆栈指针寄存器,用来指出堆栈的顶部偏移地址。 BP(Base Pointer):基地址指针寄存器,在间接寻址时作为基地址寄存器。 SI(Source Index):源变址寄存器,在间接寻址时作为地址寄存器或变址寄存器。在字符串处理指令中,作为目的变址寄存器。 DI(Destination Index):目的变址寄存器,在间接寻址时作为地址寄存器或变址寄存器。在字符串处理指令中,作为源变址寄存器。
它主要完成算术运算、逻辑运算。
它是一个16位的寄存器,用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由 CPU 自动设置的。其中9位有定义, 9位中6位表示状态,3位表示控制标志,见图 (1)进位标志(CF):运算指令执行之后,若在最高位上产生进位、借位时,该标志位被置1。 具体地说,两个数相加时,最高位(D15或D7)有进位,或当两个数相减时,最高位有借位,进位标志位被置1,即CF=1;否则CF=0。 (2)奇偶标志(PF):8086/8088 CPU中采用奇校验,运算指令执行后,运算结果的低8位中含1的位数为偶数时,该标志位被置1,否则被置0。也称为偶标志位。 (3)辅助进位标志(AF):运算指令执行后。当两个数相加(减)时,当D3有向D4进(借)位时,该标志位被置1,否则被置0。 (4) 全零标志(ZF):运算指令执行后,结果的每一位都为零时该标志位被置1。 (5) 符号标志(SF):在带符号数运算时,如果运算结果最高位为1,表示结果为负值,SF位被置1,否则SF位被置0。SF也称为负标志位。 (6)溢出标志(OF):运算指令执行后,结果的数值产生溢出,该标志位被置1,否则被置0。 (7)方向标志(DF):用于字符串指令操作,当DF=0时,字符串处理由低地址向高地址处理;当DF=1时,则从高位地址向低位地址处理。 (8)中断允许标志(IF):用来控制可屏蔽硬件中断。当IF=1时8086微处理器可以接受片外来的可屏蔽中断请求,开中断;IF=0时片外来的中断请求被阻止,关中断,也称被屏蔽。 (9)陷阱标志(TF):该标志用来控制单步中断。在TF=1时,以单步方式执行程序。即8086每执行完—条指令就产生处理器内部单步中断。单步执行指令可使程序员跟踪指令的执行过程,进行积序的调试。
操作控制电路是8086微处理器的控制核心,首先将指令队列中送来的一条指令进行译码,然后根据不同指令的功能产生出所需要的控制信号来控制各相关功能部件的操作。
微处理器 8086, 8088结构类似。从程序员和使用角度来看的结构即编程结构从功能上分为两部分:总线接口部分BIU(Bus Interface Unit),执行部分EU(Execution Unit)。 由于指令队列的存在,两部分各自执行自己的功能并行工作,这种工作方式与传统的计算机在执行指令时的串行工作相比极大的提高了工作效率。 计算机执行程序时,CPU的工作顺序是: 取指令 -> 执行指令 -> 再取指令 -> 再执行指令...CPU串行工作。 8086CPU工作顺序是:取指令,执行指令同时进行。并行工作。
注:常在CS中用 IP 表示偏移量,SS中用 SP、BP,DS中用 BX、SI、DI、数值 。