在设计英文或数字等字符(字符串)显示程序或串口收发信息等程序时,必须熟悉标准的ASCII编码表。ASCII编码(0x00~0x7F)如表1-12所示。由表1-12可知:
· 数字字符'0'~'9'的ASCII编码为0x30~0x39,与数字0~9的ASCII编码差值为0x30。两者在相互转换时可相0x30或者直接或'0'。
· 英文字符'A'~'Z'、'a'~'z'的ASCII编码为0x41~0x5A、0x61~0x7A。英文字符在大小写转换时可大0x20(因为0x61-0x41=0x20)。
· 字符串结束标识符'\0'的ASCII编码为0x00,即NUL或NULL(非打印字符)。
· 常用的空格字符(SP/SPACE)的ASCII编码为0x20。
· 在向串口发送字符串时,常以回车符/换行符(CR/LF)为结束标志,回车符/换行符的ASCII编码分别为0x0D、0x0A。
· 表1-12中前两行所列出的其他特殊控制字符(Control Characters)虽然多数已被废止,但有部分控制字符名称仍应用于某些现代产品设计。
表1-12 ASCII编码(0x00~0x7F)
例如,某种射频读卡器(RFID)模块所设计的链路层协议以STX、ETX(文本起始符/结束符)作为数据帧的起始标识符,不过该厂商将STX与ETX的编码定义为0x82与0x83。另外,表1-12中的应答与非应答字符(ACK/NAK/NACK),其概念仍应用于全书所有有关I 2 C器件的程序设计,所不同的是I 2 C协议中的应答与非应答仅仅是一个脉冲位(0/1),而不再是一个字节编码。
在实际应用过程中,如果临时要查询某些字符编码,包括中文字符编码,可先用记事本(NotePad)输入字符内容,然后用超级编辑器(UltraEdit)打开,切换到十六进制模式查看字符编码。
用NotePad与UltraEdit获取字符编码如图1-15所示。从图1-15中可以看到,用NotePad输入的字符(包括中文字符)以及在UltraEdit中查看的十六进制字符编码的效果。UltraEdit不仅显示了所输入英文数字等字符的ASCII编码(小于0x80),而且显示了所输入汉字的内码。例如,“8051单片机C语言程序设计”的编码为“ 38 30 35 31 B5 A5 C6 AC BB FA 43 D3 EF D1 D4 B3 CC D0 F2 C9 E8 BC C6”。在图1-15的标底色编码部分,除“ 38 30 35 31 ”与“ 43 ”为数字与英文半角字符“8、0、5、1、C”的编码以外,其他编码全部大于或等于0xA0,且每两字节(汉字内码)表示一个汉字。8051单片机虽然支持在源程序中直接使用中文字符串或中英文混合字符串,且偶尔会编译正常通过,但实际运行时却会出现异常的情况,此时可考虑将中文字符串以编码(汉字内码)的方式提供。
图1-15 用NotePad与UltraEdit获取字符编码