单片机程 MCS-51系列) 第六课单片机的内部结构(四) 在前一课中,我们讲述了单片机的时序和时钟,大家是不是又觉得有些头疼了,下面让我们再来 做两个实验放松一下。 单片机I/0口的输出实验 1.实验程序 程序如下 OOP: MOv P1, #OFFH LCALL DELAY MOv P1. #oOH LCALL DELAY L JMP LOOP DELAY: MOV R7, #250 D1:MOVR6,#250 D2: DJNZ R6, D2 DJNZ R7, DI 还是老规矩,调试写入源代码,圖译下载,看到了什么?8只LED灯都在闪烁(注意:前面 的实验是让一个LED灯闪烁),分析一下程序: 2.程序分析 这段程序和前面的程序比较,有两处不同,第1条,原来是 SETB P1.0,现在改为MoVP1,#OFFH, 第3条,原来是CLRP1,现在改为MoVP1,#0OH。为什么这样改了之后就变成了8只LED灯同时闪 烁了?原来P1代表了P1.7-P1.0的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存 储器单元送数就应该用MoV指令了;在这里P1(P1.7-P1.0)接的是LED灯(也就是负载),它起到了 个输出端的作用。那如果把P1改为P2或P3或P4行不行呢?答案是肯定的,为什么?我们稍后再谈, 接着看第2个实验 二,单片机I/0口的输入实验 1.实验程序 程序如下: MAIN: MOV P3, #OFFH LOOP: MOV A P3 MOV P1.A L JMP LOOP 同样的方法把程序下载到单片机,按下第1个按钮,第1个LED灯亮了,按下第2个按钮,第2 个LED灯亮了,松开按钮,相应的灯就灭了,是不是有点象工业控制中的点动控制原理。分析一下这个 程序 2.程序分析 看附图的硬件接线图,有4个按钮分别接到了P3.2,P3.3,P3.4,P3.5,引脚上。再来分析一下 程序,第1条,使P3口(包括P3.7-P3.0)全部为高电平(为什么MOVP3,#0FFH能使P3口全部为高 电平,我们在下一课中讨论):第2条MVA,P3:MOV我们已经知道,是送数的意思,这条指令的意 思就是把P3口的数送到A中去,A是什么呢?我们也可以把它看成一个中间单元,就象R7寄存器一样, 第3条指令就是把A中的数送到P1口去;第4条是循环,这些我们都已经见过,当我们按下P3.2所连 单片机之友QQ:280919249
单片机教程 (MCS-51 系列) 19 第六课 单片机的内部结构(四) 在前一课中,我们讲述了单片机的时序和时钟,大家是不是又觉得有些头疼了,下面让我们再来 做两个实验放松一下。 一.单片机 I/O 口的输出实验 1.实验程序 程序如下: LOOP:MOV P1,#0FFH ; LCALL DELAY ; MOV P1,#00H ; LCALL DELAY ; LJMP LOOP ; DELAY:MOV R7,#250 ; D1:MOV R6,#250 ; D2:DJNZ R6,D2 ; DJNZ R7,D1 ; RET ; END 。 还是老规矩,调试,写入源代码,编译,下载,看到了什么?8 只 LED 灯都在闪烁(注意:前面 的实验是让一个 LED 灯闪烁),分析一下程序: 2.程序分析 这段程序和前面的程序比较,有两处不同,第 1 条,原来是 SETB P1.0,现在改为 MOV P1,#0FFH, 第 3 条,原来是 CLR P1,现在改为 MOV P1,#00H。为什么这样改了之后就变成了 8 只 LED 灯同时闪 烁了?原来 P1 代表了 P1.7-P1.0 的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存 储器单元送数就应该用 MOV 指令了;在这里 P1(P1.7-P1.0)接的是 LED 灯(也就是负载),它起到了 一个输出端的作用。那如果把 P1 改为 P2 或 P3 或 P4 行不行呢?答案是肯定的,为什么?我们稍后再谈, 接着看第 2 个实验。 二.单片机 I/O 口的输入实验 1.实验程序 程序如下: MAIN:MOV P3,#0FFH ; LOOP:MOV A,P3 ; MOV P1,A ; LJMP LOOP ; END. 同样的方法把程序下载到单片机,按下第 1 个按钮,第 1 个 LED 灯亮了,按下第 2 个按钮,第 2 个 LED 灯亮了,松开按钮,相应的灯就灭了,是不是有点象工业控制中的点动控制原理。分析一下这个 程序: 2.程序分析 看附图的硬件接线图,有 4 个按钮分别接到了 P3.2,P3.3,P3.4,P3.5,引脚上。再来分析一下 程序,第 1 条,使 P3 口(包括 P3.7-P3.0)全部为高电平(为什么 MOV P3,#0FFH 能使 P3 口全部为高 电平,我们在下一课中讨论);第 2 条 MOV A,P3;MOV 我们已经知道,是送数的意思,这条指令的意 思就是把 P3 口的数送到 A 中去,A 是什么呢?我们也可以把它看成一个中间单元,就象 R7 寄存器一样, 第 3 条指令就是把 A 中的数送到 P1 口去;第 4 条是循环,这些我们都已经见过,当我们按下 P3.2 所连 单片机之友 QQ:280919249
单片机程 MCS-51系列) 接的按钮时,#OFH这个数就被送到了A中,通过程序又送到了P1,使P1.2输出低电平,LED3就亮了 按下P3.3-P3.5连接的按钮,对应的LED4-LED6也亮了,松开按钮,相应的LED灯就灭了。如果把按钮 接到P2.0-P2.7或P4.0-P4.7可不可以呢?当然可以。所以在这里P3口又起到了一个输入端的作用。 由上面两个实验我们得出结论,凡是以P开头的管脚都可以用作输入输出口,在89C51中这32 个管脚我们就称之为并行口。它们实际上就是特殊功能存储器SFR(什么是特殊功能寄存器,我们后面 再讲)中的四个,记作PO,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入 口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输岀功能的呢?继续往 下看。 三.单片机并行口的结构分析 先来看看输入结构: 地址/数 读存器 P1.X 内部总线 内部总线 P0并行功能圈读引脚 P1并行功能图 第二输出功能 读器 读镇存是 内部总线 内部总线 写入 读引脚 P2并行囗功能图 第二输入功能P3并行动能图 1.输入结构 I/0口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读 入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。比如 取反,置位,清零等等指令:而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表 示的就是输入缓冲器,CPU将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的 操作,这是硬件自动完成的,不需要我们操心 读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再 实行读引脚操作,否则就可能读入出错。为什么?看上面的图,如果不对端口置“1”,端口锁存器原来 的状态有可能为“0”(Q端为0,Q为1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地 呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的 信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓 冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备动作,所以这类I/0口被称为“准双 向”口,MCS-51的P0,P1,P2,P3口作为输入/输出口时都是“准双向”口。接下来让我们再看另 个问题,从图中可以看出,这四个端口还有一个差别,除了P1口外,P0,P2,P3口都还有第二功能, 这些第二功能又是作什么用的呢?下面我们就来讲解这个问题 2.端口的工作原理 单片机之友QQ:280919249
单片机教程 (MCS-51 系列) 20 接的按钮时,#0FFH 这个数就被送到了 A 中,通过程序又送到了 P1,使 P1.2 输出低电平,LED3 就亮了, 按下 P3.3-P3.5 连接的按钮,对应的 LED4-LED6 也亮了,松开按钮,相应的 LED 灯就灭了。如果把按钮 接到 P2.0-P2.7 或 P4.0-P4.7 可不可以呢?当然可以。所以在这里 P3 口又起到了一个输入端的作用。 由上面两个实验我们得出结论,凡是以 P 开头的管脚都可以用作输入输出口,在 89C51 中这 32 个管脚我们就称之为并行口。它们实际上就是特殊功能存储器 SFR(什么是特殊功能寄存器,我们后面 再讲)中的四个,记作 P0,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入 口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢?继续往 下看。 三. 单片机并行口的结构分析 先来看看输入结构: 1.输入结构 I/O 口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读 入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。比如 取反,置位,清零等等指令;而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表 示的就是输入缓冲器,CPU 将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的 操作,这是硬件自动完成的,不需要我们操心。 读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再 实行读引脚操作,否则就可能读入出错。为什么?看上面的图,如果不对端口置“1”,端口锁存器原来 的状态有可能为“0”(Q 端为 0,Q^为 1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地 呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1” 信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓 冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备动作,所以这类 I/O 口被称为“准双 向”口,MCS-51 的 P0,P1,P2,P3 口作为输入/输出口时都是“准双向”口。接下来让我们再看另一 个问题,从图中可以看出,这四个端口还有一个差别,除了 P1 口外,P0,P2,P3 口都还有第二功能, 这些第二功能又是作什么用的呢?下面我们就来讲解这个问题: 2.端口的工作原理 单片机之友 QQ:280919249
单片机欲程 MCS-51系列) (1)。P0口 先来看P0口,从图中可以看到,PO口的内部有一个2选1的选择器,受内部信号的控制,如果 在图中的位置则处在I/0口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口 线可以独立定义为输入或输出,但是须在口线上加上拉电阻。如果将开关往另一个方向,则就是另一个 功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时 输入8位数据;而当作地址总线用时,则输出8位地址。再强调一点,当P0口作为地址/数据总线用之 后,就再也不能作I/0口使用了。讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?这其实 是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,具体如何使用,这就比较复杂了 我们只能留到下册课程中再来给大家讲解,这里大家只要了解一下就可以了。知道了PO口,再来看P1 (2)。P1口 同P0不同,P1口只能作为I/0口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需 要外接上拉电阻,这一点P1,P2,P3都一样,务必请大家注意 (3)。P2口 P2口作为I/0口线用时,与P0口一样,当内部开关向另一个方向时,即作地址输出时,可以输 出程序存储器或外部数据存储器的高8位地址,并与P0口输出的低地址一起构成16位的地址线,从而 可以分别寻址64K的程序存储器或外部数据存储器,同样地址线是8位一起自动输出的,不能象I/0 口线那样逐位定义。 (4)。P3口 P3口作为I/0口线用时,同P1口相同,也是“准双向口”不同的是,P3口的每一位都有另一 种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用到时再详细解释。 端口位 第二功能 注释 P3.0 串行口输入 TXD 串行口输出 P3.2 INTO 外部中断0 P3.3 INTI 外部中断1 P3.4 计数器0计数输入 P3. 3.5 计数器1计数输入 外部RAM写入选通信号 P3.7 外部RAM读出选通信号 讲到这里,也许您会问?既然单片机的引脚有第二功能,那么CPU是如何来区分的呢?这是一个 令许多初学者困惑的问题,几乎没有一本教科书提到过这个问题,其实单片机的第二功能是不需要人工 干预的,也就是说只要CPU执行到相应的指令,就自动转成了第二功能。了解了各个I/口的功能和作 用,再来给大家讲解一下单片机I/0与外围电路的连接方法。这可是蛮重要的哦! 四.单片机I/0口的连接方法 当单片机的I/0口作输出时可以直接与外部设备连接,不过由于在实际的应用中,由于其驱动电 流是有限的(P0口10mA,P1,P2,P3口20mA),所以我们常常需要通过接口电路来扩展它的驱动能力, 在单片机的后向通道控制系统中,常用的功率控制器件有机械继电器、晶闸管、固态继电器等等,下面 我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法 1.单片机与机械继电器的接口 我们知道,单片机的一个1/0口只能灌入20mA的电流,所以往往不足以驱动一些功率开关(比如 稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单片机与机械继电器的接 口昵?其实很简单,我们通常采用下面的接法(如图),为了防止前向通道信号的干扰,常采用一些光 电隔离器件,比如光电耦合器4N25,PC814等,当单片机的P1.0脚输出为低电平时,光藕受电导通, Q1饱和开通,继电器吸合,负载电路接通。这里请注意◎:P0-P3口作输出控制端时,应尽量采用低电 平控制方法,这是因为在低电平时,1/0口允许灌入的电流比高电平时要大,一般情况下,低电平的灌 单片机之友QQ:280919249
单片机教程 (MCS-51 系列) 21 (1)。P0 口 先来看 P0 口,从图中可以看到,P0 口的内部有一个 2 选 1 的选择器,受内部信号的控制,如果 在图中的位置则处在 I/O 口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口 线可以独立定义为输入或输出,但是须在口线上加上拉电阻。如果将开关往另一个方向,则就是另一个 功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时, 输入 8 位数据;而当作地址总线用时,则输出 8 位地址。再强调一点,当 P0 口作为地址/数据总线用之 后,就再也不能作 I/O 口使用了。讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?这其实 是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,具体如何使用,这就比较复杂了, 我们只能留到下册课程中再来给大家讲解,这里大家只要了解一下就可以了。知道了 P0 口,再来看 P1 口。 (2)。P1 口 同 P0 不同,P1 口只能作为 I/O 口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需 要外接上拉电阻,这一点 P1,P2,P3 都一样,务必请大家注意。 (3)。P2 口 P2 口作为 I/O 口线用时,与 P0 口一样,当内部开关向另一个方向时,即作地址输出时,可以输 出程序存储器或外部数据存储器的高 8 位地址,并与 P0 口输出的低地址一起构成 16 位的地址线,从而 可以分别寻址 64K 的程序存储器或外部数据存储器,同样地址线是 8 位一起自动输出的,不能象 I/O 口线那样逐位定义。 (4)。P3 口 P3 口作为 I/O 口线用时,同 P1 口相同,也是“准双向口”;不同的是,P3 口的每一位都有另一 种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用到时再详细解释。 端口位 第二功能 注释 P3.0 RXD 串行口输入 P3.1 TXD 串行口输出 P3.2 INTO 外部中断 0 P3.3 INT1 外部中断 1 P3.4 T0 计数器 0 计数输入 P3.5 T1 计数器 1 计数输入 P3.6 WR 外部 RAM 写入选通信号 P3.7 RD 外部 RAM 读出选通信号 讲到这里,也许您会问?既然单片机的引脚有第二功能,那么 CPU 是如何来区分的呢?这是一个 令许多初学者困惑的问题,几乎没有一本教科书提到过这个问题,其实单片机的第二功能是不需要人工 干预的,也就是说只要 CPU 执行到相应的指令,就自动转成了第二功能。了解了各个 I/O 口的功能和作 用,再来给大家讲解一下单片机 I/O 与外围电路的连接方法。这可是蛮重要的哦! 四.单片机 I/O 口的连接方法 当单片机的 I/O 口作输出时可以直接与外部设备连接,不过由于在实际的应用中,由于其驱动电 流是有限的(P0 口 10mA,P1,P2,P3 口 20mA),所以我们常常需要通过接口电路来扩展它的驱动能力, 在单片机的后向通道控制系统中,常用的功率控制器件有机械继电器、晶闸管、固态继电器等等,下面 我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法。 1. 单片机与机械继电器的接口 我们知道,单片机的一个 I/O 口只能灌入 20mA 的电流,所以往往不足以驱动一些功率开关(比如 稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单片机与机械继电器的接 口呢?其实很简单,我们通常采用下面的接法(如图),为了防止前向通道信号的干扰,常采用一些光 电隔离器件,比如光电耦合器 4N25,PC814 等,当单片机的 P1.0 脚输出为低电平时,光藕受电导通, Q1 饱和开通,继电器吸合,负载电路接通。这里请注意☺:P0-P3 口作输出控制端时,应尽量采用低电 平控制方法,这是因为在低电平时,I/O 口允许灌入的电流比高电平时要大,一般情况下,低电平的灌 单片机之友 QQ:280919249
单片机程 MCS-51系列) 入电流为高电平的4倍 另外为了防止电压间的互相干扰,继电器的工作电压VD与单片机的工作电压VCC不要使用同 个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电 流,其他的元件就不讲了,大家自行分析一下。讲了单片机与继电器的接口,再来介绍与固态继电器的 接口方法,接着往下看: 2.单片机与固态继电器的接口 普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在某些特殊应用 场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器是一种无触点的电子继电器,它的 输入端只要很小的控制电流,可以与单片机的I/O口直接连接;输出则采用双向晶闸管控制,其输入输 出间均通过内部光电耦合器隔离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成 熟,应用的广泛,价格也已经非常的便宜,1A250V的目前在10元左右,它与单片机的连接方法如图 所示,当“-”端所接的P1.0为低电平时,SSR导通,负载工作。 VCC PC814 9013 POWER R4 IK 图2 除了以上两种连接方法外,单片机与TTL,CMOS管等都可以连接,具体的方法这里就不介绍了 大家可以自行找一下相关的资料 五,本课总结 输入和输出口(简称I/0口)是单片机与外部电路接口的唯一途径,四个并行口的结构是有一定 区别的,如何根据系统的设计要求和产品用途来正确、灵活地使用是初学者必须掌握的基本功,我们必 须好好搞清楚它的功能和用途。 六.第6课习题 1.P0,P1,P2,P3口的驱动电流分别是多少? 2.什么是输入?什么是输出? 3.找本数字电路的书,了解一下D触发器的原理。 单片机之友QQ:280919249
单片机教程 (MCS-51 系列) 22 入电流为高电平的 4 倍。 另外为了防止电压间的互相干扰,继电器的工作电压 VDD 与单片机的工作电压 VCC 不要使用同一 个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电 流,其他的元件就不讲了,大家自行分析一下。讲了单片机与继电器的接口,再来介绍与固态继电器的 接口方法,接着往下看: 2. 单片机与固态继电器的接口 普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在某些特殊应用 场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器是一种无触点的电子继电器,它的 输入端只要很小的控制电流,可以与单片机的 I/O 口直接连接;输出则采用双向晶闸管控制,其输入输 出间均通过内部光电耦合器隔离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成 熟,应用的广泛,价格也已经非常的便宜,1A/250V 的目前在 10 元左右,它与单片机的连接方法如图 所示,当“-”端所接的 P1.0 为低电平时,SSR 导通,负载工作。 除了以上两种连接方法外,单片机与 TTL,CMOS 管等都可以连接,具体的方法这里就不介绍了, 大家可以自行找一下相关的资料。 五.本课总结 输入和输出口(简称 I/O 口)是单片机与外部电路接口的唯一途径,四个并行口的结构是有一定 区别的,如何根据系统的设计要求和产品用途来正确、灵活地使用是初学者必须掌握的基本功,我们必 须好好搞清楚它的功能和用途。 六. 第 6 课习题 1. P0,P1,P2,P3 口的驱动电流分别是多少? 2. 什么是输入?什么是输出? 3. 找本数字电路的书,了解一下 D 触发器的原理。 单片机之友 QQ:280919249
单片机程 MCS-51系列) 第七课单片机的内部结构(五) 在上一课中,我们讲到了指令MOVP3,#OFH能使P3口全部为高电平,而在第四课中LED灯闪 烁程序中给R7送数用的指令是MoVR7,#250,那么这#250和#0FH到底有什么不同?它们又代表什 么意思呢?这一课就来讨论这个问题。在讲解之前,让我们先来复习一下数字电路中学过的数制概念: 数制 十进制数( Decimal number) 在日常生活中,我们表示数的多少用的是十进制数,即0,1,2,3,4,5,6,7,8,9。它遵循 “逢十进一,借一当十”的原则,通常我们把计数符号的个数叫做基数,十进制的基数就是十 比如一个十进制数5847=5*1000+8*100+4*10+7*1,它的每一个数码都有一个系数1000,100,10, 1:这个系数叫做权或位权。十进制数虽然非常符合我们的使用习惯,但计算机中却无法采用,因为计 算机只能有两种状态:“0”和“1”,所以我们还得应用二进制数 2.二进制数( Binary Number) 二进制的基数为二,0和1,它遵循的是“逢二进一,借一当二”的进借位原则。也就是当某位 计数到两个数时就向高位进“1”,同时本位变为“0”。 比如二进制数1100=1*2+1*2+0*2+0*2,二进制数只有0和1两个数,正好代表了计算机中电路 的两种状态,所以它在计算机中被广泛应用。下面是二进制的加法和乘法运算规则: 加法:0+0=0;1+0=0+1=1:1+1=10 乘法:0*0=0:1*0=0*1=0;1*1=1 二进制数虽然在计算机中处理很方便,但当位数较多时,就不容易记忆和书写了,所以计算机中 又有了十六进制数 3.十六进制数( Hexadecimal Number) 十六进制也遵循两个规则,一是有十六个基数,即0,1,2,3,4,5,6,7,8,9,A,B,C,D, F:另一个规则是“逢十六进一,借一当十六”。 比如我们前面提到的#OFH就是一个十六进制数,#一我们已经明白了,它表示的是传递数的本身 H”叫数制简码,它表示这个数是十六进制数,为什么前面我在标题后面都加了英文注释,相信大家 也应该明白了吧(这里随便提一下,二进制简码B和十进制简码D通常是可以省略的,我们以后的课程 中用到的数都是这样写的),那么0FFH这个十六进制数的表示方法是怎么样的呢?用十进制表示 0FFH=F*16+F*16,即等于255。(大家也许会疑问?这里的“0”到哪里去了呢?原来,在单片机中 当我们用十六进制格式表示一个数时,如果高位的数字为“AF”时,高位前面就得加上个“0”,不然, 编译软件会出错,就象#0FFH。 二.进制之间的转换 十进制有使用比较习惯的特点,二进制有易于表示和运算方便的特点,十六进制又有表示位数较 多的特点,但有时我们常常要把十进制数转换成二进制数或十六进制数来处理;把二进制数逆转换成十 六进制数,如何进行这种转换呢?下面就举几个例子 1.十进制数与非十进制数之间的转换 (1)非十进制数转换为十进制数 具体做法是:将一个非十进制数按权展开成一个多项式,每项是该位数码与相应权值之积,把多 项式按十进制的规则进行计算求和,所得的结果就是该数的十进制形式。 比如:二进制数1011B转换成十进制为1*2+0*2+1*2+1*2=8+2+1=11D,再比如:十六进制数FFH 转换成十进制为255D。 (2)十进制数转换为非十进制数 十进制数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最后将结果合并 单片机之友QQ:280919249
单片机教程 (MCS-51 系列) 23 第七课 单片机的内部结构(五) 在上一课中,我们讲到了指令 MOV P3,#0FFH 能使 P3 口全部为高电平,而在第四课中 LED 灯闪 烁程序中给 R7 送数用的指令是 MOV R7,#250,那么这#250 和#0FFH 到底有什么不同?它们又代表什 么意思呢?这一课就来讨论这个问题。在讲解之前,让我们先来复习一下数字电路中学过的数制概念: 一.数制 1. 十进制数(Decimal Number) 在日常生活中,我们表示数的多少用的是十进制数,即 0,1,2,3,4,5,6,7,8,9。它遵循 “逢十进一,借一当十”的原则,通常我们把计数符号的个数叫做基数,十进制的基数就是十。 比如一个十进制数 5847=5*1000+8*100+4*10+7*1,它的每一个数码都有一个系数 1000,100,10, 1;这个系数叫做权或位权。十进制数虽然非常符合我们的使用习惯,但计算机中却无法采用,因为计 算机只能有两种状态:“0”和“1”,所以我们还得应用二进制数。 2. 二进制数(Binary Number) 二进制的基数为二,0 和 1,它遵循的是“逢二进一,借一当二”的进借位原则。也就是当某位 计数到两个数时就向高位进“1”,同时本位变为“0”。 比如二进制数 1100=1*23 +1*22 +0*21 +0*20 ,二进制数只有 0 和 1 两个数,正好代表了计算机中电路 的两种状态,所以它在计算机中被广泛应用。下面是二进制的加法和乘法运算规则: 加法:0+0=0;1+0=0+1=1;1+1=10 乘法:0*0=0;1*0=0*1=0;1*1=1 二进制数虽然在计算机中处理很方便,但当位数较多时,就不容易记忆和书写了,所以计算机中 又有了十六进制数。 3. 十六进制数(Hexadecimal Number) 十六进制也遵循两个规则,一是有十六个基数,即 0,1,2,3,4,5,6,7,8,9,A,B,C,D, E,F;另一个规则是“逢十六进一,借一当十六”。 比如我们前面提到的#0FFH 就是一个十六进制数,#--我们已经明白了,它表示的是传递数的本身, “H”叫数制简码,它表示这个数是十六进制数,为什么前面我在标题后面都加了英文注释,相信大家 也应该明白了吧(这里随便提一下,二进制简码 B 和十进制简码 D 通常是可以省略的,我们以后的课程 中用到的数都是这样写的),那么 0FFH 这个十六进制数的表示方法是怎么样的呢?用十进制表示 0FFH=F*161 +F*160 ,即等于 255。(大家也许会疑问?这里的“0”到哪里去了呢?原来,在单片机中, 当我们用十六进制格式表示一个数时,如果高位的数字为“A-F”时,高位前面就得加上个“0”,不然, 编译软件会出错,就象#0FFH。 二. 进制之间的转换 十进制有使用比较习惯的特点,二进制有易于表示和运算方便的特点,十六进制又有表示位数较 多的特点,但有时我们常常要把十进制数转换成二进制数或十六进制数来处理;把二进制数逆转换成十 六进制数,如何进行这种转换呢?下面就举几个例子: 1. 十进制数与非十进制数之间的转换 (1) 非十进制数转换为十进制数 具体做法是:将一个非十进制数按权展开成一个多项式,每项是该位数码与相应权值之积,把多 项式按十进制的规则进行计算求和,所得的结果就是该数的十进制形式。 比如:二进制数 1011B 转换成十进制为 1*23 +0*22 +1*21 +1*20 =8+2+1=11D,再比如:十六进制数 FFH 转换成十进制为 255D。 (2) 十进制数转换为非十进制数 十进制数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最后将结果合并 单片机之友 QQ:280919249