技术分享

当前位置:首页>文章中心>技术分享
全部 354 技术分享 334 单片机入门 20

单片机C语言教程(4)

作者:佚名   来源:网上搜集   时间:2009-10-28   访问量:1040

第四课 数据类型
  先来简单说说C语言的标识符和关键字。标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、数组等等。C语言是大小字敏感的一种高级语言,如果我们要定义一个定时器1,可以写做"Timer1",如果程序中有"TIMER1",那么这两个是完全不同定义的标识符。标识符由字符串,数字和下划线等组成,注意的是第一个字符必须是字母或下划线,如"1Timer"是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51编译器中,只支持标识符的前32位为有效标识,一般情况下也足够用了,除非你要写天书:P。
  关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。其实在KEIL uVision2的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。
  先看表4-1,表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:
07112911583520.jpg
1. char字符类型
char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。unsigned char类型用字节中所有的位来表示数值,所可以表达的数值范围是0~255。signed char类型用字节中最高位字节表示数据的符号,"0"表示正数,"1"表示负数,负数用补码表示。所能表示的数值范围是-128~+127。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。
*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。
2. int整型
int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed int类型。signed int表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。unsigned int表示的数值范围是0~65535。

好了,先停一下吧,我们来写个小程序看看unsigned char和unsigned int用于延时的不同效果,说明它们的长度是不同的,呵,尽管它并没有实际的应用意义,这里我们学习它们的用法就行。依旧用我们上一课的最小化系统做实验,不过要加多一个电阻和LED,如图4-1。实验中用D1的点亮表明正在用unsigned int数值延时,用D2点亮表明正在用unsigned char数值延时。
07112912005642.gif
图4-1 第4课实验用电路

我们把这个项目称为TwoLED,实验程序如下:
#include//预处理命令
void main(void) //主函数名
{
unsigned int a; //定义变量a为unsigned int类型
unsigned char b; //定义变量b为unsigned char类型

do
{ //do while组成循环
for (a=0; a<65535; a++)
P1_0 = 0; //65535次设P1.0口为低电平,点亮LED
P1_0 = 1; //设P1.0口为高电平,熄灭LED

for (a=0; a<30000; a++); //空循环

for (b=0; b<255; b++)
P1_1 = 0; //255次设P1.1口为低电平,点亮LED
P1_1 = 1; //设P1.1口为高电平,熄灭LED


for (a=0; a<30000; a++); //空循环
}
while(1);
}

同样编译烧写,上电运行您就可以看到结果了。很明显D1点亮的时间长于D2点亮的时间。程序中的循环延时时间并不是很好确定,并不太适合要求精确延时的场合,关于这方面我们以后也会做讨论。这里必须要讲的是,当定义一个变量为特定的数据类型时,在程序使用该变量不应使它的值超过数据类型的值域。如本例中的变量b不能赋超出0~255的值,如for (b=0; b<255; b++)改为for (b=0; b<256; b++),编译是可以通过的,但运行时就会有问题出现,就是说b的值永远都是小于256的,所以无法跳出循环执行下一句P1_1 = 1,从而造成死循环。同理a的值不应超出0~65535。大家可以烧片看看实验的运行结果,同样软件仿真也是可以看到结果的。

3. long长整型
long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signed long和无符号长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。unsigned long表示的数值范围是0~4294967295。

4. float浮点型
float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。 5.* 指针型
指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为1~3个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。

6. bit位标量
bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。

7. sfr特殊功能寄存器
sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
*AT89C51的特殊功能寄存器表请看附录二

8.sfr16 16位特殊功能寄存器
sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。

9. sbit可录址位
sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了
sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义
sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚
//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;
这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。

  关于数据类型转换等相关操作在后面的课程或程序实例中将有所提及。大家可以用所讲到的数据类型改写一下这课的实例程序,加深对各类型的认识。

附录一 C51中的关键字

关键字用 途说 明
auto存储种类说明用以说明局部变量,缺省值为此
break程序语句退出最内层循环
case程序语句Switch语句中的选择项
char数据类型说明单字节整型数或字符型数据
const存储类型说明在程序执行过程中不可更改的常量值
continue程序语句转向下一次循环
default程序语句Switch语句中的失败选择项
do程序语句构成 do..while 循环结构
double数据类型说明双精度浮点数
else程序语句构成 if..else 选择结构
enum数据类型说明枚举
extern存储种类说明在其他程序模块中说明了的全局变量
flost数据类型说明单精度浮点数
for程序语句构成 for循环结构
goto程序语句构成 goto 转移结构
if程序语句构成 if..else 选择结构
int数据类型说明基本整型数
long数据类型说明长整型数
register存储种类说明使用 CPU内部寄存的变量
return程序语句函数返回
short数据类型说明短整型数
signed数据类型说明有符号数,二进制数据的最高位为符号位
sizeof运算符计算表达式或数据类型的字节数
static存储种类说明静态变量
struct数据类型说明结构类型数据
swicth程序语句构成 switch选择结构
typedef数据类型说明重新进行数据类型定义
union数据类型说明联合类型数据
unsigned数据类型说明无符号数数据
void数据类型说明无类型数据
volatile数据类型说明该变量在程序执行中可被隐含地改变
while程序语句构成 while和do..while循环结构
附表1-1 ANSIC标准关键字
关键字用 途说 明
bit位标量声明声明一个位标量或位类型的函数
sbit位标量声明声明一个可位寻址变量
Sfr特殊功能寄存器声明声明一个特殊功能寄存器
Sfr16特殊功能寄存器声明声明一个 16位的特殊功能寄存器
data存储器类型说明直接寻址的内部数据存储器
bdata存储器类型说明可位寻址的内部数据存储器
idata存储器类型说明间接寻址的内部数据存储器
pdata存储器类型说明分页寻址的外部数据存储器
xdata存储器类型说明外部数据存储器
code存储器类型说明程序存储器
interrupt中断函数说明定义一个中断函数
reentrant再入函数说明定义一个再入函数
using寄存器组定义定义芯片的工作寄存器
附表1-2 C51编译器的扩展关键字


附录二 AT89C51特殊功能寄存器列表(适用于同一架构的芯片)
符 号地 址注 释
*ACCE0H累加器
*BF0H乘法寄存器
*PSWD0H程序状态字
SP81H堆栈指针
DPL82H数据存储器指针低 8位
DPH83H数据存储器指针高 8位
*IEA8H中断允许控制器
*IPD8H中断优先控制器
*P080H端口 0
*P190H端口 1
*P2A0H端口 2
*P3B0H端口 3
PCON87H电源控制及波特率选择
*SCON98H串行口控制器
SBUF99H串行数据缓冲器
*TCON88H定时器控制
TMOD89H定时器方式选择
TL08AH定时器 0低8位
TL18BH定时器 1低8位
TH08CH定时器 0低8位
TH18DH定时器 1高8位
带*号的特殊功能寄存器都是可以位寻址的寄存器

上一篇:单片机C语言教程(5)

下一篇:单片机C语言教程(3)

发表评论:

评论记录:

未查询到任何数据!

在线咨询

点击这里给我发消息 咨询专员

在线咨询

咨询电话

18906103328

电话咨询

微信扫一扫

微信联系
返回顶部