理论教育 字符型数据:PIC单片机常用模块与实例介绍

字符型数据:PIC单片机常用模块与实例介绍

时间:2023-10-19 理论教育 版权反馈
【摘要】:字符型数据在存储器中一般占用一个字节的存储空间,是单片机中最常用的数据类型。字符型数据包括字符常量和字符变量,下面分别介绍。例如,下一行列出的每个量都是合法的字符常量。对于无符号字符型而言,由于占用了一个字节,即用8位二进制表示一个数字,所以其能表示的数的范围是0~255。

字符型数据:PIC单片机常用模块与实例介绍

字符型数据在存储器中一般占用一个字节的存储空间,是单片机中最常用的数据类型。字符型数据包括字符常量和字符变量,下面分别介绍。

1.字符常量

字符常量是用英文单引号括起来的一个ASCII字符。这里分别解释字符和ASCII的概念。

字符就是显示在计算机屏幕上的一个个小方块文字或符号,相当于自然界中文字的概念。读者现在看到的段落内容就是用中文字符录入的。

不同国家的语言有不同的字符集,如中文字符的集合、英文字符的集合。在C语言中常用的字符集是英文字符集合,此字符集合由美国标准化组织委员会制定,称为ASCII表。在ASCII表中,给每个英文字母、标点、符号都安排了一个唯一序号,这个序号称为ASCII码。标准ASCII码长度为7位进制数,扩充的ASCII码长度为8位二进制数。

例如,下一行列出的每个量都是合法的字符常量。

978-7-111-33274-9-Chapter04-20.jpg

下一行列出的每个量都不是合法的字符常量。

978-7-111-33274-9-Chapter04-21.jpg

在上一行中的'好'为什么不是合法的字符常量呢?因为'好'是中文,不属于ASCII码,在C语言中字符常量必须是ASCII字符。

在C语言中,字符常量有以下特点。

●字符常量只能用英文单引号括起来,不能用双引号或其他符号。

●字符常量只能是一个字符,不能是多个字符。

●字符常量在计算机中是以ASCII码值存储的。

下面通过程序运行效果来验证字符常量在计算机中是以ASCII码值存储的。

【例4-3】编程实现把字符常量'A'送到D口输出,所用硬件电路图为图4-1。

设计过程

1)修改S041项目中的main.c的内容,改为如下所示。

978-7-111-33274-9-Chapter04-22.jpg

978-7-111-33274-9-Chapter04-23.jpg

2)修改完毕后按快捷键F10编译出S041.cof,然后启动“Proteus VSM”,运行程序。

读者会发现8只LED只有VT0和VT6亮了,其他的都灭了,这是为什么呢?原因就是'A'的ASCII码值是65,转换成二进制是01000001,当把'A'赋值给PORTD时实际上是把'A'的ASCII值赋值给了PORTD,所以PORTD的内容变为二进制的01000001,导致只有RD0和RD6输出高电平,VT0和VT6就亮了;其他输出低电平,所以其他的LED就灭了。

2.字符变量

C语言变量定义的一般形式为

978-7-111-33274-9-Chapter04-24.jpg

在书写变量定义时,应注意以下几点。(www.daowen.com)

●允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。

●最后一个变量名之后必须以“;”结尾。

●变量定义必须放在变量使用之前,一般紧跟函数开始符号“{”的后边。

字符变量占用一个字节(8位二进制)的存储空间来保存一个数据,可用来存储字符常量或数字,字符变量的类型说明符有两种unsignedchar(无符号字符型)和signed char(有符号字符型)。对于声明unsignedchar类型时unsigned可以省略,即只写char。例如:

978-7-111-33274-9-Chapter04-25.jpg

无符号字符型与有符号字符型都是用一个字节即8位二进制数表示的,两者的区别在于无符号字符型的最高位代表的就是数值,而有符号字符型二进制形式的最高位被编译器当做符号位处理,符号位为1时表示为负数,为0时表示为正数。

对于无符号字符型而言,由于占用了一个字节,即用8位二进制表示一个数字,所以其能表示的数的范围是0~255。

对于有符号字符型而言,也是用一个字节即8位二进制表示一个数字,但由于其二进制最高位用于表示符号位,所以能表示的有效数据位只有7位,即它的表示范围是-128~127(注意负数在内存中是以补码形式存放的)。

可以把一个数字或一个字符常量赋值给一个字符变量。例如:

978-7-111-33274-9-Chapter04-26.jpg

实际在Data中存放的是'U'的ASCII码85的二进制形式,ID中存放的是数字128的二进制形式。下面给出其二进制形式。

Data:

978-7-111-33274-9-Chapter04-27.jpg

ID:

978-7-111-33274-9-Chapter04-28.jpg

读者可能会对ID的内容感到很奇怪,不是说signedchar能表示数的范围是-128~127吗?那么128不是超出其表示范围了吗?为什么128还存进去了呢?这里读者要注意,C语言编译器在编译时就是把128转换成二进制形式,然后放到ID这个字符存储单元中,不做任何转换。但是在程序中使用时会根据变量的类型决定其值。例如,此时要使用ID时,signedchar变量ID的真值就应该是-128(由于ID变量内存中内容的最高位为1,说明这是一个负数,负数在计算机中是以补码形式存放的,所以要得到其真值,需要对补码除符号位外取反后符号位外加“-”,这样就得到了真值-128)。

在C程序中使用变量时,要求先定义后使用,一般要求在函数内部开始处进行定义,然后就可以在函数结束前任意使用了。

【例4-4】编程实现对字符变量Data依次赋值为0和'U',然后送D口输出,所用硬件电路图为图4-1。

设计过程

1)修改S041项目中的main.c的内容,改为如下所示。

978-7-111-33274-9-Chapter04-29.jpg

2)保存并运行程序。

运行效果分析

运行结果:PORTD的内容是0b01010101(根据LED的状态可知),而不是0b00000000,这是因为在C语言中多条语句之间的执行顺序是从上到下,从左到右的,Data虽然被赋值了两次,但Data='U'在Data=0之后,所以在执行PORTD=Data时Data的值是'U'而不是0,这样PORTD的值就是'U'的ASCII码,即二进制的01010101。

对于赋值语句,C语言都是从上往下依次执行的,对于同一变量而言,后执行的赋值语句会冲掉前面的赋值结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈