1.2 单片机基础知识
在日常生活中,人们习惯用十进制来表示数,但计算机只能识别二进制数。二进制是计算机中数制的基础。
1.2.1 数制与数制间的转换
1.数制
按进位的原则进行计数,称为进位计数制,简称“数制”。数制有多种,在计算机中常用的有十进制、二进制和十六进制。
(1)十进制。
十进制按“逢十进一”的原则进行计数,它的基数为“十”,所使用的数码为0~9共10个数字。对于任意4位十进制数,都可以写成如下形式:
D3D2D1D0=D3×103+D2×102+D1×101+D0×100
式中,D3、D2、D1、D0称为数码;10为基数;103、102、101、100是各位数码的“位权”,上式称为按位权展开式。
例:30681=3×104+0×103+6×102+8×101+1×100
(2)二进制。
二进制按“逢二进一”的原则进行计数,它的基数为“二”,其使用的数码只有0和1两个。二进制在计算机中容易实现,可以用电路的高电平表示“1”,低电平表示“0”。或者用三极管截止时集电极的输出表示“1”,导通时集电极输出表示“0”。
对于任意一个4位二进制数,都可以写成如下形式:
B3B 2B 1B 0=B 3×23+B 2×22+B 1×21+B 0×20
式中,B 3、B 2、B 1、B 0称为数码;2为基数;23、22、21、20是各位数码的“位权”。
例:(1101)2=1×23+1×22+0×21+1×20=13
由于二进制运算实行的借进位规则是“逢二进一,借一当二”,因此二进制的运算规则相当简单。
·加法:0+0=0,0+1=1,1+0=1,1+1=10;
·减法:0-0=0,1-0=1,1-1=0,10-1=1;
·乘法:0×0=0,0×1=0,1×0=0,1×1=1;
·除法:0÷1=0,1÷1=1。
例:求(1101)2×(101)2的值。
因此,可得(1101)2×(101)2=(1000001)2
(3)十六进制。
由于二进制位数太长,不易记忆和书写,因此人们又提出了十六进制的数制。在单片机的C语言程序设计中经常用到十六进制。
十六进制按“逢十六进一”的原则进行计数,它的基数为“十六”,所使用的数码共有16个:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F。其中,A、B、C、D、E和F所代表的数的大小相当于十进制的10、11、12、13、14和15。对于任意4位的十六进制数,都可以写成如下形式:
H3H 2H 1H 0=H 3×163+H 2×162+H 1×161+H 0×160
式中,H 3、H 2、H 1、H 0称为数码;16为基数;163、162、161、160是各位数码的“位权”。
例:(120B)16=1×163+2×162+0×161+11×160=4619
2.数制间的转换
将一个数由一种数制转换成另一种数制称为数制间的转换。
(1)十进制数转换为二进制数。
十进制数转换为二进制数采用“除2取余法”,即将十进制数依次除以2,并依次记下余数,一直除到商为0,最后把全部余数按相反次序排列,就能得到二进制数。
例:把十进制数45转换为二进制数。
因此可得,45=(101101)2。
(2)二进制数转换为十进制数。
二进制数转换为十进制数采用“位权法”,即把非十进制数按位权展开,然后求和。
例:把(1011)2转换为十进制数。
(1011)2=1×23+0×22+1×21+1×20=11
(3)二进制数转换为十六进制数。
将二进制数转换为十六进制数的规则是,从右向左,每4位二进制数转化为1位十六进制数,不足部分用0补齐。
例:把(101101101101)2转换为十六进制数。
把(101101101101)2写成下面形式:
因此可得,(101101101101)2=(B6D)16。
(4)十六进制数转换为二进制数。
十六进制数转换为二进制数的方法是,从左到右将待转换的十六进制数中的每个数码依次用4位二进制数表示。
例:将十六进制数(31AB)16转化为二进制数。
将每位十六进制数写成4位二进制数,即
因此可得,(31AB)16=(0011000110101011)2。
1.2.2 单片机中数的表示方法及常用数制的对应关系
1.数的表示方法
为了便于书写,特别是方便编程时书写,规定在数字后加一个字母以表明数制。二进制后加B;十六进制后加H;十进制后面加D,其中D可以省略。
例:3BH=00111011B=59D=59。
2.常用数制的对应关系
表1-1列出了常用数制的对应关系,表中数值在单片机 C 语言程序设计中经常用到,需要熟练掌握。
表1-1 常用数制的对应关系
1.2.3 逻辑数据的表示
为了使计算机具有逻辑判断能力,就需要逻辑数据,并能对它们进行逻辑运算,得出一个逻辑式的判断结果。每个逻辑变量或逻辑运算的结果产生逻辑值,该逻辑值只能取“真”或“假”两个值。判断成立时为“真”,判断不成立时为“假”。在计算机内常用“0”和“1”表示这两个逻辑值,“0”表示假,“1”表示真。因此,在逻辑电路中,输入和输出只有两种状态,即高电平“1”和低电平“0”。
最基本的逻辑运算有逻辑“与”、逻辑“或”和逻辑“非”3种。
1.逻辑“与”
逻辑“与”也称为逻辑乘,最基本的“与”运算有两个输入量和一个输出量。图1-5给出了二极管与电阻构成的逻辑“与”电路。其中,A、B 为输入端,Y 为输出端,+5V 电压经 R1、R2分压,在E点得到+3V的电压。
图1-5 二极管与电阻构成的逻辑“与”电路
(1)逻辑“与”的实现原理。
当 A、B 两端同时输入低电平(0V)时,由于 E 点电压为3V,二极管VD1、VD2都导通,E点电压马上降到0.7V(低电平)。也就是说,当A、B两端同时输入低电平“0”时,Y端输出低电平“0”。
当 A 端输入低电平(0V),B 端输入高电平(5V)时,由于 E 点电压为3V,二极管VD1马上导通,E点电压马上降到0.7V(低电平),而二极管VD2处于截止状态。此时,Y端输出低电平“0”。
当A端输入高电平(5V),B端输入低电平(0V)时,二极管VD1截止,二极管VD2则处于导通状态,E点仍为0.7V(低电平)。此时,Y端输出低电平“0”。
当 A、B 两端同时输入高电平(5V)时,二极管 VD1、VD2都不能导通,E 点电压为3V(高电平)。此时,Y端输出高电平“1”。
由此可见,只有当输入端均为高电平时,输出端才会输出高电平;只要有一个输入端输入低电平,输出端就会输出低电平。这就是逻辑“与”运算的特点。
(2)真值表。
真值表列出电路的各种输入值和对应的输出值,可以直观地看出电路的输入与输出之间的关系。表1-2列出了逻辑“与”的真值表。
表1-2 逻辑“与”的真值表
(3)逻辑表达式与运算规则。
逻辑“与”的表达式为
Y=A·B
逻辑“与”的运算规则可总结为“有0为0,全1出1”。
2.逻辑“或”
逻辑“或”也称为逻辑加,最基本的逻辑“或”运算有两个输入量和一个输出量。它的逻辑表达式为
Y=A+B
逻辑“或”的运算规则可总结为“有1为1,全0出0”。
3.逻辑“非”
逻辑“非”即取反,它的逻辑表达式为
逻辑“非”的运算规则可总结为“1的反为0,0的反为1”。
若在一个逻辑表达式中出现多种逻辑运算,可用括号指定运算的次序;无括号时按逻辑“非”、逻辑“与”和逻辑“或”的顺序执行。
1.2.4 单片机中常用的基本术语
下面通过一个例子来说明单片机是如何表示数的。
一盏灯要么“亮”,要么“灭”,只有两种状态。如果规定灯亮为“1”,灯灭为“0”,那么一盏灯可以表示的数为0和1,共21=2个数。
两盏灯可以有“灭灭”“灭亮”“亮灭”和“亮亮”共4种状态,即“00”“01”“10”和“11”,而二进制数00、01、10和11分别相当于十进制数的0、1、2和3。所以,两盏灯可以表示的数为0、1、2和3,共22=4个数。
三盏灯的全部状态可以表示为“000”“001”“010”“011”“100”“101”“110”和“111”,所以,三盏灯可以表示的数为0、1、2、3、4、5、6和7,共23=8个数。
同理可得,八盏灯一共可以表示28=256个数。
1.位
通过前面的例子可知,一盏灯的亮/灭或电平的高/低可以代表两种状态,即“0”和“1”。实际上这就是一个二进制位。位(bit)是计算机中所能表示的最小数据单位。
2.字节
相邻的8位二进制码称为字节(Byte),用B表示。字节是一个比较小的单位,常用的还有KB和MB等,它们之间的关系如下:
1MB=1024KB=1024×1024B
3.字长
字是计算机内部进行数据处理的基本单位。它由若干位二进制码组成,通常与计算机内部的寄存器、运算器、数据总线的宽度一致。每个字所包含的位数称为字长。若干个字节定义为一个字,不同类型的单片机有不同的字长。8051内核的单片机是8位机,它的字长为8位,其内部的运算器等都是8位的,每次参加运算的二进制位也只有8位。