1、课程性质和教学目标课程性质和教学目标l本课程是电子信息学院各专业的一门必修课。l通过本课程的学习,期望达到如下目标:掌握C语言基本编程及应用 掌握5 1系列单片机的基本原理及简单开发 理解C语言与单片机在传感与控制系统中的作用 初步形成嵌入式系统设计与开发的基本能力1课程用书课程用书l单片机C语言教程lC程序设计谭浩强建议课程参考书建议课程参考书2课程介绍课程介绍l1.课程特点 综合性强、实践性强3课程介绍课程介绍l2.课程内容C语语言言单单片片机机4课程介绍课程介绍l2.课程内容C C语言编译软件语言编译软件TCTC编编译译环环境境WINWINTCTC编编译译环环境境VCVC编编译译环环境境
2、Keil C51Keil C51编编译译环环境境单片机单片机C C语言编语言编程环境程环境5 课程介绍课程介绍l2.课程内容外围器件单片机单片机AT89S52AT89S52外外围围电电路路传感器显示器件信号调理电路接口器件嵌嵌入入式式系系统统ProteusProteus单片机仿真软件单片机仿真软件6C C语言的发展语言的发展l语言是在语言是在 2020世纪世纪70 70 年代初问世的。一九七八年由美国年代初问世的。一九七八年由美国电话电报公司电话电报公司(AT&T)(AT&T)贝尔实验室正式发表了语言,贝尔实验室正式发表了语言,研研制制C C语言的初衷是为了用它编写语言的初衷是为了用它编写Un
3、ix Unix 系统软件。系统软件。l同时由同时由B.W.KernighanB.W.Kernighan和和D.M.RitchitD.M.Ritchit(合称(合称D&RD&R)合著了著)合著了著名的名的The C Programming LanguageThe C Programming Language一书,在该书中并没一书,在该书中并没有定义一个完整的标准有定义一个完整的标准C C 语言,后来由美国国家标准协会语言,后来由美国国家标准协会(American National Standards InstituteAmerican National Standards Institute)在
4、此基础上制定了)在此基础上制定了一个一个C C 语言标准,于一九八三年发表,通常称之为语言标准,于一九八三年发表,通常称之为ANSI CANSI C。7C C语言的发展语言的发展l K&RK&R在在19881988年修改了他们的经典著作年修改了他们的经典著作The C The C Programming LanguageProgramming Language,按照,按照ANSI CANSI C标准重写了标准重写了该书。该书。19871987年,年,ANSIANSI又公布了新标准又公布了新标准87 ANSI C87 ANSI C。19901990年,国际标准化组织年,国际标准化组织ISOISO
5、接受接受87 ANSI C87 ANSI C为为ISO CISO C的标准(的标准(ISO 9899ISO 989919901990)。)。目前流行的目前流行的C C编译系统都是以它为基础的。编译系统都是以它为基础的。8C C语言的特点语言的特点(1 1)语言简洁、紧凑,使用方便、灵活。)语言简洁、紧凑,使用方便、灵活。(2 2)C C语言运算符丰富,共有语言运算符丰富,共有1414种运算符。种运算符。(3 3)C C语言的数据结构也比较丰富,具有现代计算机语言语言的数据结构也比较丰富,具有现代计算机语言的各种数据结构。的各种数据结构。(4 4)具有结构化的流程控制语句,如选择语句、循环语)具
6、有结构化的流程控制语句,如选择语句、循环语句等。句等。(5 5)流程控制和数据操作灵活多样,程序设计有较大的)流程控制和数据操作灵活多样,程序设计有较大的自由度。自由度。(6 6)C C语言允许直接访问物理地址,能进行位运算,能实语言允许直接访问物理地址,能进行位运算,能实现汇编语言的大部分功能,可以直接对硬件进行操作。现汇编语言的大部分功能,可以直接对硬件进行操作。(7 7)用)用C C语言编写的程序可移植性好。语言编写的程序可移植性好。(8 8)用)用C C语言写的程序可移植性好(与汇编语言比)。语言写的程序可移植性好(与汇编语言比)。9为什么要学习为什么要学习C C语言语言l1.1.很多
7、其他的语言是基于很多其他的语言是基于C C语言的,学习语言的,学习C C,你可以更加容易的,你可以更加容易的学习很多其他的语言;学习很多其他的语言;l2.2.让你有能力去改写其他人写的复杂程序为你所用;让你有能力去改写其他人写的复杂程序为你所用;l3.3.极大地提高你的计算机应用水平;极大地提高你的计算机应用水平;l4.4.作为工程师,我们会发现越来越多的硬件可以用作为工程师,我们会发现越来越多的硬件可以用C C 语言进行语言进行配置。配置。10 简单的简单的C C语言程序语言程序l/*program writes the words Hello,world to the screenl*Fi
8、le:Hello.cl*By:NJCITl*Date:07-03-09l*/l#include lmain()llprintf(Hello,worldn);lreturn(0);l 注释头文件主函数函数体注:注:每个每个C C语言程序有且语言程序有且仅有一个仅有一个mainmain函数函数11 简单的简单的C C语言程序语言程序lmain()/main()/*主函数主函数*/l int a,b,c;/int a,b,c;/*定义变量定义变量*/l scanf(“%d,scanf(“%d,d”d”,&a,&b);/&a,&b);/*输入变量输入变量a a和和b b的值的值*/l c=max(a,
9、b);/c=max(a,b);/*调用调用maxmax函数,将得到的值赋给函数,将得到的值赋给c c*/l printf(“max=%d”,c);/printf(“max=%d”,c);/*输出输出c c的值的值 */int max(x,y)/int max(x,y)/*定义定义maxmax函数函数 */int x,y;/int x,y;/*对形参对形参x x、y y做类型定义做类型定义*/int z;/int z;/*max max函数中用到的变量函数中用到的变量z z,也要加以定义,也要加以定义*/if(xy)z=x;if(xy)z=x;else z=y;else z=y;return(z
10、);return(z);、/*将将z z的值返回,通过的值返回,通过maxmax带回调用处带回调用处*/12编辑链接编译执行 C程序的上机步骤C程序开发步骤 开 始 编 辑 编 译 连 接 执 行 有错?结果正确?结 束有源程序 file.c目 标 程序file.obj库函数和其它目标程序可执行目标程序无正确不正确file.exe程序代码的录入,生成源程序*.c语法分析查错,翻译生成目标程序*.obj与其它目标程序或库链接装配,生成可执行程序*.exe源程序目标程序可执行程序内容程序设计语言机器语言机器语言可执行不可以不可以可以文件名后缀.c.obj.exe13几个问题几个问题l1.1.一个一
11、个C C源程序包含几个源程序包含几个main()main()函数?函数?l2.2.一个函数由几部分组成?一个函数由几部分组成?l3.3.一个一个C C程序从哪个函数开始执行,在哪里结束?程序从哪个函数开始执行,在哪里结束?l4.4.在一个在一个C C程序中在程序中在”/*.*/”/”之间的内容是否进行编译之间的内容是否进行编译并运行?并运行?”/*/”/”起什么作用?起什么作用?l5.5.在一个在一个C C程序开始有时会有程序开始有时会有“include include *.h”.h”这个语句,这个语句,它是什么意思?它是什么意思?14总结总结l1.C1.C程序是由函数构成的程序是由函数构成的
12、。l一个一个C C源程序至少包含一个函数(源程序至少包含一个函数(mainmain函数),也可以包含一函数),也可以包含一个个mainmain和若干其它函数。因此,和若干其它函数。因此,函数函数是是C C程序的基本单位。程序的基本单位。l2.2.一个函数由两部分组成一个函数由两部分组成l(1 1)函数的)函数的说明部分说明部分l包含函数名、函数类型、函数属性、函数参数名、形式参数名包含函数名、函数类型、函数属性、函数参数名、形式参数名l (2 2)函数体函数体l即函数说明部分下面的大括弧即函数说明部分下面的大括弧内的部分。内的部分。l 函数体内一般包括:变量定义、执行部分。函数体内一般包括:变
13、量定义、执行部分。15总结总结l3.3.一个一个C C程序程序总是从总是从mainmain函数开始执行函数开始执行,而不论,而不论mainmain函数在函数在整个程序中位置,整个程序中位置,最后在最后在mainmain中结束中结束。l4.4.每个语句和数据定义的每个语句和数据定义的最后必须有一个分号最后必须有一个分号。l5.C5.C语言语言本身没有输入输出语句本身没有输入输出语句,输入、输出操作是利用,输入、输出操作是利用库函数库函数scanf()scanf()和和printf()printf()完成。完成。l6.6.可以用可以用/*.*/作注释作注释。16总结:总结:格式特点格式特点l习惯用
14、习惯用小写小写字母,大小写敏感字母,大小写敏感l不使用行号,不使用行号,无程序行无程序行概念概念l可使用空行和空格可使用空行和空格l常用常用锯齿形锯齿形书写格式书写格式l优秀程序员的素质之一优秀程序员的素质之一:l使用使用TABTAB缩进缩进l对齐对齐l有足够的注释有足够的注释l有合适的空行有合适的空行17C C语言中的关键字语言中的关键字l32个关键字:(lauto break case char constlcontinue default do double elselenum extern float for gotolif int long register returnlshort
15、 signed sizeof static structlswitch typedef unsigned union voidlvolatile while18C C语言的要素语言的要素l1.C的数据类型l一个程序应包括两个方面的内容:l (1)数据的描述;l (2)算法:操作步骤,即动作的描述;l数据是操作的对象,操作的结果会改变数据的状况。l数据结构算法程序19C C语言数据类型语言数据类型C数据类型基本类型构造类型指针类型空类型void定义类型typedef数值类型字符类型char枚举类型enum整 型浮点型单精度型float双精度型double短整型short长整型long整型int数
16、组结构体struct共用体union20基本数据类型类型符号关键字数的表示范围所占位数整型字符型实型有无(signed)int16-3276832767(signed)short16-3276832767(signed)long32-2147483648214748364716unsigned int0655353204294967295unsigned longunsigned short16065535有float323.4e-383.4e38有double641.7e-3081.7e308有char8-128127无unsigned char80255说明:数据类型所占字节数随机器硬件不
17、同而不同,上表以IBM PC机为例:21 一般用大写字母 是宏定义预处理命令,不是C语句 直接常量:整型常量 实型常量 字符常量 字符串常量如#define PRICE 30常量l定义:程序运行时其值不能改变的量(即常数)l分类:符号常量:用标识符代表常量 定义格式:#define 符号常量 常量例 符号常量举例(ch2_1.c)#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);运行结果:运行结果:total=300total=30022&整型常量(整常数)l三种形式:十进制整数:
18、由数字09和正负号表示.如 123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数:由0 x开头,后跟09,af,AF表示.如0 x123,0Xff例 12 与 12L例 30000 为int型 65536 为long int 型l整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量问题:0123 =()100 x123=()100Xff =()1083291255问题:0123 =()100 x123=()100Xff =()1023&实型常量(实数或浮点数)实型常量(实数或浮点数)l表示形式:表
19、示形式:十进制数形式:(十进制数形式:(必须有小数点必须有小数点)如如0.123,.123,123.0,0.123,.123,123.0,0.0,123.0.0,123.指数形式:(指数形式:(e e或或E E之前必须有数字;指数必须为整数之前必须有数字;指数必须为整数)如如12.312.3e3,123E2,1.23e4,e3,123E2,1.23e4,e-5e-5 ,1.2E-3.51.2E-3.5 l实型常量的类型实型常量的类型 默认默认doubledouble型型 在在实型常量后加字母实型常量后加字母f f或或F F,认为它是认为它是float float 型型2425&字符常量字符常量
20、l定义定义:用用单引号单引号括起来的括起来的单个普通字符单个普通字符或或转义字符转义字符.l字符常量的字符常量的值值:该字符的:该字符的ASCIIASCII码码值值转义字符及其含义:转义字符含义nvradddtbf“xhh转义字符含义换行垂直制表回车响铃单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符如 101 -A 012 -n 376 -x61 -a 60 -0 483 -()例:A-101-x41-65如 A65,a97,048,n10如 a A?n 101l转义字符转义字符:反斜线后面跟一个字符或一个代码值表示反斜线后面跟一个字符或一个代码值表示l字符常
21、量与字符串常量不同&字符串常量字符串常量l定义:用定义:用双引号双引号(“”)(“”)括括起来的字符序列起来的字符序列l存储:存储:每个字符串尾每个字符串尾自动自动加一个加一个 0 0 作为字符串作为字符串结束标志结束标志h e l l o 0例 字符串“hello”在内存中a a 0例 a“a”例 空串 “”0例:char ch;ch=“A”;例:char ch;ch=A;26编译程序根据变量定义为其分配指定字节的内存单元.地址int a=1,b=-3,c;abc2字节2字节2字节地址地址.内存1-3随机数l变量l概念:其值可以改变的量l变量名与变量值l变量定义的一般格式:数据类型 变量1,
22、变量2,变量n;l变量初始化:定义时赋初值 例:int a,b,c;float data;决定分配字节数和数的表示范围合法标识符l变量的使用:先定义,后使用例1 int student;stadent=19;/Undefined symbol statent in function main l变量定义位置:一般放在函数开头27l在书写变量说明时,应注意以下几点:在书写变量说明时,应注意以下几点:1.1.允许在一个类型说明符后,说明多个相同类型的变量。允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少各变量名之间用逗号间隔。类型说明符与变量名之间
23、至少用一个空格间隔。用一个空格间隔。2.2.最后一个变量名之后必须以最后一个变量名之后必须以“;”号结尾。号结尾。3.3.变量说明必须放在变量使用之前。一般放在函数体的开变量说明必须放在变量使用之前。一般放在函数体的开头部分。头部分。main()int a,b=2;a=1;float data;data=(a+b)*1.2;printf(“data=%fn”,data);main()int a,b=2;float data;a=1;data=(a+b)*1.2;printf(“data=%fn”,data);变量定义可执行语句例:int a=2,b,c=4;float data=3.67;ch
24、ar ch=A;int x=1,y=1,z=1;int x=y=z=1;28l 常量与变量常量与变量l标识符标识符l定义:用来标识变量名、符号常量名、函数名、类型名等的定义:用来标识变量名、符号常量名、函数名、类型名等的字符序列字符序列l组成:组成:只能由只能由字母字母、数字数字、下划线下划线组成,且第一个字母必须是字母或下划组成,且第一个字母必须是字母或下划线线大小写敏感大小写敏感不能使用关键字不能使用关键字l长度:最长长度:最长3 32 2个字符个字符l命名原则:命名原则:见名知意见名知意不宜混淆不宜混淆 如如l l与与I,oI,o与与0 0例:判断下列标识符号合法性sum Sum M.D
25、.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123M.D.John3days#33char$123ab29&整型变量l占字节数随机器不同而不同,一般占一个机器字lshortintlongl可用sizeof(类型标识符)测量&实型变量lfloat:占4字节,提供7位有效数字ldouble:占8字节,提供1516位有效数字&字符型变量l字符变量存放字符ASCII码lchar与int数据间可进行算术运算例 float a;a=123456.789;/*a=a=123456.7123456.7*/double b;b=
26、123456.789123456.789;/*b=b=123456.789123456.789*/例 a=D;/*a=68;*/x=A+5;/*x=65+5;*/s=!+G /*s=33+71;*/没有字符串变量,用字符数组存放3031l2.32.3不同类型数据间的转换不同类型数据间的转换l隐式转换隐式转换l什么情况下发生什么情况下发生运算转换运算转换-不同类型数据混合运算时不同类型数据混合运算时赋值转换赋值转换-把一个值赋给与其类型不同的变量时把一个值赋给与其类型不同的变量时输出转换输出转换-输出时转换成指定的输出格式输出时转换成指定的输出格式函数调用转换函数调用转换-实参与形参类型不一致时
27、转换实参与形参类型不一致时转换l运算转换规则运算转换规则:不同类型数据运算时先不同类型数据运算时先自动自动转换成同转换成同一类型一类型32doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例 char ch;int i;float f;double d;ch/i +f*d -(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+a +i*f -d/l例 int i;float f;double d;lo
28、ng l;33l显式转换(强制转换)显式转换(强制转换)l一般形式:一般形式:(类型名类型名)(表达式)表达式)例例 (int)(x+y)(int)(x+y)(int)x+y (int)x+y (double)(3/2)(double)(3/2)(int)3.6 (int)3.6 l说明:强制转换得到所需类型的中间变量,原变量说明:强制转换得到所需类型的中间变量,原变量类型不变类型不变 例 main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:x=3.600000,i=3精度损失问题较高类型向较低类型转换时可能发生Ch2_007.cCh2_008.c