揭秘单片机开发:二进制与十六进制与单片机寄存器关系解析(跑马灯、流水灯实战应用)

实现目标

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个LED
		Delay500ms();  
	}
 }
 

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个LED
		Delay500ms();  
	}
 }
 

总结

作者:面包板扎

物联沃分享整理
物联沃-IOTWORD物联网 » 揭秘单片机开发:二进制与十六进制与单片机寄存器关系解析(跑马灯、流水灯实战应用)

发表回复