当前位置: 首页 > news >正文

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

实现目标

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寄存器
  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个LEDDelay500ms();  }}

4.流水灯实例

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

流水灯原理分析
LED灯LED8LED7LED6LED5LED4LED3LED2LED1P2寄存器值
对应管脚  P27P26  P25P24  P23P22  P21P20
灯状态1111111100xfe
延时500ms
灯状态2111111000xfc
延时500ms
灯状态3111110000xf8
延时500ms
灯状态4111100000xf0
延时500ms
灯状态5111000000xe0
延时500ms
灯状态6110000000xc0
延时500ms
灯状态7100000000x80
延时500ms
灯状态8000000000x00
延时500ms
灯状态9111111110xff
延时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();  }}

总结

http://www.lryc.cn/news/439098.html

相关文章:

  • 信息安全工程师(6)网络信息安全现状与问题
  • 亚数TrustAsia亮相第十四届智慧城市与智能经济博览会,入围“2024数据要素创新应用优秀成果”!
  • Linux基础开发环境(git的使用)
  • VS Code终端命令执行后老是出现 __vsc_prompt_cmd_original: command not found
  • 春天(Spring Spring Boot)
  • Oracle EBS AP预付款行分配行剩余预付金额数据修复
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战7-ArkTS语法进阶
  • Java设计模式—面向对象设计原则(六) ----->合成复用原则(CRP) (完整详解,附有代码+案例)
  • java坏境搭建
  • C#中判断socket是否已断开的方法
  • Python编程 - 异常处理与文件读写
  • 【C++】c++ 11
  • uni-app 应用名称 跟随系统语言 改变
  • 【大模型实战篇】高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍
  • 使用Python和Proxy302代理IP高效采集Bing图片
  • Python酷库之旅-第三方库Pandas(118)
  • 讨论人机交互研究中大语言模型的整合与伦理问题
  • OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用
  • GitLab CI_CD 从入门到实战笔记
  • 微服务实战系列之玩转Docker(十五)
  • 本地调试spark,访问kerberos鉴权的hdfs、hive
  • Ubuntu 安装包下载(以20版本 阿里镜像站为例子)
  • 会声会影Corel VideoStudio2025旗舰版最新中文旗舰版新功能讲解及使用会声会影使用教程
  • 【人工智能】OpenAI发布GPT-o1模型:推理能力的革命性突破,这将再次刷新编程领域的格局!
  • 2024年TCGA基因表达数据下载(最新版)
  • 1. 运动控制指令概要(omron 机器自动化控制器)
  • 依赖注入(Dependency Injection)
  • PHP环境搭建
  • 小叶OJ 2716: 过河问题 ← 贪心算法
  • LeetCode509:斐波那契数列