实现目标
1、掌握二进制与十六进制之间的转换
2、掌握单片机寄存器与二进制、十六进制之间的转换
3、掌握单片机驱动跑马灯、流水灯的原理
一、二进制与十六进制之间的转换
1、二进制
二进制(binary), 是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。
2、十六进制
十六进制(简写为hex或下标16)是一种基数为16的计数系统,是一种逢16进1的进位制。通常用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中:A~F表示10~15,这些称作十六进制数字。单片机开发中用0x或0X 表示。
3.常用四种进制对照表
4.二进制转十六进制的转换方法
对一个多位二进制数,可先取出其后四位,转为一位十六进制数。对剩下的部分以同样方法进行转换,直到该串只剩下最后四位,就转换完毕。若是最后串的长度不足四位且不为零时,在串的前面加‘0’补齐位数,再进行转换,如图所示:
实例1:
二进制: 0101 0011
十六进制: 5 3
如上图二进制0101转换到十六进制后为5,为什么是5呢?这个时候就用到8421法则了,详细如下:
0 1 0 1 0 0 1 1
x x x x x x x x
8 4 2 1 8 4 2 1
= = = = = = = =
0 4 0 1 0 0 2 1
0+4+0+1 = 5 0+0+2+1 = 3
注:图中的”x“代表乘法的乘号
由上图计算可得知:
二进制0101转换到十六进制后为5,二进制0011转换到十六进制后为3
额外的知识点:四个二进制的数 = 一位的十六进制的数
5.十六进制转二进制的转换方法
十六进制: B 7
二进制: 1011 0111
用到8421法则,详细如下:
B 7
11 7
8+2+1 4+ 2+1
1 0 1 1 0 1 1 1
由上图计算可得知:
十六进制B转换二进制 1011,十六进制7转换二进制0111
额外的知识点: 一位的十六进制的数 = 四个二进制的数
二、单片机寄存器与二进制十六进制的关系
1.单片机P2寄存器与管脚
P2寄存器 | |||||||
P27 | P26 | P25 | P24 | P23 | P22 | P21 | P20 |
1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 |
2.P2操作实例
由上面原理图可知,单片机管脚输出低电平时,LED点亮。现在要让LED5-LED8 亮,LED1-LED4灭,可将要点亮的管脚置0(低电平),灭的管脚置1(高电平),如下表格所示:
P27 | P26 | P25 | P24 | P23 | P22 | P21 | P20 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
P2 = 0x0f; // 0000 1111 0X0f LED5-LED8 亮,LED1-LED4灭
3.跑马灯实例
3.1 管脚、寄存器、LED状态对照表
跑马灯原理分析 | |||||||||
LED灯 | LED8 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | P2寄存器值 |
对应管脚 | P27 | P26 | P25 | P24 | P23 | P22 | P21 | P20 | |
灯状态1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0xfe |
延时500ms | |||||||||
灯状态2 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0xfd |
延时500ms | |||||||||
灯状态3 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0xfb |
延时500ms | |||||||||
灯状态4 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0xf7 |
延时500ms | |||||||||
灯状态5 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0xef |
延时500ms | |||||||||
灯状态6 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0xdf |
延时500ms | |||||||||
灯状态7 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0xbf |
延时500ms | |||||||||
灯状态8 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0x7f |
延时500ms | |||||||||
灯状态9 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0xff |
延时500ms |
3.2 对应程序
(1)延时函数软件自动生成
(2)跑马灯操作程序
while(1)
{
P2 = 0xfe; //LED1亮
Delay500ms();
P2 = 0xfd; //LED2亮
Delay500ms();
P2 = 0xfb; //LED3亮
Delay500ms();
P2 = 0xf7; //LED4亮
Delay500ms();
P2 = 0xef; //LED5亮
Delay500ms();
P2 = 0xdf; //LED6亮
Delay500ms();
P2 = 0xbf; //LED7亮
Delay500ms();
P2 = 0x7f; //LED8亮
Delay500ms();P2 = 0xff; //关闭8个LED
Delay500ms();
}
(3)完整代码
#include <REGX52.H>sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}void main(){ while(1){P2 = 0xfe; //LED1亮Delay500ms(); P2 = 0xfd; //LED2亮-Delay500ms(); P2 = 0xfb; //LED3亮Delay500ms(); P2 = 0xf7; //LED4亮Delay500ms(); P2 = 0xef; //LED5亮Delay500ms(); P2 = 0xdf; //LED6亮Delay500ms(); P2 = 0xbf; //LED7亮Delay500ms(); P2 = 0x7f; //LED8亮Delay500ms(); P2 = 0xff; //关闭8个LEDDelay500ms(); }}
4.流水灯实例
4.1 管脚、寄存器、LED状态对照表
流水灯原理分析 | |||||||||
LED灯 | LED8 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | P2寄存器值 |
对应管脚 | P27 | P26 | P25 | P24 | P23 | P22 | P21 | P20 | |
灯状态1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0xfe |
延时500ms | |||||||||
灯状态2 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0xfc |
延时500ms | |||||||||
灯状态3 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0xf8 |
延时500ms | |||||||||
灯状态4 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0xf0 |
延时500ms | |||||||||
灯状态5 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0xe0 |
延时500ms | |||||||||
灯状态6 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0xc0 |
延时500ms | |||||||||
灯状态7 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x80 |
延时500ms | |||||||||
灯状态8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x00 |
延时500ms | |||||||||
灯状态9 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0xff |
延时500ms |
4.2 流水灯程序
#include <REGX52.H>sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}void main(){ while(1){P2 = 0xfe; //LED1亮Delay500ms(); P2 = 0xfc; //LED1亮,LED2亮-Delay500ms(); P2 = 0xf8; //LED1亮,LED2亮-,LED3亮Delay500ms(); P2 = 0xf0; //LED1亮,LED2亮-,LED3亮,LED4亮Delay500ms(); P2 = 0xe0; //LED1亮,LED2亮-,LED3亮,LED4亮,LED5亮Delay500ms(); P2 = 0xc0; //LED1亮,LED2亮-,LED3亮,LED4亮,LED5亮,LED6亮Delay500ms(); P2 = 0x80; //LED1亮,LED2亮-,LED3亮,LED4亮,LED5亮,LED6亮,LED7亮Delay500ms(); P2 = 0x00; //全亮Delay500ms(); P2 = 0xff; //关闭8个LEDDelay500ms(); }}