本帖最后由 吴坚鸿 于 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年左右《从单片机基础到程序框架》的新书就可以出版了。
感谢各位朋友的支持。
【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 例程练习和分析。】
现在我们编写一个程序来观察十六进制和二进制的关系。
程序代码如下:
- /*---C语言学习区域的开始。-----------------------------------------------*/
- void main() //主函数
- {
- unsigned char a; //定义一个变量a,并且分配了1个字节的RAM空间。
- unsigned char b; //定义一个变量b,并且分配了1个字节的RAM空间。
- unsigned char c; //定义一个变量c,并且分配了1个字节的RAM空间。
- unsigned char d; //定义一个变量d,并且分配了1个字节的RAM空间。
- a=0x06; //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
- b=0x0A; //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
- c=0x0e; //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
- d=0x2C; //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
- View(a); //把第1个数a发送到电脑端的串口助手软件上观察。
- View(b); //把第2个数b发送到电脑端的串口助手软件上观察。
- View(c); //把第3个数c发送到电脑端的串口助手软件上观察。
- View(d); //把第4个数d发送到电脑端的串口助手软件上观察。
- while(1)
- {
- }
- }
- /*---C语言学习区域的结束。-----------------------------------------------*/
复制代码在电脑串口助手软件上观察到的程序执行现象如下:
- 开始...
- 第1个数
- 十进制:6
- 十六进制:6
- 二进制:110
- 第2个数
- 十进制:10
- 十六进制:A
- 二进制:1010
- 第3个数
- 十进制:14
- 十六进制:E
- 二进制:1110
- 第4个数
- 十进制:44
- 十六进制:2C
- 二进制:101100
复制代码分析:
通过实验结果,我们知道二进制与十六进制的转换关系确实非常清晰简单,所以十六进制也可以看作是二进制的缩写。
【15.6 如何在单片机上练习本章节C语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。
一周热门 更多>