一、C语言简介:
1、C语言是在70年代初问世的。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。
二、C51数据类型:
1、C数据类型有四类:基本类型,构造类型,指针类型,空类型void
(1)基本类型:
a、数值类型:
整型——短整型short,整型int,长整型long
浮点型——单精度型float,双精度型double
b、字符类型 char
2、构造类型:
(1)数组
(2)结构体 struct
(3)共用体 union
(4)枚举类型 enum
三、C51基本数据类型:
1、
数据类型 | 关键字 | 所占位数 | 表示数的范围 |
无符号字符型 | unsigned char | 8 | 0~255 |
有符号字符型 | char | 8 | -128~127 |
无符号整型 | unsigned int | 16 | 0~65535 |
有符号整型 | int | 16 | -32768~32767 |
无符号长整型 | unsigned long | 32 | 0~2的32次方-1 |
有符号长整型 | long | 32 | -2的31次方~2的31次方-1 |
单精度浮点型 | float | 32 | 3.4e-38~3.4e38 |
双精度浮点型 | double | 64 | 1.7e-308~1.7e308 |
(1)占位数:编写程序的时候,无论是十进制,十六进制,还是二进制,表示一个数,在单片机当中,所有的数据都是以二进制形式来存储的,既然是二进制数,那么只有数字1和数字0。而这两个数,每一个所占据的空间都是一位,1是一位,0也是一位。位是单片机存储系统最小的一位,比它大的单位是字节。1byte(字节)=8bite(位)。
(2)关于浮点数,这里说明一下,浮点数是带小数的,在整型中是无法储存的,即使储存,小数点后面的数也会被自动清除。所以在保存小数的时候,我们要选择浮点。具体是单精度还是双精度,还得看我们的需求。对于float类型的数据,它提供的小数有7位,也就是你的这个数据位数高于7位,那么它就会自动把它后面的位数清除掉。对于双精度,它可以提供15-16位有效数字,具体的还与编译器有关系。
a、下面定义float a,a=123.1234567。由于float只能接受7位有效数,所以567就直接被舍弃掉。如果是double就可以都保存。
(3)对于存储数据,占用的位数越多,就可以保存小的。而小的不能保存大的。
四、C51扩充数据类型:
(1)单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般呢,我们根据特殊寄存器的功能,给这些寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能的寄存器的时候,必须要在程序的最前面加上,将这些名称加以声明,声明的过程,实际就是将这个寄存器的内存中的地址编号赋给这个名称,这样编译器在以后的程序中,才可能认识这些名称所对应的寄存器。对于大多数初学者来说,这些寄存器的声明已经完全被包含到51单片机的特殊功能寄存器头文件当中。例如reg51.b。
(2)C51扩充数据类型
类型 | 长度 | 值域 | 说明 |
bit | 位 | 0或1 | 位变量申明 |
sbit | 位 | 0或1 | 特殊功能位声明 |
sfr | 8位=1字节 | 0~255 | 特殊功能寄存器声明 |
Sfr16 | 16位=2字节 | 0~65535 | Srf的16位数据声明 |
* | 1~3字节 | 对象的地址 |
a、这些扩充数据在C语言当中是没有的,我们这是51单片机内部自带的,也就是一些特殊功能寄存器关键字,声明。
b、例如:sfr SCON=0x98;sbit TI=SCON^1。
五、C51运算量:
1、常量:常量是指在程序执行过程中其值不能被改变的量。在C51中支持整型常量、浮点型常量、字符型常量和字符串型常量。
(1)整型常量:
a、十进制:234,56,0
b、十六进制:0x12
2、变量:变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。
(1)定义变量的时候,必须通过数据类型说明符来指明变量的数据类型,数据类型有很多种,在前面看我们的,介绍数据类型的时候,有很多种。具体使用哪一种,就看我们的那个表格类型进行定义。
a、数据类型说明符除了我们前面看到的基本数据类型,也可以是组合数据类型说明符,还可以用重定义这个关键字typedef,通过这个关键字,来定义类型的别名。这个在程序的过程中,应用的特别多,在C51中,为了增加程序的可读性,我们允许用户为系统固有的数据类型说明符用typedef这个关键字起别名。
b、我们来看一下这个格式,首先是使用这个关键字typedef,然后呢这里有个C51固有的数据类型说明符,接下来对应的是这个别名。例如:typedef unsigned int u16,他的意思就是定义了一个新的类型u16。
(2) 变量名是C51用来区分不同变量,为不同变量取的名字。在C51中规定变量名是可以以字母,数字,下划线来组成。在定义变量名的时候就要记住它的规则,首先它只能由字母,数字,下划线组成,其次,第一个位置必须是字母或者下划线,像int 12b就不行。同时在命名的时候,建议使用有含义,按照它的功能来命名。防止时间一长你忘记这个变量的意思。
(3)变量名还有两种,一种是普通变量名,还有一种是指针变量名,他们的区别就是指针变量名的前面要带上一个*,在后续介绍指针我们会介绍到的,就是说在定义指针变量的时候,比如说我们在定义int a,这是一个普通的变量名,那如果我们定义一个指针变量,那么,a的前面要带上一个*,这是指针的一些相关知识。
(4)变量名我们介绍到了,接下来,我们看一下存储类型,存储种类。这个存储种类,是我们在变量程序执行当中,一个作用范围,C51变量的存储种类有四种:自动Auto,外部,静态,寄存器。
a、Auto:使用Aute定义的变量称为自动变量,其作用范围在定义它的函数体或者复合语句内部,当定义函数体或者复合语句执行时,C51才会变量分配内存空间,结束的时候,占用内存的空间就会自动释放,自动变量一般分配在内存的堆占空间当中,定义变量时,如果省略存储种类的话,那么默认就是自动的变量,所以我们刚才定义了int a,int是数据类型,但是前面没有这个存储种类,我们省略了Auto,那么这个是可以省略的, 那么一省略的话,系统就会认为我们这个变量是自动变量,所以呢,我们通常在定义变量的时候,用的比较多的是外部变量和自动变量,还有一个是静态变量。那么我们再看一下,这是我们的自动变量,自动变量它的作用范围它是定义它的函数体和复合语句内部,执行的范围也是它的一个函数体和复合语句内部来执行。
b、关于外部变量,它通常是使用extern,这个关键字来定义的变量通常定义为外部变量,在一个函数体内,要使用一个已在该函数体外或别的程序中定义过来的外部变量,那么这个变量呢,在该函数体内,要使用这个extern来进行说明,那个外部变量被定义后,分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束后才释放,因为它是一个全局的变量。比如说我们有两个文件,比如说我们有一个main.c,这是一个文件,那么我们还有一个a.c,这是第二个文件。那么a.c假设里面文件定义一个int,变量tapi,那如果说我们也在main.c里面也使用这个定义的tapi,那么我们可以将这个变量定义为全局变量,也就是使用这个关键字extern,进行申明,将这个变量申明为全局变量。然后就可以在main.c中使用这个变量。这个我们在后续多文件程序来编写的时候,我们会介绍这一块的内容。
c、关于静态的这个变量,它使用的关键字是static,使用static定义这个变量成为静态变量,它又分为内部静态变量和外部静态变量,那么在函数体内部定义的静态变量为内部静态变量,那么它在在对应的函数体内有效,一直存在。但在函数体外不可见,这样不仅使变量在定义它的一个函数体外被保护,还可以实现一个函数值不被改变。这个在我们后续学习定时器中断的时候,我们这个变量会使用到static这个静态变量,使用它我们会非常方便。
d、存储器类型
存储器类型 | 描述 |
date | 直接寻址的片内RAM低1288,访问速度快 |
bdata | 片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问 |
idata | 间接寻址访问的片内RAM,允许访问全部片内RAM |
pdata | 用Ri间接访问的片外RAM的低256B |
xdata | 用DPTR间接访问的片外RAM,允许访问全部64k片外RAM |
code | 程序存储器ROM64k空间 |