资源预览内容
第1页 / 共68页
第2页 / 共68页
第3页 / 共68页
第4页 / 共68页
第5页 / 共68页
第6页 / 共68页
第7页 / 共68页
第8页 / 共68页
第9页 / 共68页
第10页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第八章 单片机的C51编程,第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数 第六节 片内硬件资源的定义 第七节 程序的基本结构 第八节 C51程序举例 第九节 Windows环境下C51编译器的操作,本章要点,介绍C语言的基础知识。 掌握C语言程序的基本结构,学会用C语言编制一些简单的单片机应用程序,并在Windows环境下使用Keil Vision2 集成开发软件进行编译操作。 了解C51编译器与标准C语言在存储模式、片内硬件资源使用等方面的差别。,第一节 概述,汇编语言语法简单,指令易记,不需要引入各种运算符号,也没有什么繁琐的规则,使用方便。加上具有直接操作硬件的指令,运行速度快。源程序编好之后,只要一次汇编就可以转换为目标程序。所以开发不太复杂的单片机系统,汇编语言仍是使用者的首选。 C语言是一种通用的计算机设计语言,具有完善的模块结构,可移植性强,便于改进和扩充,可以按模块分别开发,分开调试,开发周期快。开发大型的应用系统,使用C语言更加有利。 在单片机上使用C语言,不能用标准的C编译器,因为标准C编译器是针对PC的,单片机的存储器结构与PC略有差异,必须用专门针对8051系列单片机开发出来的C51编译器(简称C51) 。目前针对8051系列单片机开发出来的编译器有Keil C51 for windows,它的结构与标准C编译器没有根本的区别,仅仅在存储模式、片内资源使用方面略有差异。,返回本章首页,第二节 程序的格式,从几个实例,了解C语言的程序格式。 例9-1 能输出“Welcome to using C51”的C语言程序 #include“stdioh” main() printf(“Welcome to using C51 n”); ,其中main( )为主函数,printf为输出函数,stdio.h为头文件,执行这个程序的目的,是在屏幕上输出以下一行信息: Welcome to using C51 。,例9-2 求三个数a、b、c的和。 #include“stdioh” main() *主函数* int a,b,c,sum; *定义变量* a=12;b=34;c=56; *给变量赋值* sum=a十b十c; *求和* printf(“sum is dn”,sum);*显示结果* ,执行以上程序,可在屏幕上输出a、b、c的和,并显示: sum is 102,例9-3 从输入的两个数a,b中,求出较大的数的程序。 #include“stdioh” int max(int x,int y) *定义max函数,函数返回值为 整型;x,y为形式参数,整型* int z; if(xy) z=x; else z=y; return(z); *将z的值返回到调用处* main() *主函数* int a,b,m; *定义三个整型变量* scanf(“d,d,” *输出m的值* ,程序执行结果是在输入a,b值后,可求出较大的数并赋予变量m 。如输入a=3,b=5,则执行结果可显示出 m=5。,从三个例子可看出C语言或C51源程序的基本格式有如下特点: 1. C语言程序的书写格式比较自由,一行可以写若干条语句,一个语句也可以写成几行,不管一行写几个语句,每个语句须以“;”结尾。 2.程序由一个主函数和若干个其他函数组成,主函数的名字必须为main。程序的执行总是从main函数开始的,其位置无特殊规定。 3.C语言程序通过函数调用去执行指定的工作。所有函数体都用一对大括弧括起来。 4.源程序文件需要包含其他源程序文件的内容时,则要在本程序文件头部用包含命令#include进行“文件包含”处理。,返回本章首页,第三节 数据类型和存储类型,一、数据类型 不论常量还是和变量都有几种不同类型,不同类型的数据所占用的存储器长度不同。,整型 实型 字符型 字符串型,位型 字符形 整型 长整型 浮点型 指针型,常量可以用一个标识符表示,并称为 符号常量,符号常量要用#define定义,数据类型,变量名只能由字母、数字和下划线组成, 不能以数字打头。变量分下表几种类型,常量,变量,变量类型表,二、存储类型 存储类型是指该数据在单片机系统中存放的位置,也就是数据的定位方式。,表 C51存储类型,表 C51不同存储类型的数据大小,C51定义变量时除了定义数据类型外,还应定义存储类型 例:int data x , y ; 表示变量x , y 为16位整数并指定存储在片内数据存储区。 1.若未定义存储类型,则C51编译器自动选择默认存储类型如下表:,2.选择变量类型时应尽量选用无符号型,可以减少测试符号的额外操作,可以提高代码效率。 3.为使编程时书写简化,数据类型允许用缩写。例: #define uchar unsigned char #define ulong unsigned long,第四节 运算符和表达式,一、算术运算符及其表达式 1.C语言的基本算术运算符 基本算术运算符有+、-、*、/、%(%为模运算符,或称求余运算符)。用算术运算符或圆括号将运算对象包括常量、变量、函数、数组等连接,形成算术表达式。 如:a*(b-c)+2.3+a 2.算术运算符的优先级 先乘除模,后加减,括号最优先。 3.算术运算符的结合性 “自左至右”:运算对象两侧的运算符优先级相同时,先与左边结合。 4.数据类型不同时的转换 如果运算符两侧的数据类型不同,必须转换成同一类型,再进行运算。转换方式有自动转换(默认)和强制转换。强制转换的形式为: 类型名) 表达式);,例:(double) x; (将x强制转换成double型) 注:强制转换只转换表达式的值,变量类型不变。,二、关系运算符及其表达式 1.六种关系运算符 (大于) =(大于或等于) 、=、=优先级相同,!=与=相同,前四种高于后两种。 2.关系运算符的优先级低于算术运算符。 3.关系运算符的优先级高于赋值(=)运算符。,3.关系表达式 用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式等)连接起来的式子称为关系表达式,其结果是逻辑值,即“真”或“假”。C语言没有逻辑型数据,以1代表真,以0代表假。,例如a=1,b=2,c=3,则 cb的值为“真”,表达式的值为1; b =(a+c)的值为“假”,表达式的值为0; x=ab,因ab的值为“假”,所以x的值为0。,三、逻辑运算符及其表达式 1.三种逻辑运算符 & 逻辑与 (两个操作数都为真时,结果才为真,否则 为假。) 逻辑或 (只要两个操作数中有一个为真,结果便为 真,否则为假。) ! 逻辑非 (对操作数的值取反。) &和 要求有两个操作对象,而!是单目运算符,只要求有一个运算对象。,2.逻辑运算符的优先级 优先顺序为 !(非) 算术运算符 关系运算符 &和 。 最低为赋值运算符。 3.逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子称为逻辑表达式。逻辑表达式的值只能是0(假)或1(真)。,例:已知a=2,b=3,求!a、a&b、!a & b !a为0(假) a=2非0故为假 a&b为1(真) !a&b 为0(假) 先执行!a为0故!a&b为0,四、位操作运算符及其表达式 & 按位与 按位或 按位异或 按位取反 位右移 除按位取反运算符外,其余位操作运算符都是两目运算符。 位运算符操作的对象只能是整型或字符型数据。,1按位与 & 参与运算的两操作数,只有双方相应的位都为1,结果值中该位为1,否则为0。 即 O&O=O,O&l=0,l&O=0,l&l=l,例:a=0x31,b=0x56,求ab的值。 ab=01110111B,2按位或 参与运算的两操作数只要双方相应的位中有1,其结果该位便为1,否则为0。 即O O =O,O l=1,l O=1,l l=l,例:a=0x37,b=Ox7A求a&b的值。 a&b=00110010,3按位取反 对操作数按位取反,即0变l, 1变0 。,例:a=0x31,b=0x56,求ab的值。 ab=01100111B,4按位异或 参与运算的两操作数,如果对应位的值不同,运算结果该位为1,否则为0。即 OO=O,Ol=1,lO=1,ll=0,例:a=0x3FH=00111111B,求a 的值。 a=11000000B,5. 位左移和位右移 移位运算时,将左操作数的各二进制位全部左(右)移若干位,所移位数由右操作数决定。移位后留出的空白位补0,溢出的位舍弃。,例:a=Ox3E,求a2的值。 求得 00001111 即0x0F,五、自增减运算符及其表达式 作用:使变量的值增1或减l。 如:+i (使用i之前,先使i值增1。) -i (使用i之前,先使i值减1。) i+ (在使用i之后,使i值增l。) i- (在使用i之后,使i值减1。),例:若i=5 则j=i+; (执行后i=6,j=5) j=+i; (I=6,j=6),六、复合运算符及其表达式 C语言中的两目运算符都可以和赋值运算符“=”一起组成复合赋值运算符。 使用的复合赋值运算符有以下10种: +=, -=, *=, /=, %=, =, &= , =, =,例如 a += 2 等价于 a=a+2。 m *= n+1 等价于 m=m*(n+1)。,七、对指针操作的运算符 & 取地址运算符 * 取内容运算符 & 可作为取地址运算符,又可作为按位与,若为按位与 “&”的两边必须有操作对象。 * 可作为取内容运算符,还可作为指针变量的标志,但作为指针变量标志时, 一定出现在对指针定义中。,返回本章首页,第五节 指针与函数,一、指针与指针变量 变量名对应于内存单元的地址,变量值则是放在内存单元中的数据。同时把存放变量x的地址称为指针,使用指针前也必须定义。指针的定义为: char xdata *data xp 也可以写成: data char xdata *xp 定义指针与指针变量的注意点 1.指针变量名前面冠以“*”号如例*xp,表示xp为指针。 2.定义时应包括变量的数据类型、存储类型以及指针变量本身的存储类型。指针变量本身的存储类型,写在语句开头,或*号与变量名之间。 3.如果只标明被指变量的数据类型和存储类型,而没有指明指针变量本身的存储类型,则被默认为通用型。,指针与指针变量的定义举例 例:定义一字符变量x,并赋值为6。 char data x x=6 例:定义一指针xp,指向x所在的内存单元 char data *data xp xp=&x 定义后要访问x可以用两种办法: 1)直接访问,如printf(“d”,x)。 2)间接访问,如printf(“d”,*xp)。,二、函数 C51程序是由一个主函数和若干个其他函数所构成,程序中由主函数调用其他函数,其他函数也可以互相调用。,主函数,其他函数,标准库函数,自定义函数,无参数函数,有参数函数,程序,1无参数函数的定义形式 类型标识符 函数名() 函数体语句 类型标识符用来指定函数返回值的类型。无参数函数一般不带返回值,可以不写类型标识符。,例:dis() printf(“okn”); ,函数名,函数体语句,2有参数函数的定义形式 类型标识符 函数名(参数列表及说明) 函数体语句,例: int max(int x,int y) int z; / *函数体语句* if (xy) z=x; else z=y; return (z);,返回本章首页,类型标识符,函数名,参数列表及说明,第六节 片内硬件资源的定义,一、特殊功
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号