ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
【14.1 为什么要二进制?】 为什么要二进制?我们日常生活明明是十进制的,为何数字电子领域偏要选择二进制?这是由数字硬件电路决定的。人有十个手指头,人可以直接发出十种不同声音来命名0,1,2,3...9这些数字,人可以直接用眼睛识别出十种不同状态的信息,但是数字底层基础硬件电路要直接处理和识别十种状态却很难,相对来说,处理和识别两种状态就轻松多了,所以选择二进制。比如,一颗LED灯的亮或灭,一个IO口的输出高电平或低电平,识别某一个点的电压是高电平或低电平,只需要三极管等基础元器件就可把硬件处理电路搭建起来,二进制广泛应用在数字电路的存储,通讯和运算等领域,想学好单片机就必须掌握它。 【14.2 二进制如何表示成千上万的大数值?】 二进制如何表示成千上万的数值?现在用LED灯的亮和灭来跟大家讲解。 (1)1个LED灯: 灭 第0种状态 亮 第1种状态 合计:共2种状态。 (2)2个LED灯挨着: 灭灭 第0种状态 灭亮 第1种状态 亮灭 第2种状态 亮亮 第3种状态 合计:共4种状态。 (3)3个LED灯挨着: 灭灭灭 第0种状态 灭灭亮 第1种状态 灭亮灭 第2种状态 灭亮亮 第3种状态 亮灭灭 第4种状态 亮灭亮 第5种状态 亮亮灭 第6种状态 亮亮亮 第7种状态 合计:共8种状态。 (4)8个LED灯挨着: 灭灭灭灭灭灭灭灭 第0种状态 灭灭灭灭灭灭灭亮 第1种状态 ...... 第N种状态 亮亮亮亮亮亮亮灭 第254种状态 亮亮亮亮亮亮亮亮 第255种状态 合计:共256种状态。 (5)16个LED灯挨着: 灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态 灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态 ...... 第N种状态 亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第65534种状态 亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第65535种状态 合计:共65536种状态。 (6)32个LED灯挨着: 灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态 灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态 ...... 第N种状态 亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第4294967294种状态 亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第4294967295种状态 合计:共4294967296种状态。 结论: 连续挨着的LED灯越多,能表达的数值范围就越大。 【14.3 什么是位?】 什么是位?以上一个LED灯就代表1位,8个LED灯就代表8位。位的英文名是用bit来表示。一个变量的位数越大就意味着这个变量的取值范围越大。一个单片机的位数越大,就说明这个单片机一次处理的数据范围就越大,意味着运算和处理速度就越快。我们日常所说的8位单片机,32位单片机,就是这个位的概念。为什么32位的单片机比8位单片机的处理和运算能力强,就是这个原因。 【14.4 什么是字节?】 什么是字节?字节是计算机很重要的一个基本单位,一个字节有8位。8个LED灯挨着能代表多少种状态,就意味着一个字节的数据范围有多大。从上面举的例子中,我们知道8个LED灯挨着,能表示从0到255种状态,所以一个字节的取值范围就是从0到255。 【14.5 三种常用变量的取值范围是什么?】 前面章节曾提到三种常用的变量:unsigned char,unsigned int ,unsigned long。现在有了二进制和字节的基础知识,就可以跟大家讲讲这三种变量的取值范围,而且很重要,这是我们写单片机程序必备的概念。 unsigned char的变量占用1个字节RAM,共8位,根据前面LED灯的例子,取值范围是从0到255。 unsigned int的变量占用2个字节RAM,共16位,根据前面LED灯的例子,取值范围是从0到65535。多说一句,对于51内核的单片机,unsigned int的变量是占用2个字节。如果是在32位的STM32单片机,unsigned int的变量是占用4个字节的,所以不同的单片机不同的编译器是会有一些差异的。 unsigned long的变量占用4个字节RAM,共32位,根据前面LED灯的例子,取值范围是从0到4294967295。 【14.6 例程练习和分析。】 现在我们编写一个程序来验证unsigned char,unsigned int,unsigned long的取值范围。 定义两个unsigned char变量a和b,a赋值255,b赋值256,255和256恰好处于unsigned char的取值边界。 再定义两个unsigned int变量c和d,c赋值65535,d赋值65536,65535和65536恰好处于unsigned int的取值边界。 最后定义两个unsigned long变量e和f,e赋值4294967295,f赋值4294967296,4294967295和4294967296恰好处于unsigned long的取值边界。 程序代码如下: /\*---C语言学习区域的开始。-----------------------------------------------\*/ void main() //主函数 { unsigned char a; //定义一个变量a,并且分配了1个字节的RAM空间。 unsigned char b; //定义一个变量b,并且分配了1个字节的RAM空间。 unsigned int c; //定义一个变量c,并且分配了2个字节的RAM空间。 unsigned int d; //定义一个变量d,并且分配了2个字节的RAM空间。 unsigned long e; //定义一个变量e,并且分配了4个字节的RAM空间。 unsigned long f; //定义一个变量f,并且分配了4个字节的RAM空间。 a=255; //把255赋值给变量a,a此时会是什么数?会超范围溢出吗? b=256; //把256赋值给变量b,b此时会是什么数?会超范围溢出吗? c=65535; //把65535赋值给变量c,c此时会是什么数?会超范围溢出吗? d=65536; //把65536赋值给变量d,d此时会是什么数?会超范围溢出吗? e=4294967295; //把4294967295赋值给变量e,e此时会是什么数?会超范围溢出吗? f=4294967296; //把4294967296赋值给变量f,f此时会是什么数?会超范围溢出吗? View(a); //把第1个数a发送到电脑端的串口助手软件上观察。 View(b); //把第2个数b发送到电脑端的串口助手软件上观察。 View(c); //把第3个数c发送到电脑端的串口助手软件上观察。 View(d); //把第4个数d发送到电脑端的串口助手软件上观察。 View(e); //把第5个数e发送到电脑端的串口助手软件上观察。 View(f); //把第6个数f发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:255 十六进制:FF 二进制:11111111 第2个数 十进制:0 十六进制:0 二进制:0 第3个数 十进制:65535 十六进制:FFFF 二进制:1111111111111111 第4个数 十进制:0 十六进制:0 二进制:0 第5个数 十进制:4294967295 十六进制:FFFFFFFF 二进制:11111111111111111111111111111111 第6个数 十进制:0 十六进制:0 二进制:0 分析: 通过实验结果,我们知道unsigned char变量最大能取值到255,如果非要赋值256就会超出范围溢出后变成了0。unsigned int变量最大能取值到65535,如果非要赋值65536就会超出范围溢出后变成了0。unsigned long变量最大能取值到4294967295,如果非要赋值4294967296就会超出范围溢出后变成了0。 【14.7 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。