从单片机基础到程序框架(连载)

2020-01-12 17:12发布

本帖最后由 吴坚鸿 于 2016-1-17 11:32 编辑

前言:
前言_pdf文件.pdf (30.44 KB, 下载次数: 729) 2016-1-17 11:30 上传 点击文件名下载附件

      大家好,我叫吴坚鸿,以前一直想写两本书,一本讲单片机入门基础,一本讲单片机程序框架。现在发现,单片机基础和程序框架并没有明显的分水岭,基础中有框架,框架中有基础,应该合二为一,读起来才会连贯舒畅。所以我决定中止当前已写到55节的《从业十年,教你单片机入门基础》连载帖,新开此连载帖。
      再提一下我2014年写的《从业将近十年,手把手教你单片机程序框架》,一方面受到很多网友的好评,另一方面也有一些热心网友提出了宝贵的意见,我今天看来,确实还有一些可待改进的地方。本来计划在2017年重写《……单片机程序框架》那个老帖,现在看来不用那么折腾了,只要把《……单片机程序框架》的内容也整合到此新帖里就可以了,这样对我也比较省事。我的时间计划是,先花4年时间写一个初稿,然后再花2年时间重写一次,最后再花1年时间整理成书,整个过程大概7年时间左右,今年是2016年,估计到2023年左右《从单片机基础到程序框架》的新书就可以出版了。
      感谢各位朋友的支持。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
98条回答
mikeliujia
1楼-- · 2020-01-24 17:58
第十五节:二进制与十六进制。
第十五节_pdf文件.pdf (75.46 KB, 下载次数: 123) 2016-4-23 10:52 上传 点击文件名下载附件

【15.1   十六进制是二进制的缩写。】

       在我的印象中,C51编译器好像并不支持二进制的书写格式,即使它能支持二进制的书写格式,二进制的书写还是有个弊端,就是数字太多太长了,写起来非常费劲不方便,怎么办?解决办法就是用十六进制。十六进制是二进制的缩写,之所以称它为二进制的缩写,是因为它们的转换关系非常简单直观,不需要借助计算器即可相互转换。

【15.2   何谓十六进制?】

       何谓十六进制?欲搞清楚这个问题,还得先从十进制说起。所谓十进制,就是用一位字符可以表示从0到9这十个数字。所谓二进制,就是用一位字符可以表示从0到1这二个数字。所谓十六进制,当然也就是用一位字符可以表示从0到15这十六个数字。但是十六进制马上就会面临一个问题,十六进制的10到15这6个数其实是有两位字符组成的,并不是一位呀?于是C语言用这些字符A,B,C,D,E,F分别替代10,11,12,13,14,15这6个数,10前面的0到9还是跟十进制的字符一致。A,B,C,D,E,F也可以用小写a,b,c,d,e,f来替代,在数值上不区分大小写,比如十六进制的a与A都是表示十进制的10。

【15.3   二进制与十六进制是如何转换的?】

       前面提到了十六进制是二进制的缩写,它们的转换关系非常简单直观,每1位十六进制的字符,对应4位二进制的字符。关系如下:

    十进制       二进制      十六进制
    0            0000        0
    1            0001        1
    2            0010        2
    3            0011        3
    4            0100        4
    5            0101        5
    6            0110        6
    7            0111        7
    8            1000        8
    9            1001        9
    10           1010        A
    11           1011        B
    12           1100        C
    13           1101        D
    14           1110        E
    15           1111        F

       二进制转换成十六进制的时候,如果不是4位的倍数,则最左边高位默认补上0凑合成4位的倍数。比如一个二进制的数101001,可以在左边补上2个0变成00101001,然后把每4位字符转成1个十六进制的字符。左边高4位0010对应十六进制的2,右边低4位1001对应十六进制的9,所以二进制的101001合起来最终转换成十六进制的数是29(实际上正确的写法是0x29,为什么?请继续往下看。)。

【15.4   十六进制数的标准书写格式是什么样子的?】

       十六进制的标准书写格式是什么样子的?实际上,十六进制29并不能直接写成29,否则就跟十进制的写法混淆了。为了把十六进制和十进制的书写格式进行区分,C语言规定凡是十六进制必须加一个数字0和一个字母x作为前缀,也就是十六进制必须以0x作为前缀,所以刚才的十六进制29就应该写成0x29,否则,如果直接写29编译器会认为是十进制的29,而十进制的29转换成十六进制是0x1D(十进制与十六进制之间如何转换在后面章节会讲到),0x29与0x1D可见差别很大的,凡是不加前缀的都会被默认为十进制。 多说一句,在C语言程序里,对于同样一个数值,既可以用十六进制,也可以用十进制,比如:d=0x2C与d=44的含义是一样的,因为十六进制的0x2C和十进制的44最终都会被C51编译器翻译成二进制00101100,是表示同样大小的数值。

【15.5   例程练习和分析。】

       现在我们编写一个程序来观察十六进制和二进制的关系。
       程序代码如下:

  1. /*---C语言学习区域的开始。-----------------------------------------------*/

  2. void main() //主函数
  3. {
  4.         unsigned char a;    //定义一个变量a,并且分配了1个字节的RAM空间。
  5.         unsigned char b;    //定义一个变量b,并且分配了1个字节的RAM空间。
  6.         unsigned char c;    //定义一个变量c,并且分配了1个字节的RAM空间。
  7.         unsigned char d;    //定义一个变量d,并且分配了1个字节的RAM空间。

  8.         a=0x06;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  9.         b=0x0A;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  10.         c=0x0e;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  11.         d=0x2C;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。

  12.         View(a);   //把第1个数a发送到电脑端的串口助手软件上观察。
  13.     View(b);   //把第2个数b发送到电脑端的串口助手软件上观察。
  14.         View(c);   //把第3个数c发送到电脑端的串口助手软件上观察。
  15.     View(d);   //把第4个数d发送到电脑端的串口助手软件上观察。

  16.     while(1)  
  17.     {
  18.     }
  19. }

  20. /*---C语言学习区域的结束。-----------------------------------------------*/
复制代码

       在电脑串口助手软件上观察到的程序执行现象如下:

  1. 开始...

  2. 第1个数
  3. 十进制:6
  4. 十六进制:6
  5. 二进制:110

  6. 第2个数
  7. 十进制:10
  8. 十六进制:A
  9. 二进制:1010

  10. 第3个数
  11. 十进制:14
  12. 十六进制:E
  13. 二进制:1110

  14. 第4个数
  15. 十进制:44
  16. 十六进制:2C
  17. 二进制:101100
复制代码
分析:        
       通过实验结果,我们知道二进制与十六进制的转换关系确实非常清晰简单,所以十六进制也可以看作是二进制的缩写。

【15.6   如何在单片机上练习本章节C语言程序?】

       直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。
吴坚鸿
2楼-- · 2020-01-24 18:55
 精彩回答 2  元偷偷看……

一周热门 更多>