《C的C语言程序设计基础实用.pptx》由会员分享,可在线阅读,更多相关《C的C语言程序设计基础实用.pptx(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教学目的通过本章学习,使学生:通过本章学习,使学生:理解单片机上的C语言和普通C语言的区别熟悉C51种关于中断函数和变量的存储类型、存储模式的特殊性掌握单片机实际应用过程中,将原来汇编语言写的源程序改写成C的源程序,最后能到自己用C语言独立完成实际任务的程序设计。第1页/共85页第5章80C51的C语言程序设计基础 单片机设计语言有:单片机设计语言有:机器语言汇编语言高级语言第2页/共85页机器语言 特点:特点:单片机能直接识别面向机器的硬件不同厂家、不同系列的单片机其指令系统也不同;第3页/共85页汇编语言 特点:特点:是一种用文字助记符来表示机器指令的符号语言最接近机器码的一种语言优点:利
2、于初学者掌握微机的硬件资源占用资源少、程序执行效率高、容易优化直接操作机器的硬件指令的执行速度快缺点:不易移植,可读性不强,不易于维护。第4页/共85页高级语言 特点:特点:它兼顾了多种高级语言的特点,并具备汇编语言的功能。有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。编译器丰富典型的是美国Franklin软件公司推出的Franklin C51就是专为MCS-51系列单片机设计的C编译器。第5页/共85页第5章80C51的C语言程序设计基础5.1C51程序设计的基础知识Franklin C51编译器是标准的Franklin C语言编译器专门为M
3、CS-51系列的单片机量身定做的一套精简的编译器,这就是通常所说的C51。它为C语言在嵌入式系统上的应用,提供了一种用编程的方法和途径。而这种简化的C语言又完全符合C语言的ANSI标准。第6页/共85页5.1.1C51的特点可以直接操作微机硬件程序可读性好,易于维护编程效率高目标代码质量高可移植性好模块化的程序设计在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。开发工具齐全第7页/共85页5.1.2C51中的标识符和关键字1标识符标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等等。标识符由字符串,数字和下划线等组成。2关键字关键字
4、则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外(见表5-1),根据51单片机的特点,又扩展了如表5-2所列举的13个特殊关键字。其实在KEIL uVision2的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。第8页/共85页标识符建立和定义的时候,要注意以下四点:标识符的长度最长可以达到255个字符尽量要做到见名思义严格区分大小写第一个字符必须是字母或下划线第9页/共85页C51编译器中能识别的扩展关键字 关键字关键字用途用途说明说明bit位标量
5、声明位标量声明声明一个位标量或位类型的函数声明一个位标量或位类型的函数sbit位标量声明位标量声明声明一个可位寻址变量声明一个可位寻址变量Sfr特殊功能寄存器声明特殊功能寄存器声明声明一个声明一个8位的特殊功能寄存器位的特殊功能寄存器Sfr16特殊功能寄存器声明特殊功能寄存器声明声明一个声明一个16位的特殊功能寄存器位的特殊功能寄存器data存储器类型说明存储器类型说明说明一个变量在直接寻址的内部数据存储器说明一个变量在直接寻址的内部数据存储器bdata存储器类型说明存储器类型说明说明一个变量在可位寻址的内部数据存储器说明一个变量在可位寻址的内部数据存储器idata存储器类型说明存储器类型说明
6、间接寻址的内部数据存储器间接寻址的内部数据存储器pdata存储器类型说明存储器类型说明分页寻址的外部数据存储器分页寻址的外部数据存储器xdata存储器类型说明存储器类型说明说明一个变量在外部数据存储器说明一个变量在外部数据存储器code存储器类型说明存储器类型说明程序存储器程序存储器interrupt中断函数说明中断函数说明定义一个中断函数定义一个中断函数reentrant再入函数说明再入函数说明定义一个再入函数定义一个再入函数using寄存器组定义寄存器组定义定义定义80C51芯片的工作寄存器芯片的工作寄存器第10页/共85页5.2 C51中的数据类型char字符类型nt整型long长整型f
7、loat浮点型指针型bit位标量sfr特殊功能寄存器sfr16 16位特殊功能寄存器sbit特殊功能位第11页/共85页5.2 C51中的数据类型数据类型数据类型名称名称长度长度值域值域unsigned char无符号字符无符号字符单字节单字节0255signed char有符号字符有符号字符单字节单字节-128+127unsigned int无符号整型无符号整型双字节双字节065535signed int有符号整型有符号整型双字节双字节-32768+32767unsigned long无符号长整型无符号长整型四字节四字节04294967295signed long有符号长整型有符号长整型四字
8、节四字节-2147483648+2147483647float浮点型浮点型四字节四字节1.175494E-383.402823E+38*一般指针一般指针13字节字节对象的地址对象的地址bit位型位型位位0或或1sfr8位特殊功能寄位特殊功能寄存器存器单字节单字节0255sfr1616位特殊功能位特殊功能寄存器寄存器双字节双字节065535sbit可编程的位可编程的位位位0或或1第12页/共85页5.2.1、char字符类型长度:一个字节功能:定义处理字符数据的变量或常量分类:无符号字符类型unsigned char有符号字符类型signed char默认值为signed char类型注意:当定
9、义一个变量为字符数据类型时,在程序使用该变量不应使它的值超过它的值域不能赋超出0255第13页/共85页5.2.2int整型长度:两个字节功能:存放一个双字节数据分类:符号整型signed int无符号整型unsigned int默认值为signed int类型。第14页/共85页5.2.2int整型(续)范围:signed int:-32768+32767字节中最高位表示数据的符号,“0”表示正数,“1”表示负数unsigned int:范围是065535。注意:如果C51的程序,出现延时或循环体次数的错误,都可能是因为字符型和整型的数据类型运用得不恰当,解决的办法是可以把变量的类型由原来的
10、字符型或整型换成另外一种。第15页/共85页关于整型和字符型,可以通过下面的程序继续得以区分:main()char i;/char和int 这里的时间延时是不一样的P1=0X55;while(1)P1=P1;for(i=0;i1000;i+);char类型下面的for语句执行一次循环要3个机器周期int类型则要5个机器周期第16页/共85页5.2.35.2.3longlong长整型长整型长度:四个字节功能:存放一个四字节数据分类:有符号长整型signed long无符号长整型unsigned long默认值为signed long类型分为:signed int:-2147483648+2147
11、483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数unsigned long:04294967295第17页/共85页5.2.4float浮点型长度:四个字节依次存放数的符号(占用1位)阶码(占用8位)尾码(占用23位)功能:存放一个4字节的数据第18页/共85页float浮点数据类型在内存中具体的存放格式如下:字节地址字节地址+3+2+1+0浮点数内容格式浮点数内容格式S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMS代表数的符号位代表数的符号位“1”表示负表示负“0”表示正表示正E代表阶码代表阶码占占用用8个个位位,E大大于于127,则则将将结结果
12、果减减127作作为为2的的指指数数,若若小小于于127,则则用用127减减结结果果然然后后作作为为2的指数;的指数;M代表精度为代表精度为23位的尾数位的尾数第19页/共85页5.2.5指针型长度:一般为13个字节特点:指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元分类:一般指针(Generic Pointer)存储器指针(Memory_Specific Pointer)第20页/共85页1一般指针特点:一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型一般指针本身用3个字节存放,分别存放:存储器类型高位偏移低位偏移量例句:l
13、ong*state;为一个指向long型整数的指针,而state本身则依存储模式存放。第21页/共85页2存储器指针特点:利用存储类型的关键字指定存储类型指针本身只需一个字节或2个字节存放偏移量例如:chardata*str;str指向data区中char型数据intxdata*pow;pow指向外部RAM的int型整数。char*xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。第22页/共85页5.2.6bit位标量长度:一个二进制位范围:只有两个结果:不是“0”就是“1”功能:存储一些单片机的中间位处理结果注意:bit位标量是C51编译器的一种扩充数据
14、类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。第23页/共85页5.2.7sfr特殊功能寄存器长度:一个字节范围:是0255功能:利用sfr可以访问51单片机内部的所有特殊功能寄存器第24页/共85页5.2.7sfr特殊功能寄存器(续)具体格式为:sfr特殊功能寄存器名=特殊功能寄存器地址常数;特点:这种数据类型通常用在C51的头文件中,用来定义特殊功能寄存器,这样在C的源程序中,就可以直接引用这些特殊功能寄存器了。第25页/共85页表5-451系列单片机的特殊功能寄存器符号地址注释*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序状态字SP81H堆栈指针DPL82
15、H数据存储器指针低8位DPH83H数据存储器指针高8位*IEA8H中断允许控制器*IPD8H中断优先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H电源控制及波特率选择*SCON98H串行口控制器SBUF99H串行数据缓冲器*TCON88H定时器控制TMOD89H定时器方式选择TL08AH定时器0低8位TL18BH定时器1低8位TH08CH定时器0低8位TH18DH定时器1高8位第26页/共85页5.2.8sfr16 16位特殊功能寄存器长度:占用两个内存单元范围:是065535功能:定义两个字节长度的特殊功能寄存器具体格式为:sfr16特殊功能寄存
16、器名=特殊功能寄存器地址常数;第27页/共85页5.2.9sbit特殊功能位长度:一个二进制位功能:访问芯片内部RAM中可寻址的空定义单片机某些I/O引脚,以完成对单片机的I/O控制例句:sbitkey=P10;if(key)便可对P1端口的P1.1引脚进行直接操作第28页/共85页5.3C51中的常量定义:常量是在程序执行过程中其值不能改变的量。分类:整型常量浮点型常量字符串型常量 位标量 第29页/共85页5.3.1整型常量表示方法:八进制用0开头十六进制则以0 x开头而默认的格式是十进制数在C51中不能直接处理二进制常量。例句:十进制数100,表示成十六进制是0 x64八进制就应该写成0
17、144第30页/共85页5.3.2浮点型常量分类:十进制基本型组成:数字小数点如0.888,3345.345,0.0等特点:整数或小数部分为0,可以省略但必须有小数点。指数标准形式数字.数字e数字如125e3,7e9,-3.0e-3。第31页/共85页5.3.3字符型常量特点:单引号内的字符不可以显示的控制字符,可以在该字符前面加一个反斜杠“”,组成专用转义字符,进而使之显示,常用转义字符表请看表5-5所示。例句:如a,d第32页/共85页表5-5常用转义字符转义字符转义字符含义含义ASCII码(码(16/10进制)进制)o空字符空字符(NULL)00H/0n换行符换行符(LF)0AH/10r
18、回车符回车符(CR)0DH/13t水平制表符水平制表符(HT)09H/9b退格符退格符(BS)08H/8f换页符换页符(FF)0CH/12单引号单引号27H/39双引号双引号22H/34反斜杠反斜杠5CH/92第33页/共85页5.3.4字符串型常量特点:由双引号内的字符组成引号内的没有字符时,为空字符串在C中字符串常量是字符串常量A和字符常量A是不同的,前者在存储时多占用两个字节的空间,而后者只占用一个字节的空间。功能:做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o转义字符,以作为该字符串的结束符。例句:如“test”,“OK”等,都属于字符串类型的常量第34页/共85页5
19、.3.5位标量取值:位标量的值是一个二进制数。定义的语法结构:bit标量名作用:是定义一个标量,用来表示某个二进制位的值例句:bit flag/定义一个位标量flag,作为程序中的一个标志位第35页/共85页5.3.6常量的定义常量的定义最常使用的方式有以下两种:1、用宏定义语句#difine False 0 x0;/用预定义语句可以定义常量#difine True 0 x1;/这里定义False为0,True为1/在程序中用到False编译时自动用0替换,同理True替换为1第36页/共85页5.3.6常量的定义(续)常量的定义最常使用的方式有以下两种:2、用赋值语句unsigned int
20、 code a=100;/这一句用code把a定义在程序存储器中并赋值,因为程序存储器只读的特性,所以a在程序执行的过程中值始终都是100,不允许修改,这样a也相当于一个常量。const unsigned int c=100;/用const定义c为无符号int常量并赋值第37页/共85页5.4C51中的变量及其存储模式5.4.1 C51中的变量定义:变量是在程序执行过程中其值可以变化的量。特点:变量的值可能因为程序执行不同的语句,而有不同的结果,也可能由硬件的动作状态所制约要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。第3
21、8页/共85页定义一个变量的格式定义一个变量的格式如下:存储种类数据类型存储器类型变量名表1、存储种类有四种:自动(auto)外部(extern)静态(static)寄存器(register)缺省类型为自动(auto)2、数据类型和我们在前面提到的名种数据类型的定义是一样的。第39页/共85页5.4.2C51中存储器类型数据类型决定变量的空间大小存储器类型决定变量的空间位置第40页/共85页5.4.2.1 存储器类型KEIL uVision2中给用户提供了3大块儿不同的存储空间:程序存储器空间片内数据存储器空间片外数据存储器空间存储类型的分类:CODEDATABDATAIDATAXDATA如图
22、5-1所示,给出了每块儿存储器空间上分布的相应存储器类型。第41页/共85页图5-151单片机内部存储空间对应的存储类型第42页/共85页1、CODE存储器类型变量位置:程序存储器的整个64K字节范围特点:变量的值只能访问和引用,不能修改如同汇编语言中以下两天指令:MOVCA,A+DPTRMOVCA,A+PC第43页/共85页2、DATA存储器类型变量位置:变量存储在内部低128字节RAM地址空间特点:在这个区内,指令用一个或两个周期来访问数据,是所有区内访问速度最快的一个使用比较频繁的变量或局部变量存储在DATA区中必须节省使用DATA区的空间,因为它的空间毕竟有限的。第44页/共85页3、
23、BDATA存储器类型变量位置:片内数据存储器从地址20H开始到2FH特点:包括16个字节,共128个可以寻址的位每一位都可单独寻址第45页/共85页4、IDATA存储器类型变量位置:片内数据存储器空间间接寻址区特点:可以访问全部内部数据存储器空间在IDATA区内的变量,在汇编语言中只能通过间接寻址来访问。在汇编语言中是通过R0和R1采用间接寻址,来访问这个区的,R0和R1被作为指针,将要恢复或改变字节的地址放入R0或R1中。根据源操作数和目的操作数的不同,执行指令需要一个或两个周期。第46页/共85页5、XDATA存储器类型变量位置:外部RAM一些I/O接口范围:64K字节特点:读写操作需要至
24、少两个处理周期使用DPTR、R0或R1汇编语言指令,都可以定义成属于这个区域的变量第47页/共85页5.4.3C51中存储模式作用:决定了变量的默认存储类型C51提供了这3种存储器模式来存储变量:SMALLCOMPACTLARGE如果省略存储器类型第48页/共85页1、SMALL存储模式名称:这是C51默认的一种模式,也叫小模式特点:C51把所有函数变量和局部数据段,以及所有参数传递,都放在内部数据存储器DATA区中数据访问非常快地址空间受限第49页/共85页2、COMPACT存储模式名称:又称为压缩的存储模式特点:所有的函数和程序变量和局部数据段定位在51单片机系统的外部数据存储区外部数据存
25、储区分页访问,每页256字节,最多256页如果不加说明的变量,将被分配在PDATA区中将扩充能够使用的RAM数量,对XDATA区以外的数据存储仍然是很快的第50页/共85页3LARGE存储模式名称:也叫大模式特点:所有函数和过程的变量和局部数据段,都定位在51单片机系统的外部数据存储器中容量最多可支持64KB要求使用DPTR数据指针访问数据或定义成XDADA的存储器类型。第51页/共85页关于存储模式的设置,我们要注意以下点:(1)如果用参数传递和分配再入函数的堆栈,应尽量使用SMALL存储模式(2)可以使用混合存储模式第52页/共85页5.5C51中的中断函数C51中的函数声明除了一般函数以
26、外,还对标准的C作了扩展,具体包括:中断函数再入函数第53页/共85页5.5.1一般函数组成:函数说明函数体一般结构如下:函数类型 函数名(函数参数表)/*函数说明*/说明语句部分;执行语句部分;/*函数体部分*/第54页/共85页5.5.1一般函数(续)其中:.表示可选项(即可以指定,也可以缺省)类型和变量的数据类型相同,表示函数的返回值。函数说明部分,由函数类型、函数名和函数参数表三部分组成,其中函数参数表的格式为:数据类型 形参,数据类型 形参2在函数说明部分的下面、大括号(必须配对使用)内的部分。函数体第55页/共85页函数体一般由说明语句和执行体两部分构成:1、说明语句部分组成变量定
27、义自定义类型定义自定义函数说明外部变量说明2、执行体执行体一般由若干条可执行语句构成。还可以强行指定函数的存储模式,主要由small、compact及large来说明,例如:void fun1(void)small第56页/共85页5.5.2中断函数中断函数的功能:提高系统的运行效率声明格式:函数类型 函数名(参数表)interrupt nusing n其中关键字interrupt后面的n是中断号,n的取值范围是031。编译器从8n+3处,正好是对应中断源的入口地址处,产生中断向量,具体的中断号n和中断向量取决于不同的51系列单片机芯片。80C51的中断源和中断向量如表5-6所示。第57页/共
28、85页表5-6常用的中断源和中断向量n中断源中断源中断向量中断向量8n+30外部中断源外部中断源00003H1定时器定时器T0中断中断000BH2外部中断源外部中断源10013H3定时器定时器T1中断中断001BH4串行口中断串行口中断0023H第58页/共85页定义和使用中断函数,需要注意以下几点:1、为提高代码的容错能力和系统的抗干扰能力,通常把没用到的中断源,写成下列形式的中断函数。voide xtern0_ISR()interrupt 0/*not used*/Void timer0_ISR()interrupt1/*not used*/Void extern1_ISR()interr
29、upt2/*not used*/void timer1_ISR()interrupt 3/*not used*/void serial_ISR()interrupt4/*not used*/第59页/共85页定义和使用中断函数,需要注意以下几点(续)2、中断函数没有返回值3、中断函数不能进行参数传递。4、中断函数在任何情况下,都不能被其他任何函数直接调用。5、在中断函数中可以调用其它非中断函数。但要注意其它非中断函数和中断函数必须使用一个工作寄存器组。第60页/共85页5.5.35.5.3再入函数再入函数定义:可以在函数体内直接或间接调用其自身的一种函数。特点:在一个一般的函数后面加个扩展的关
30、键字reentrant第61页/共85页可以用以下两种方法解决函数重入:1、在相应的函数前使用前述“#pragma disable”声明,即只允许主程序或中断之一调用该函数;2、将该函数说明为可再入的。如下:void func(param.)reentrant;注意:通常中断使用与主程序不同的工作寄存器组。另外,对可再入函数,在相应的函数前面加上开关“#pragma noaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。第62页/共85页5.6C程序和汇编语言程序的结合结合原因:假设你要执行的操作很难用C代码来完成具体过程:Keil C51的某个项目文件,对应的选项卡
31、上,找到“Generate Assembler SRC File”和“Assemble SRC File”两项检查是否设为有效,若是有效的,则点击使检查框变成无效状态,这样再次编译这个项目文件,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了第63页/共85页5.6C程序和汇编语言程序的结合(续)在C51源代码中嵌入如下汇编代码即可:#pragma ASM汇编语言的指令序列#pragma ENDASM注意这里的大小写第64页/共85页5.7典型设计要求的C语言实现方法这里我们用一个电子日历的实际例子,来具体介绍怎样用C51程序,完成实际任务的设计。例子中用四位数码管
32、显示日历中的月份和日期,分别由四片74LS164连接,受单片机的串行口控制。详细电路原理图,见图5-2所示。第65页/共85页图5-2电子日历电路原理图第66页/共85页电子日历源程序下面是用C语言写的源程序:li()/判断月份是否大于12月,如果大于再次从1月显示voidtimer0()interrupt1/定时器T0的中断函数 disp()/控制串行口输出显示的函数main()/系统的主函数第67页/共85页5.8C51程序设计的几点注意事项1在软件编程和调试时尽可能使用Small模式编译2在仿真前做好充分的准备3使用库函数4使用const5使用static6不要忽视编译器的警告编译器的给
33、出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。7代码优化第68页/共85页1、在软件编程和调试时尽可能使用Small模式编译对比起Large模式和Compact模式,Small模式能生成更为紧凑的代码。在Small模式下,C51编译器将没有使用关键词,如idata、pdata、xdata特殊声明的变量通通放在data单元中。第69页/共85页2、在仿真前做好充分的准备程序编完后,对代码仔细逐行检查对每个子函数进行单独测试如果代码有修改,再次对代码进行检查。有可能的话,进行软件仿真Keil C的软件仿真功能十分强大。第70页/共85页3、使用库函数重用代码,尤其是是标准库的
34、代码,而不是手工编写你自己的代码。这样更快、更容易也更安全。Keil C中提供了多个库函数,这些库函数的用法在Keil C的帮助文件中有详细的描述。第71页/共85页4、使用const意义:可以防止,无意中错误的赋值可以防止,在作为参数,将指针传递给函数时,可能会修改了本不想改变的指针所指向对象的值。例如:constintnum=7;num=9;/*可能得到编译器的警告。*/第72页/共85页5、使用static意义:命名冲突的有用工具将不会和其他模块,可能具有相同名称的函数和变量,在模块连接时,产生名称冲突。将子程序中的变量使用static修饰时,表示这个变量在程序开始时分配内存,在程序结束
35、时释放,它们在程序执行期间保持它们的值。第73页/共85页6、不要忽视编译器的警告编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。第74页/共85页7、代码优化具体可以从以下几个方面考虑:采用短变量使用无符号类型避免使用浮点指针使用位变量用局部变量代替全局变量为变量分配内部存储区使用特定指针使用调令使用宏替代函数合理选择存储器类型。充分利用运行库第75页/共85页本章小结这章主要介绍了用C51编程的一些基础知识C51关键字五种存储类:DATA、BDATA、IDATA、XDATA和CODE三个存储模式:SMALL、COMPACT和LARGE中断函数具体格式是:函数类
36、型函数名(函数参数表)interrupt nusing n第76页/共85页本章习题5.1、在C51中,有几种存储类型?分别是什么?有几种存储器类型?有什么作用?他们的名称是什么?什么又是存储模式?有何意义?可以分成哪些模式?5.2、51单片机对应的五个中断源它们的中断函数因该怎样定义?5.3、中断函数可否定义成再入函数?第77页/共85页本章习题(续1)5.4在定义函数的时候能否强行指定存储模式,如果能应怎样把某个函数指定成压缩的存储模式?5.5在汇编语言中MOVDPTR,#4000HMOVXDPTR,A两条语句想实现什么功能,如果用C语言语句编程也实现同样的功能,应如何编程?第78页/共8
37、5页本章习题(续2)5.6请把下面这段汇编语言的程序要完成的功能用语言的程序写出相同的功能。MOVTL0,#0CEHMOVTH0,#0CEHMOVTMOD,#02HSETBEASETBET0SETBTR0SJMP$第79页/共85页本章习题(续3)5.7在语言中能不能嵌入汇编语言的语句?如果能应该怎样实现?5.8如果想把单片机片外数据存储器中,以地址为3000H单元开始的,10个字节的数据移动到中片内30H开始的数据存储器中,试写出C语言的核心程序。第80页/共85页部分习题答案5.1、在C51中,有五种存储器类型,分别是:CODEDATABDATAIDATAXDATA存储模式作用:决定了变量
38、的默认存储类型C51提供了这3种存储器模式来存储变量:SMALLCOMPACTLARGE5.2、voide xtern0_ISR()interrupt 0/*not used*/Void timer0_ISR()interrupt1/*not used*/Void extern1_ISR()interrupt2/*not used*/void timer1_ISR()interrupt 3/*not used*/void serial_ISR()interrupt4/*not used*/5.3、可以定义,但必须用以下两种方法处理:1在相应的函数前使用前述“#pragma disable”声明
39、,即只允许主程序或中断之一调用该函数;2将该函数说明为可再入的。第81页/共85页部分习题答案(续1)5.4、答:可以,压缩的存储模式可以在源程序中用语句直接定义,也可以在C51的源程序调试集成软件环境中,通过对某个项目文件的选项设置。5.5、答:2条语句是将A 中的数据输出到外部4000H地址单元如果用C语言语句编程也实现同样的功能,编程如下:int xdata *p;P=0 x4000;*p=A;第82页/共85页部分习题答案(续2)5.6、答:C51源程序如下:TL0=0 xCE;TH0=0 xCE;TMOD=02;EA=1;ET0=1;TR0=1;while(1);第83页/共85页部分习题答案(续3)5.7、答:可以具体2件事:在Keil C51的某个项目文件,对应的选项卡上,找到“Generate Assembler SRC File”和“Assemble SRC File”两项,选中在C51中嵌入如下汇编代码即可:#pragma ASM汇编语言的指令序列#pragma ENDASM5.8、答:int xdata *pw;char*pn,times;pw=0 x3000;pn=0 x30;For(times=0;times10;times+)*pn=*pw;pn+;pw+;第84页/共85页感谢您的欣赏!第85页/共85页
限制150内