单片机C 语言入门
北方蓝芯科技(www.hrbnbc)
C 语言是一种功能强大、应用广泛、具有发展前途的计算机语言。它既可用于系统软件的设计,也可用于应用软件的开发。许多著名的系统软件都是由C 语言编写的。
建议初学者读谭浩强的《C 程序设计》,非常适合初学者自学用的一本书。
1、 C51的数据类型
1)、字符型char
有signed char 和unsigned char 之分,默认为signed char 。它们的长度均为一个字节,用于存放一个单字节的数据。对于signed char ,它用于定义带符号字节数据,其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128~+127;对于unsigned char ,它用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为0~255。unsigned char 可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,在计算机内部用ASCII 码存放。
2)、int 整型
分singed int 和unsigned int 。默认为signed int 。它们的长度均为两个字节,用于存放一个双字节数据。对于signed int ,用于存放两字节带符号数,补码表示,数的范畴为-32768~+32767。对于unsigned int ,用于存放两字节无符号数,数的范围为0~65535。
3)、long 长整型
分singed long 和unsigned long 。默认为signed long 。它们的长度均为四个字节,用于存放一个四字节数据。对于signed long ,用于存放四字节带符号数,补码表示,数的范畴为-2147483648~+2147483647。对于unsigned long ,用于存放四字节无符号数,数的范围为0~4294967295。
4)、float 浮点型
float 型数据的长度为四个字节,格式符合IEEE-754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“1”表示负数,“0”表示正数,其次的8位为阶码,最后的23位为尾数的有效数位,由于尾数的整数部分隐含为“1”,所以尾数的精度为24位。
5)、* 指针型
指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内
存单元,对不同的处理器其长度不一样,在C51中它的长度一般为1~3个字节。
w w w .h r b n b c .c o m
w w w .h r b n b c .c o m /b b s
2、 C51的运算符和表达式
1)、  赋值运算符
赋值运算符“=”,在C51中,它的功能是将一个数据的值赋给一个变量,如x=10。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号“;”就构成了赋值语句,一个赋值语句的格式如下:
变量=表达式;
执行时先计算出右边表达式的值,然后赋给左边的变量。例如: x=8+9;  /*将8+9的值赋绐变量x*/
x=y=5;  /*将常数5同时赋给变量x 和y*/
在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。
在C 语言中,参加运算的对象个数称为运算符的“目”。单目运算符是指参加运算的对象只有一个,如+10,–67,x++。双目运算符是指参加运算的对象有两个,如2+3,7%3。 相同运算符连续出现时,有的运算符是从左至右进行运算,有的运算符是从右至左进行运算,C 语言中,将运算符的这种特性称为结合性。
加法(+)、减法(–)、乘法(*)与数学中的算术运算相同。例如:3.5+4.7结果是8.2;3.5 – 4.7结果是–0.8;3.5*4.7结果是16.45。
float几个字节多少位除法运算(/)与数学中的除法不完全相同,它与参加运算的对象的数据类型相关。当参加运算的两个对象均为整型数据时,其运算结果为数学运算结果的整数部分。如7/4结果为1,而不是1.75。若参加运算的两个对象有一个是实型或两个都是实型,那么运算结果为实际运算的值,如7/5.0的运算结果为1.4。
模运算的运算对象必须为整型,结果是相除后的余数,如7%5结果为2。
增1减1运算符都是单目运算符,用来对整型、实型、字符型、指针型变量或数组元素
c .c o m
b b s
等变量进行加1或减1运算,运算的结果仍是原类型。
3)、关系运算符
C51中有6种关系运算符:  >    大于  <    小于  >=    大于等于  <=    小于等于  = =    等于  !=    不等于
关系运算用于比较两个数的大小,用关系运算符将两个表达式连接起来形成的式子称为关系表达式。关系表达式通常用来作为判别条件构造分支或循环程序。关系表达式的一般形式如下:
表达式1  关系运算符  表达式2
关系运算的结果为逻辑量,成立为真(1),不成立为假(0)。其结果可以作为一个逻辑量参与逻辑运算。例如:5>3,结果为真(1),而10= =100,结果为假(0)。
注意:关系运算符等于“= =”是由两个“=”组成。
4)、逻辑运算符
C51有3种逻辑运算符:  ||    逻辑或  &&    逻辑与  !    逻辑非
关系运算符用于反映两个表达式之间的大小关系,逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。
逻辑与,格式:
条件式1 && 条件式2
当条件式1与条件式2都为真时结果为真(非0值),否则为假(0值)。 逻辑或,格式:
条件式1 || 条件式2
当条件式1与条件式2都为假时结果为假(0值),否则为真(非0值)。 逻辑非,格式: !条件式
当条件式原来为真(非0值),逻辑非后结果为假(0值)。当条件式原来为假(0值),逻辑非后结果为真(非0值)。
例如:若a=8,b=3,c=0,则!a 为假,a && b 为真,b && c 为假。  5)、位运算符
C51语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有:
&    按位与 |    按位或
w w w .h r b n b c .c o m
w w w .h r b n b c .c o m /b b s
^    按位异或 ~    按位取反 <<    左移 >>    右移
【例】设a=0x45=01010100B ,b=0x3b=00111011B ,则a&b 、a|b 、a^b 、~a 、a<<2、b>>2分别为多少?
01010100 & 00111011  00010000  得
a&b=00010000b=0x10。 下面同解
a|b=01111111B=0x7f 。 a^b=01101111B=0x6f 。 ~a=10101011B=0xab 。 a<<2=01010000B=0x50。 b>>2=00001110B=0x0e 。  6)、复合赋值运算符
C51语言中支持在赋值运算符“=”的前面加上其它运算符,组成复合赋值运算符。下面是C51中支持的复合赋值运算符
+=    加法赋值              +    减法赋值                *=    乘法赋值            /=    除法赋值                %=    取模赋值            &=    逻辑与赋值                |=    逻辑或赋值          ^=    逻辑异或赋值                ~=    逻辑非赋值          >>=    右移位赋值                <<=  左移位赋值 复合赋值运算的一般格式如下: 变量  复合运算赋值符  表达式 它的处理过程:先把变量与后面的表达式进行某种运算,然后将运算的结果赋给前面的变量。其实这是C51语言中简化程序的一种方法,大多数二目运算都可以用复合赋值运算符简化表示。例如:a+=6相当于a=a+6;a*=5相当于a=a*5;b&=0x55相当于b=b&0x55;x>>=2相当于x=x>>2。
3、 数据类型转换规则
对数据进行运算时,要求参与运算的对象的数据类型相同(运算得到的运算结果的类型与运算对象也相同)。因此,在运算过程中常常需要对变量或常量的数据类型进行转换,转换的方法有两种,一种是系统自动转换(又称为隐式转换);另一种是在程序中强制转换(又称为显式转换)。 1)、自动转换规则
w w w .h r b n b c .c o m
w w w .h r b n b c .c o m /b b s
在不同类型数据的混合运算中,由系统自动实现转换。转换规则如下:
(1)若参与运算的数据的类型不同,则应先转换成同一类型,然后进行运算。
(2)将低类型数据转换成高类型数据后进行运算。如int 型和long 型运算时,先把int 型转换成long 型后再进行运算。
类型的高低是根据其所占空间的字节数按从小到大的顺序排列的,顺序如下: char ,int ,long ,float ,double 。 (3)所有的浮点运算都是按照双精度进行运算的,即使仅含float 型单精度量运算的表达式,也要先转换成double 型,再作运算。
(4)char 型和short 型参与运算时,必须先转换成int 型。 例如,设有:
float PI=3.14; int s,r=7; s=r*r*PI;
因为PI 为单精度型,s 和r 为整型,在执行s=r*r*PI 语句时,r 和PI 都转换成double 型后再进行计算,运算结果也为double 型,右边的运算结果为153.86,但由于s 为整型,故应将赋值号右边的运算结果转换成整型(舍去小数部分),因此s 的值为153。 2)、  强制类型转换
强制类型转换是通过类型转换运算来实现的,其语法格式如下:
(类型说明符)(表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如: (float) a 把a 转换为实型;(int)(x+y) 把x+y 的结果转换为整型;而(int)x+y 则只将x 转换为整型。 在使用强制类型转换时应注意以下问题:
(1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y 则只是把x 转换成int 型之后再与y 相加。
(2)对于被转换的单个变量而言,无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量的数据长度进行临时性转换,而不会改变变量定义时所声明的类型。 例如,设有:
float f = –5.75; int x; x= (int)f;
将f 强制转换成整数–5,因此x = –5,而f 本身的类型并未改变且其值仍为–5.75。
4、 程序结构
1)、主函数结构
每一个C 源程序都是一系列函数的集合。其中,必须有且只能有一个主函数,其函数名为main ,其结构如下:
w w w .h r b n b c .c o m
w w w .h r b n b c .c o m /b b s