51单片机应用开发---二进制、十六进制与单片机寄存器之间的关系(跑马灯实例)

实现目标

1、掌握二进制与十六进制之间的转换

2、掌握单片机寄存器与二进制、十六进制之间的转换


一、二进制与十六进制之间的转换

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寄存器
  P27P26  P25P24  P23P22  P21P20
    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(高电平),如下表格所示:

  P27P26  P25P24  P23P22  P21P20
00001111

P2 = 0x0f;       //  0000   1111   0X0f    LED5-LED8 亮,LED1-LED4灭

3.跑马灯实例

3.1 管脚、寄存器、LED状态对照表

跑马灯原理分析
LED灯LED8LED7LED6LED5LED4LED3LED2LED1P2寄存器值
对应管脚  P27P26  P25P24  P23P22  P21P20
灯状态1111111100xfe
延时500ms
灯状态2111111010xfd
延时500ms
灯状态3111110110xfb
延时500ms
灯状态4111101110xf7
延时500ms
灯状态5111011110xef
延时500ms
灯状态6110111110xdf
延时500ms
灯状态7101111110xbf
延时500ms
灯状态8011111110x7f
延时500ms
灯状态9111111110xff
延时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();  
	}
 }
 

总结

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值