您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第2章 C51语言程序设计
计算机科学与技术系第2章认识uVision3与KeilC教学目的:熟悉80C51系列单片机的C51语言程序设计,能够编写简单C51语言程序。教学重点:KeilC的基本结构数据类型、运算符函数、中断数组与指针常用C51语言程序设计方法。教学难点:C51语言对C语言的扩展。计算机科学与技术系2.1单片机的C语言概述2.1.1C语言的主要优点1.对单片机的指令系统不要求十分熟悉,仅要求对单片机的基本硬件结构有一定了解;2.C语言可直接访问单片机的物理地址,包括寄存器、不同存储器以及外部接口器件;3.C语言是以函数为程序设计基本模块的,这种方式可方便地进行结构化程序设计;4.由于具有丰富的数据结构类型及多种运算符,所以表达方式灵活,表达能力强;5.源代码可读性较强,容易理解和编程,并且极大地缩短了源文件长度;6.具有丰富的库函数,其中包括许多标准子程序,具有较强的数据处理能力;7.模块化编程技术使程序容易移植,可以把需要的功能模块方便地移植到一个新程序中或另一种单片机上。计算机科学与技术系2.1.2单片机C语言使用的工具图2-1KeilC51的汇编/编译器及汇编//编译过程计算机科学与技术系1.C51编译器2.A51宏汇编器3.LIB51库管理器4.BL51连接/定位器2.1.3使用C语言的注意事项标准C语言没有提供对内存地址范围的定义,没有处理中断的指令。对于此问题,不同的单片机C语言的解决方案不完全相同,从而不同型号单片机上的程序不可互相移植。在用C语言编写单片机程序时,需要根据单片机的存储器结构和内部资源定义相应的数据类型和变量。在编程时不要使用大量不必要的变量类型。计算机科学与技术系2.2KeilC51μVision3环境简介建立您的第一个C项目计算机科学与技术系选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。计算机科学与技术系项目中创建新的程序文件或加入旧程序文件标在屏幕左边的SourceGroup1文件夹图标上右击AddFiletoGroup‘SourceGroup1’,然后将项目编译成为HEX文件,实现仿真、下载验证的功能通过菜单File-New或快捷键Ctrl+N来实现计算机科学与技术系计算机科学与技术系调试与仿真计算机科学与技术系外围部件的访问计算机科学与技术系☆2.3KeilC语言的基本结构及变量、常数与数据类型1、简单C程序举例voidmain(){intb,a=1;//a表示一个整型变量变量名a;语句结束符号b=++a;//a的值加一变为2,然后将a的值赋给b}说明:C程序从main开始执行程序,前一个void表示无值返回;C程序中用到的变量一定要先定义变量的数据类型,只有定义了变量的数据类型后,变量才会在内存中按其数据类型长度给其分配空间。计算机科学与技术系复习:C语言的基本数据类型数据类型位数字节数值域bit10~1signedchar81-128~+127unsignedchar810~255enum162-32768~+32767signedshort162-32768~+32767unsignedshort1620~65535signedint162-32768~+32767unsignedint1620~65535计算机科学与技术系数据类型位数字节数值域signedlong324-2147483648-2147483647unsignedlong3240~4294967295float3240.175494E-38~0.402823E+38sbit10~1sfr810~255sfr161620~65535计算机科学与技术系C语言的缺陷无边界出错检查、运算符较多。变量用来存放数据,运算符用来处理数据。运算符分算术运算、关系运算、逻辑运算、赋值运算、逗号运算符、条件运算符、位运算符、指针运算符等。计算机科学与技术系运算符范例说明+a+ba变量值和b变量值相加-a-ba变量值和b变量值相减*a*ba变量值乘以b变量值/a/ba变量值除以b变量值%a%b取a变量值除以b变量值的余数++a++a的值加1,即a=a+1--a--a的值减1,即a=a-1算术运算符结果具体的值2.4KeilC的基本运算符计算机科学与技术系运算符范例说明=a=6将6赋值给a变量,即a变量值等于6+=a+=b等同于a=a+b,将a和b相加的结果又存回a-=a-=b等同于a=a-b,将a和b相减的结果又存回a*=a*=b等同于a=a*b,将a和b相乘的结果又存回a/=a/=b等同于a=a/b,将a和b相除的结果又存回a%=a%=b等同于a=a%b,a值除以b值的余数又存回a赋值运算符,结果具体的值计算机科学与技术系运算符范例说明ab测试a是否大于bab测试a是否小于b==a==b测试a是否等于b=a=b测试a是否大于或等于b=a=b测试a是否小于或等于b!=a!=b测试a是否不等于b关系运算符结果某种关系的真、假(“1”、“0”)计算机科学与技术系运算符范例说明&&a&&ba和bAND,两个变量都是“真”,结果才为“真”否则结果为“0”‖a‖ba和b作逻辑OR,只要有任何一个变量为“真”,结果就为“真”!!a将a变量的值取反,即原来为“真”则变“假”,为“假”则变为真逻辑运算符运算结果真、假(“1”、“0”)计算机科学与技术系运算符范例说明ab将a按位右移b个位,左侧补“0”,溢出舍去ab将a按位左移b个位,右侧补“0”,溢出舍去︱a︱ba和b的按位作OR运算&a&ba和b的按位作AND运算^a^ba和b的按位作XOR运算~~a将a的每一位取反指针运算&a=&b将b变量的地址存入a寄存器**a用来取寄存器所指地址内的值计算机科学与技术系条件运算符:表达式1?表达式2:表达式3条件运算符表达式的运算规则:如果表达式1的值为真,那么整个表达式的值就是表达式2的值,否则是表达式3的值。各种运算符时,要考虑运算符的优先级及结合性。运算符的优先级如下:初等单目算术关系逻辑条件赋值逗号计算机科学与技术系2.5KeilC的流程控制★#define宏名字符串以一个宏名称来代表一个字符串,即当程序任何地方使用到宏名称时,则将以代表的字符串来替换。宏的定义可以是一个常数,表达式,或含有参数的表达式都可,在程序中如果多次使用宏,则会占用较多的内存,但执行速度较快。范例:#defineucharunsignedchar//用uchar代替unsignedchar#defineunitunsignedint//用unit代替unsignedchar#defineLEDP2//用功能来命名注意:宏定义不是C程序的语句,所以后面不能有分号,若有分号会发生连同分号一起置换,则会出错。如#definePI3.141596;area=PI*r*r;置换后area=3.141596;*r*r;出错。计算机科学与技术系★if语句(Keil软件的使用)1.if(条件表达式){动作}如果条件表达式的值为真(非零数),则执行{}内的动作,如果条件表达式为假,则略过该动作而继续往下执行。计算机科学与技术系2、if(条件表达式){动作1}else{动作2}如果条件表达式为真,则执行动作1,略过else的部分,接着往下执行,如果条件表达式为假,则略过if的部分而执行else的动作2,然后再往下执行。计算机科学与技术系3、if(条件表达式1)if(条件表达式2)if(条件表达式3){动作A}else{动作B}else{动作C}else{动作D}动作A:条件表达式1,2,3都成立时才会执行。动作B:条件表达式1,2成立,但条件表达式3不成立时才会执行。动作C:条件表达式1成立,条件表达式2不成立时才会执行。动作D:条件表达式1不成立时才会执行。计算机科学与技术系4、if(条件表达式1){动作A}elseif(条件表达式2){动作B}elseif(条件表达式3){动作C}else{动作D}动作A:条件表达式1成立时立即执行。动作B:条件表达式1不成立,但条件表达式2成立时才会执行。动作C:条件表达式1,2不成立,条件3成立时才会执行。动作D:是条件表达式1,2,3都不成立时才会执行。计算机科学与技术系★switch-case语句switch(条件表达式){case条件值1:动作1break;case条件值2:动作2break;case条件值3:动作3break;default:动作4break;}计算机科学与技术系switch内的条件表达式的结果必须为整数或字符。Switch用条件表达式的值来与各case的条件值对比,如果与某个条件值相符合,则执行该case的动作,之后一定要写break退出循环。如果所有的条件值都不符合,则执行default的动作,每一个动作之后一定要写break,否则会继续执行。另外case之后的条件值必须是数据常数,不能是变量,而且不可以重复,即条件值必须各不同,如果有数种case所做的动作一样时,也可以写在一起,即上下并列。一般当程序必须作多选1时,可以采用switch语句。计算机科学与技术系break:是跳出循环的命令,任何由switch、for、while、do-while构成的循环,都可以用break来跳出。必须注意的是break一次只能跳出一层循环,通常都和if连用,当某些条件成立后就跳出循环。default:当所有case的条件值都不成立时,就执行default所指定的动作,作完后也要使用break指令跳出switch循环。计算机科学与技术系★while循环语句while(条件表达式){动作}先测试条件表达式是否成立,当条件表达式为真时,则执行循环内动作,做完后又继续跳回条件表达式作测试,如此反复直到条件表达式为假为止,使用时要避免条件永远为真,造成死循环。计算机科学与技术系★do-while循环语句do{动作}while(条件表达式);先执行动作后,再测试条件表达式是否成立。当条件表达式为真,则继续回到前面动作,如此反复直到条件表达式为假为止,不论条件表达式的结果为何,至少会做一次动作,使用时要避免条件永远为真,造成死循环。计算机科学与技术系★for循环语句for(表达式1;表达式2;表达式3){动作}表达式1:通常是设定起始值。表达式2:通常是条件判断式,如果条件为真时,则执行动作,否则终止循环。表达式3:通常是步长表达式,执行动作完毕后,必须再回到这里做运算,然后再到表达式2做判断。计算机科学与技术系★goto语句:使用方法goto标号编写程序,尽量不要使用goto语句,以避免程序阅读困难。但是,break一次只能跳离一个循环,如果需要跳离很多循环,则可使用goto语句,但goto的目的位置必须在同一个程序文件内,不能跳到其他程序文件,标签的写法和变量是一样的,标签后面必须加一个冒号。goto经常和if连用,如果程序中检查到异常时,即使用goto语句去处理。计算机科学与技术系★2.6函数与中断子程序(FUNCTION)数据类型函数名称(数据类型参数1,数据类型参数2,......)所谓函数,即子程序,也就是“语句的集合”。就是说把经常使用的语句群定义为函数,在程序用到时调用,这样就可以减少重复编写程序的麻烦,也可以减少程序的长度。当一个程序太大时,建议将其中的一部分改用函数的方式比较好,因为大程序过于繁杂容易出错,而小程序容易调试,也易于阅读和修改。计算机科学与技术系C语言程序是由函数构成的,函数是C语言程序中的基本模块C51函数分为2类,一类是库函数,一类是用户定义函数。C51中函数的定义、参数和函数值及函数调用等内容与标准C语言基本相同,下面仅说明几个不同点。1.中断服务程序(interrupt修饰符的应用)为实现在C51源程序中直接编写中断程序,C51编译器允许用C语言创建中断服务程序。在C51编译器中增加了一个扩展关键字interrupt,在函数声明时包括interruptm,将把所声明的函数定义为一个中断服务程序。其格式为:void函数标识符(void)interruptm其
本文标题:第2章 C51语言程序设计
链接地址:https://www.777doc.com/doc-3972410 .html