版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 单片机的C语言应用程序设计 第7章 单片机的C语言应用程序设计 7.1 C语言与语言与MCS-517.2 C51信息类型及在信息类型及在MCS-51中的存储方式中的存储方式7.3 C51信息的存储类型与信息的存储类型与MCS-51存储结构存储结构7.4 MCS-51特别功能寄存器特别功能寄存器(SFR)的的C51定义定义7.5 MCS-51同时行接口的同时行接口的C51定义定义7.6 位变量的位变量的C51定义定义7.7 C51组织信息类型组织信息类型7.8 模块化程序开发环节模块化程序开发环节7.9 MCS-51内部资源使用的内部资源使用的C语言编程语言编程7.10 MCS-51片外
2、扩展的片外扩展的C语言编程语言编程7.11 次数量测量的次数量测量的C语言编程语言编程7.12 MCS-51机间通信的机间通信的C语言编程语言编程7.13 键盘和数码表现人机交互的键盘和数码表现人机交互的C语言编程语言编程第7章 单片机的C语言应用程序设计 7.1 C语言与语言与MCS51 用汇编程序设计MCS51系列单片机应用程序时,必须要思考其存储器结构,特别必须思考其片内信息存储器与特别功能寄存器精确、公道的使用以及按现实地址操作端口信息.用C语言编写MCS51单片机的应用程序,固然不像用汇编语言那样具体地组织、安排存储器资源和操作端口信息,但在C语言编程中,对信息类型与变量的定义,必须
3、要与单片机的存储结构相关联,否那么编译器不能精确地映射定位.用C语言编写单片机应用程序与编写规格的C语言程序的差别之处便在于依照单片机存储结构及内部资源定义相应的C语言中的信息类型和变量,其它的语法规定、程序结构及程序设计方式都与规格的C语言程序设计一样. 第7章 单片机的C语言应用程序设计 用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),变形生成单片机可履行的代码程序.撑持MCS51系列单片机的C语言编译器有非常多种.似American Automation、Auocet、BSOTASKING、DUNFIELD SHAREWARE、KEILFranklin等.其中KEILFr
4、anklin以它的代码紧凑和使用方便等特点优于其它编译器.本章是面向这种编译器讲解 MCS51单片机C语言程序设计. 第7章 单片机的C语言应用程序设计 7.2 C51信息类型及在信息类型及在MCS-51中的存储方式中的存储方式7.2.1 C51的信息类型的信息类型 Franklin C51编译器具体撑持的信息类型有编译器具体撑持的信息类型有:位型位型(bit)、无、无符号字符符号字符(unsigned char)、有符号字符、有符号字符(singed char)、无符号整、无符号整型型(unsigned int )、有符号整型、有符号整型(signed int )、无符号长整型、无符号长整型
5、(unsigned long )、有符号长整型、有符号长整型(signed long )、浮点型、浮点型(float)和和指针类型等指针类型等.第7章 单片机的C语言应用程序设计 表表7.1 Franklin C51的信息类型的信息类型信息类型长度(bit)长度(byte)值域bit110,1unsigned char810255signed char81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3
6、241.176E383.40E+38(6位数字)double6481.176E383.40E+38(10位数字)一样指针243存储空间065535第7章 单片机的C语言应用程序设计 7.2.2 C51信息在信息在MCS-51中的存储方式中的存储方式 位变量(bit):与MCS-51硬件特性操纵有关的能够定义成位变量.位变量必须定位在MCS-51单片机片内RAM的位寻址空间中. 字符变量(char):字符变量的长度为1 byte即8位.这非常符合MCS-51单片机,因为MCS-51单片机每次可操作8位信息.对无符号变量(unsigned char)的值域范畴是0255.对有符号字符变量(sign
7、ed char),最具有重要意义的位是最高位上的符号标记位(msb).此位为1代表负,为0代表正.有符号字符变量和无符号字符变量在示意0127的数值时,其含义是一样的,根基上00 x7F.负数一样用补码示意,即用11111111示意-1, 用11111110示意-2.当履行乘除法运算时,符号咨询题便变得非常复杂,而C51编译器会自动地将相应的库函数调入程序中来解决那个咨询题.第7章 单片机的C语言应用程序设计 整型变量(int): 整型变量的长度为16位.与8080和8086 CPU系列差别,MCS-51系列单片机将int型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字节中.有符
8、号整型变量(signed int)也使用msb位作符号标记位,同时使用二进制补码示意数值.可直截了当使用几种专用的机器指令来完成多字节的加、减、乘、除运算.整型变量值0 x1234以图7.1所示的方式存放在内存中.第7章 单片机的C语言应用程序设计 图7.1 整型数的存储结构 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 图7.2 长整型变量的存储结构 第7章 单片机的C语言应用程序设计 浮点型变量(float): 浮点型变量为32位,占4个字节,很多复杂的数学表达式都采纳浮点变量信息类型.应用符号位示意数的符号,用阶码和尾数示意数的大小.
9、用它们履行任何数学运算都需要使用由编译器决意的各种差别功效等级的库函数.Franklin C51的浮点变量信息类型的使用标准与IEEE-754规格有关,具有24位精度,尾数的高位始终为1,因而不保留,位的分布似下: 1位符号位. 8位指数位. 23位尾数. 第7章 单片机的C语言应用程序设计 符号位是最高位,尾数为低23位,内存中按字节存储次序似下:地址地址+0+1+2+3内容内容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE 其中,S为符号位,1示意负,0示意正;E为阶码;M为23位尾数,最高位为1. 浮点变量值 -12.5的十进制为:0 xC1480000,它按图7.3所
10、示方式存于内存中.第7章 单片机的C语言应用程序设计 0 x000 x000 x480 xC1.+0+1+2+3地址 图7.3 浮点数的存储结构 第7章 单片机的C语言应用程序设计 在编程时,似果只突出运算速度而不履行负数运算时,最好采纳无符号(unsigned)标准. 无符号字符类型的使用:不管何时,应完大概使用无符号字符变量,因为它能直截了当被MCS-51所同意.基于同样的缘由,也应完量使用位变量.有符号字符变量固然也只占用一个字节,但需要履行额外的操纵来履行检验代码的符号位.这无疑会落低代码功效.第7章 单片机的C语言应用程序设计 使用简化形式定义信息类型.其方式是在源程序开头使用#de
11、fine语句自定义简化的类型标识符.例似:#define uchar unsigned char #define uint unsigned int 如此,在编程中,便能够用uchar代替unsigned char,用uint代替unsigned int来定义变量.第7章 单片机的C语言应用程序设计 7.3 C51信息的存储类型与信息的存储类型与MCS-51存储结构存储结构表表 7.2 C51存储类型与存储类型与MCS-51存储空间的对应关系存储空间的对应关系存储类型与存储空间的对应关系 data 直截了当寻址片内信息存储区,会见速度快(128字节) bdata 可位寻址片内信息存储区,许可位
12、与字节混合会见(16字节) idata 间接寻址片内信息存储区,可会见片内全部RAM地址空间(256字节) pdata 分页寻址片外信息存储区(256字节)由MOV Ri会见(i=0,1) xdata 片外信息存储区(64 KB)由MOVX DPTR会见 code 程序存储器64 KB空间,由MOVC DPTR会见第7章 单片机的C语言应用程序设计 表表7.3 C51存储类型及其信息长度和值域存储类型及其信息长度和值域存储类型长度(bit)长度(byte)值域范畴data810255idata810255pdata810255xdata162065 535code162065 535第7章 单
13、片机的C语言应用程序设计 带存储类型的变量的定义的一样标准为 信息类型 存储类型 变量名带存储类型的变量定义举例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;第7章 单片机的C语言应用程序设计 表表 7.4 存储模式讲明存储模式讲明存储模式讲 明SMALL默认的存储类型是data,指标及局部变量放入可直截了当寻址片内RAM的用户区中(最大128字节).另外全部对象(包罗堆栈),都必须嵌入片内RAM.栈长非常关键,因为现实栈长依靠于函数嵌套调用层数C
14、OMPACT默认的存储类型是pdata,指标及局部变量放入分页的外部信息存储区,通过R0或R1间接会见,栈空间位于片内信息存储区中LARGE默认的存储类型是xdata,指标及局部变量直截了当放入片外信息存储区,使用信息指针DPTR来履行寻址.用此信息指针履行会见功效较低,特别对两个或多个字节的变量,这种信息类型的会见机制直截了当作用代码的长度第7章 单片机的C语言应用程序设计 7.4 MCS-51特别功能寄存器特别功能寄存器(SFR)的的C51定义定义 MCS-51单片机中,除了程序计数器PC和4组任务寄存器组外,其它全部的寄存器均为特别功能寄存器(SFR),稀散在片内RAM区的高128字节中
15、,地址范畴为80H0FFH.SFR中有11个寄存器具有位寻址功底,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的. 为了能直截了当会见这些SFR,Franklin C51提供了一种自主形式的定义方式,这种定义方式与规格C语言不兼容,只合用于对MCS-51系列单片机履行C语言编程.特别功能寄存器C51定义的一样语法标准似下:sfr sfr-name = int constant;第7章 单片机的C语言应用程序设计 sfr是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特别功能寄存器名,=背面必须是一个整型常数,不许可带有运算符的表达式,是特别功能寄存器sfr-name的字
16、节地址,那个常数值的范畴必须在SFR地址范畴内,位于0 x800 xFF.例似:sfr SCON=0 x98; * 串口操纵寄存器地址98H *sfr TMOD=0 x89;* 守时器计数器方式操纵寄存器地址89H *第7章 单片机的C语言应用程序设计 MCS-51系列单片机的特别功能寄存器的数量与类型不完一样,所以定见将全部特别的sfr定义放入一个头文件中,该文件应包罗MCS-51单片机系列机型中的SFR定义.C51编译器的reg51.h头文件便是如此一个文件. 在新的MCS-51系列产物中,SFR在功能上常常组合为16位值,当SFR的高字节地址直截了当位于低字节之后时,对16位SFR的值能
17、够直截了当履行会见.例似52子系列的守时器计数器2便是这种情况.为了有效地会见这类SFR,可使用关键字sfr16来定义,其定义语句的语法标准与8位SFR一样,只是=背面的地址必须用16位SFR的低字节地址,即低字节地址做为sfr16的定义地址.第7章 单片机的C语言应用程序设计 例似: sfr16 T2 = 0 xCC *守时器计数器2:T2低8位地址为0CCH,T2高8位地址为0CDH* 这种定义合用于全部新的16位SFR,但不能用于守时器计数器0和1. 对位寻址的SFR中的位,C51的扩充功能撑持特别位的定义,像SFR一样不与规格C兼容,使用sbit来定义位寻址单元.第7章 单片机的C语言
18、应用程序设计 第一种标准: sbit bit-name = sfr-nameint constant; sbit是定义语句的关键字,后跟一个寻址位符号名(该位符号名必须是MCS-51单片机中规定的位标题),=后的sfr-name必须是已定义过的SFR的名字,后的整常数是寻址位在特别功能寄存器sfr-name中的位号,必须是07范畴中的数.例似: sfr PSW=0 xD0 ; * 定义PSW寄存器地址为D0H * sbit OV=PSW2 ; * 定义OV位为PSW.2,地址为D2H * sbit CY=PSW7 ; * 定义CY位为PSW.7,地址为D7H *第7章 单片机的C语言应用程序设
19、计 第二种标准:sbit bit-name = int constantint constant; =后的int constant为寻址地址位所在的特别功能寄存器的字节地址,符号后的int constant为寻址位在特别功能寄存器中的位号.例似: sbit OV=0XD02 ;* 定义OV位地址是D0H字节中的第2位 * sbit CY=0XD07 ;* 定义CY位地址是D0H字节中的第7位 *第7章 单片机的C语言应用程序设计 第三种标准:sbit bit-name = int constant; =后的int constant为寻址位的绝对位地址.例似: sbit OV=0XD2 ;* 定
20、义OV位地址为D2H * sbit CY=0XD7 ;* 定义CY位地址为D7H * 特别功能位代表了一个独站的定义类,不能与其它位定义和位域交流.第7章 单片机的C语言应用程序设计 7.5 MCS-51同时行接口的同时行接口的C51定义定义 MCS-51系列单片机同时行IO接口除了芯片上的4个IO口(P0 P3)外,还能够在片外扩展IO口.MCS-51单片机IO口与信息存储器同一编址,即把一个IO口当作信息存储器中的一个单元来看待. 使用C51履行编程时,MCS-51片内的IO口与片外扩展的IO能够同一在一个头文件中定义,也能够在程序中(一样在最先的位置)履行定义,其定义方式似下: 对MCS
21、-51片内IO口按特别功能寄存器方式定义.例似:sfr P0=0 x80 ; * 定义P0口,地址为80H *sfr P1=0 x90 ; * 定义P1口,地址为90H *第7章 单片机的C语言应用程序设计 对片外扩展IO口,那么依照硬件译码地址,将其视做为片外信息存储器的一个单元,使用#define语句履行定义.例似#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中绝对地址会见函数的头文件,将PORTA定义为外部IO口,地址为 FFC0H,长度为8位. 一旦在头文件或程序中对这些片外IO口履行定义后,在程序中便能够自由使用变量名与事实上际地址
22、的联系,以便使程序员能用软件模拟MCS-51的硬件操纵.第7章 单片机的C语言应用程序设计 (1) 位变量C51定义.使用C51编程时,定义了位变量后,便能够用定义了的变量来示意MCS-51的位寻址单元. 位变量的C51定义的一样语法标准似下: 位类型标识符(bit) 位变量名; 例似:bit direction_bit ;* 把direction_bit定义为位变量 *bit look_pointer ;* 把look_pointer定义为位变量 *7.6 位变量的位变量的C51定义定义第7章 单片机的C语言应用程序设计 (2) 函数可见谅类型为bit的指标,也能够将其做为返回值.例似: b
23、it func(bit b0, bit b1) * 变量b0,b1做为函数的指标 * return (b1); * 变量b1做为函数的返回值 * 注重,使用(#pragma disable)或见谅明白的寄存器组切换(using n)的函数不能返回位值,否那么编纂器将会给出一个错误信息.第7章 单片机的C语言应用程序设计 (3) 对位变量定义的限制.位变量不能定义成一个指针,似不能定义:bit * bit_pointer.不存在位数组,似不能定义:bit b_array . 在位定义中,许可定义存储类型,位变量都被放入一个位段,此段总位于MCS-51片内的RAM区中.所以,存储类型限制为data
24、和idata,似果将位变量的存储类型定义成其它存储类型都将编译犯错.第7章 单片机的C语言应用程序设计 例例1 先定义变量的信息类型和存储类型先定义变量的信息类型和存储类型:bdata int ibase; * 定义定义ibase为为bdata整型变量整型变量 *bdata char bary4;* bary4定义为定义为bdata字符型数组字符型数组 *接着可使用接着可使用sbit定义可独站寻址会见的对象位定义可独站寻址会见的对象位:sbit mybit0 = ibase0 ;* mybit0定义为定义为ibase的第的第0位位 *sbit mybit15 = ibase15; * mybi
25、t0定义为定义为ibase的第的第15位位 *sbit Ary07 = bary07 ; * Ary07定义为定义为abry0的第的第7位位 *sbit Ary37 = bary37 ; * Ary37定义为定义为abry3的第的第7位位 *第7章 单片机的C语言应用程序设计 对象ibase和bary也能够字节寻址: ary37=0; * bary3的第7位赋值为0 * bary3=a; * 字节寻址,bary3 赋值为a * sbit定义要位寻址对象所在字节基址对象的存储类型为bdata,否那么只有绝精确的特别位定义(sbit)是合法的.操纵符后的最大值依靠于指定的基类型,对charucha
26、r而言是07,对intuint而言是015,对longulong而言是031.第7章 单片机的C语言应用程序设计 7.7 C51组织信息类型组织信息类型 1基于存储器的指针基于存储器的指针 基于存储器的指针以存储器类型为参量基于存储器的指针以存储器类型为参量,它在编译时才被确定它在编译时才被确定.所以所以,为指针挑选存储器的方式能够省掉为指针挑选存储器的方式能够省掉,以便这些指针的长度为一以便这些指针的长度为一个字节个字节(idata *,data *,pdata *)或或2个字节个字节(code *,xdata *).编译时编译时,这这类操纵一样被类操纵一样被行内行内(inline)编码编码
27、,而无需履行库调用而无需履行库调用. 基于存储器的指针定义举例基于存储器的指针定义举例: char xdata *px;第7章 单片机的C语言应用程序设计 在xdata存储器中定义了一个指向字符型(char)的指针变量px.指针自身在默认存储区(决意于编译模式),长度为2个字节(值为00 xFFFF). char xdata *data pdx; 除了明白定义指针位于MCS-51内部存储区(data)外,其它与上例一样,它与编译模式无关. data char xdata *pdx;第7章 单片机的C语言应用程序设计 struct time char hour ; char min; char
28、sec; struct time xdata *pxtime; 在结构struct time中,除了其它结构成员外,还见谅有一个具有和struct time一样的指针pxtime,time位于外部信息存储器(xdata),指针pxtime具有两个字节长度.第7章 单片机的C语言应用程序设计 struct time idata *ptime ; 那个表明定义了一个位于默认存储器中的指针,它指向结构time,time位于idata存储器中,结构成员能够通过MCS-51的R0或R1 履行间接会见,指针ptime为1个字节长. ptimepxtimehour = 12; 使用上面的对于struct t
29、ime和struct idata *ptime的定义,指针pxtime被从结构中间接调用,它指向位于xdata存储器中的time结构.结构成员hour被赋值为12.第7章 单片机的C语言应用程序设计 2一样指针一样指针 一样指针包罗一样指针包罗3个字节个字节:1个字节存储类型和个字节存储类型和2个字节偏移地个字节偏移地址址,即即地址+0+1+2内容存储器类型偏移地址高位字节偏移地址低位字节其中,第一字节代表了指针的存储器类型,存储器类型编码似下:存储器类型idataxdatapdatadatacode值12345第7章 单片机的C语言应用程序设计 例似,以xdata类型的0 x1234地址为指
30、针能够示意似下:地址+0+1+2内容0 x020 x120 x34 当用常数作指针时,必须注重精确定义存储器类型和偏移量. 例似,将常数值0 x41写入地址为0 x8000的外部信息存储器. #define XBYTE ( (char *) 0 x20000L) XBYTE0 x8000 = 0 x41 ; 其中,XBYTE被定义为(char *)0 x20000L,0 x20000L为一样指针,其存储类型为2,偏移量为0000H,如此XBYTE成为指向xdata零地址的指针.而XBYTE8000那么是外部信息存储器的0 x8000绝对地址.第7章 单片机的C语言应用程序设计 7.8 模块化程
31、序开发环节模块化程序开发环节图图7.4 程序开发环节程序开发环节 第7章 单片机的C语言应用程序设计 7.8.1 混合编程混合编程1命名法那么命名法那么表表7.5 函数名的变形函数名的变形讲 明符号名转 换 规 那么void func(void)FUNC无指标传递或不含寄存器指标的函数名不作改变转入意图文件中,名字只是简单地变形为大写形式void func(void)_FUNC带寄存器指标的函数名参加“_”字符前缀,表明这类函数见谅寄存器的指标传递void func(void)reentrant_?FUNC对重入函数加上“_?”字符串前缀,表明这类函数见谅栈内的指标传递第7章 单片机的C语言应
32、用程序设计 例例2 用汇编语言编写函数用汇编语言编写函数toupper,指标传递产生在寄存器指标传递产生在寄存器R7中中.UPPER SEGMENT CODE ;程序段;程序段PUBLIC _TOUPPER ;入口地址;入口地址PSEG UPPER ; 程序段程序段_TOUPPER: MOV A,R7 ;从;从R7中取指标中取指标 CJNE A,# a,$+3 JC UPPERET CJNE A, # z+1 ,$+3 JNC UPPERET CLR ACC ,5 UPPERET: MOV R7 ,A ;返回值放在;返回值放在R7中中 RET ;返回到;返回到C第7章 单片机的C语言应用程序设
33、计 2指标传递法那么指标传递法那么表表7.6 指标传递的寄存器挑选指标传递的寄存器挑选指标类型charintlong ,float一样指针第1个指标R7R6, R7R4R7R1,R2,R3第2个指标R5R4, R5R4R7R1,R2,R3第3个指标R3R2, R3无R1,R2,R3第7章 单片机的C语言应用程序设计 func1(int a) a是第一个指标,在R6,R7中传递. func2 (int b, int c, int *d ) b是第一个指标,在R6,R7中传递;c是第二个指标,在R4,R5中传递;d是第三个指标,在R1,R2,R3中传递. func3(long e , long f
34、 ) e是第一个指标,在R4R7中传递;f是第二个指标,不能在寄存器中传递,只能在指标传递段中传递. func4(float g , char h ) g是第一个指标,在R4R7中传递;h是第二个指标,必须在指标传递段中传递.第7章 单片机的C语言应用程序设计 表表7.7 函数返回值的寄存器函数返回值的寄存器返 回 值寄 存 器讲 明bitC进位标位(unsigned) charR7 (unsigned) intR6,R7高位字节在R6,低位字节在R7(unsigned) longR4R7高位字节在R4,低位字节在R7floatR4R732位IEEE标准,指数和符号位在R7指针R1,R2,R3
35、R3放存储器类型,高位在R2,低位在R1第7章 单片机的C语言应用程序设计 在汇编子程序中,当前挑选的寄存器组及寄存器ACC、B、DPTR和PSW都大概改变.当被C调用时,必须无前提地假定这些寄存器的内容已被毁坏.似果已在毗邻定位程序时挑选了覆盖,那么每个汇编子程序见谅一个单独的程序段是必要的,因为在覆盖环节中,函数间参量通过子程序各自的段参量统计.汇编子程序的信息区甚到可见谅在覆盖部分中,但应注重下面两点: (1) 全部段名必须以C51类似的方式创站. (2) 每个有局部变量的汇编程序必须指定自已的信息段,那个信息段只能为其它函数会见作指标传递用.全部指标一个接一个被传递,由其它函数统计的结
36、论保留入栈. 第7章 单片机的C语言应用程序设计 7.8.2 覆盖和共享覆盖和共享 1覆盖覆盖 单片机片内存储空间有限单片机片内存储空间有限,毗邻器定位器往往再一次起用程序毗邻器定位器往往再一次起用程序不再用的位置不再用的位置.这便是讲这便是讲,如果一个程序不再调用如果一个程序不再调用,也不由其它程序也不由其它程序调用调用(甚到间接调用甚到间接调用),那么在其它程序履行完之前那么在其它程序履行完之前,那个程序不再那个程序不再运行运行.那个程序的变量能够放在与其它程序完全一样的那个程序的变量能够放在与其它程序完全一样的RAM空间空间,非常像可重用的寄存器非常像可重用的寄存器.这种技术便是覆盖这种
37、技术便是覆盖.在汇编中直截了当通在汇编中直截了当通过手工完成的这些空间安排过手工完成的这些空间安排,C语言中能够由毗邻器自动经管语言中能够由毗邻器自动经管.如如果有几个不相关联的程序时果有几个不相关联的程序时,它能够使它能够使RAM单元比手工思考要用单元比手工思考要用的少的少.第7章 单片机的C语言应用程序设计 2共享共享1) 共享变量共享变量类 型汇 编 语 言C 语 言动态变量 y( )int x;静态变量 static int x;公用变量PUBLIC XX:ds 2Int x;外部变量EXTERN DATA(X)MOV DPTR,# Xextern int;静态子程序函数Y:stati
38、c y( ) ;公共子程序函数PUBLIC YY:y( ) ;外部子程序函数EXTERN CODE(Y)LCALL Yy( )第7章 单片机的C语言应用程序设计 2) 共享函数子程序 C中函数如果是全局的(公用的),能够放在调用的函数之后.如果函数是模块专用的,它能够定义为静态函数,如此它不能被其它模块调用.C语言的ANSI规格定见全部函数在主函数前要有原型(履行讲明),接着现实函数可在主函数之后或其它模块中.这吻合自顶向下编程的概念. 汇编语言中,子程序使用标号可在给定模块的任何位置.汇编器第一步扫描猎取全部的符号名,接着值便可填入LCALL或LJMP.一个模块或另一模块共享子程序,一个使用
39、PUBLIC而另一个使用EXTERN.当指定为EXTERN,符号类型(CODE,DATA,XDATA,IDATA,BIT或NUMBER)必须特不加以指定,以便毗邻器能够确定放在共同的精确类型.第7章 单片机的C语言应用程序设计 7.8.3 库和毗邻器定位器库和毗邻器定位器 1. 库库表表7.9 Franklin C51的编译库的编译库库讲 明C51S.LIBSMALL模式,无浮点运算C51FPS.LIB浮点数学运算库(SMALL模式)C51C.LIBCOMPACT模式,无浮点运算C51FPC.LIB浮点运算库(COMPACT模式)C51L.LIBLARGE模式,无浮点运算C51FPL.LIB浮
40、点运算库(LARGE模式)第7章 单片机的C语言应用程序设计 2毗邻器定位器毗邻器定位器 1) 组合程序模块组合程序模块 将几个差别程序模块组合为一个模块将几个差别程序模块组合为一个模块,同时自动从库中挑选同时自动从库中挑选模块嵌入意图文件模块嵌入意图文件.输入文件按号令行中表现的次序操作输入文件按号令行中表现的次序操作.往往往往的程序模块是由的程序模块是由C51编译器或编译器或A51宏汇编生成的可重入的意图宏汇编生成的可重入的意图文件文件.第7章 单片机的C语言应用程序设计 2) 组合段 将具有一样段名的可重定位段组合成单一的段.在一个程序模块中定义的一个段成为部分段.一个部分段在源文件中以
41、下列形式指定: (1) 名字 每个重定位段有一个名字,它可与来自其它模块的同名的可重定位段组合.绝对段没出名字. (2) 类型 类型表明段所属的地址空间CODE,XDATA,DATA或BIT. 第7章 单片机的C语言应用程序设计 (3) 定位方式 可重定位段的定位方式有PAGE,INPAGE,INBLOCK,BITADD RESSABLE或UNIT.INPAGE表明段必须放入一页(高8位地址一样)中以使用短转移和调用指令.INBLOCK段应使用ACALL,必须放在2048字节块中.因为没有毗邻器能够灵活地判知调用和转移是否在块内.可重定位的其它限制是:PAGE-不能超过256字节;BITADD
42、RESSABLE-必须放在可位寻址的内部RAM空间;UNIT-许可段从随意率性字节最先(对位变量是位). (4) 长度 一个段的长度.第7章 单片机的C语言应用程序设计 (5) 基址 段的首址.对绝对段,地址由汇编器赋予,对可重定位段,地址由L51决意.在操作程序模块时,L51自动产生段表(MAP),该表见谅了每个段的类型、基址、长度、可重定位性和名字. L51自动将所具有一样名字的全部部分段组合到单一可重定位段中.例似,三个程序模块见谅字段VAR,在组合时,三个段的长度相加,从而组合段的长度也增加了.对组合段有下列法那么: 全部具有一样名的部分段必须有一样类型(CODE,DATA,IDATA
43、,XDATA或BIT). 组合段的长度不能超过存储区的物理长度. 每个组合的部分段的定位方式也必须一样. 绝对段彼此不组合,它们被直截了当拷贝到输出文件.第7章 单片机的C语言应用程序设计 3) 存储器安排存储器安排物理存储区最大长度地址区段类型程序64 KB00FFFFHCODE外部信息64 KB00FFFFHXDATA直截了当寻址片内信息128字节07FHDATA间接寻址片内信息256字节00FFHIDATA片内信息的位空间128位07FHBIT表7.10 MCS-51系列的物理存储区第7章 单片机的C语言应用程序设计 4) 采纳覆盖技术使用信息存储器 通过采纳必然的覆盖技术,MCS-51
44、系列少量的片内信息存储器可由L51有效地使用.由C51编译器或是A51汇编器生成的指标和局部变量(如果使用它们的函数不彼此调用)可在存储器中覆盖.如此,所用的存储器猎取相当程度地削减. 为完成信息覆盖,L51对比全部差别函数间的调用,使用该信息能够确定哪个信息和位段可被覆盖.使用操纵指标OVERLAY和NOOVERLAY可许可或克制覆盖.OVERLAY是默认值,用它可产生非常紧凑的信息区. 第7章 单片机的C语言应用程序设计 5) 决意外部参考地址 具有一样名的外部符号(EXTERN)和公用符号(PUBLIC)被确定后,外部符号指向其它模块中的地址.一个已表明的外部符号用具有一样名字的功用符号
45、确定,外部参考地址由其公共参考地址确定.这还与类型(DATA,IDATA,XDATA,CODE,BIT或NUMBER)有关,似果类型不符或未发觉外部符号参考地址的公用符号,那么会产生错误.公用符号的绝对地址在段定位后决意.第7章 单片机的C语言应用程序设计 6) 绝对地址统计 定义绝对地址同时统计可重定位段的地址.在段安排和外部公用参考地址操作完后,程序模块中全部可重定位地址和外部地址要履行统计,此刻生成的意图文件中的符号信息(DEBUG)被改变以反映新的值.第7章 单片机的C语言应用程序设计 7) 产生绝对意图文件 可履行程序以绝对意图标准产生.该绝对意图文件可见谅附加的符号信息(DEBUG
46、),从而使符号调试成为大概.符号信息可用指标NODEBUGSYMBOLS,NODEBUGPUBLICS和NODEBUGLINES克制.输出文件是可履行的,同时可由仿真器装入调试或被OHS51翻译为Intel HEX标准文件以供EPROM固化.第7章 单片机的C语言应用程序设计 8) 产生映像文件 产生一个反映每个操作环节的映像文件,它表现有关毗邻定位环节的信息和程序符号,同时见谅一个公用和外部符号的交错参考陈诉.映像文件见谅下列信息: 文件名和号令行指标. 模块的文件名和模块名. 一个见谅段地址、类型、定位方式和名字的存储器安排表.该表可在号令行中用NOMAP参考克制.第7章 单片机的C语言应
47、用程序设计 段和符号的全部错误列表.列表文件末尾表现出全部犯错的缘由. 一个见谅输入文件中符号信息的符号表.该信息由MODULES,SYMBOLS,PUBLICS和LINES名组成,LINES是C编译器产生的行号.符号信息可用指标NOSYMBOLS,NOPUBLICS和NOLINES完全或部分克制. 一个按字母次序布列的有关全部PUBLIC和EXTERN符号的交错参考陈诉,其中表现出符号类型和模块名.第一个表现的模块名是定义了PUBLIC符号的模块,背面的模块名是定义了EXTERN符号的模块.在号令行输入指标IXREF可产生此陈诉. 在毗邻器定位器运行期间探测到的错误同时表此刻屏幕和文件尾部.
48、第7章 单片机的C语言应用程序设计 7.8.4 程序优化程序优化 以下挑选对提高程序功效有非常大作用: (1) 完量挑选小存储模式以幸免使用MOVX指令. (2) 使用大模式(COMPACTLARGE)应认真思考要放在内部信息存储器的变量要求是常常用的或是用于中间结论的.会见内部信息存储器要比会见外部信息存储器快得多.内部RAM由寄存器组、位信息区和其它用户用“data”类型定义的变量共享.因为内部RAM容量的限制(128256字节,由使用的单片机决意),必须权衡利弊以解决会见功效和这些对象的数量之间的抵牾.第7章 单片机的C语言应用程序设计 (3) 要思考操纵次序,完成一件事后再做一件事.
49、(4) 注重程序编写细那么.例似,如果使用for(;)循环,DJNZ指令比CJNE指令更有效,可削减重复循环次数. (5) 如果编译器不能使用左移和右移完成乘除法,应站即修改,例似,左移为乘2. (6) 用逻辑AND&取模比用MOD %操纵更有效. (7) 因统计机基于二进制,认真挑选信息存储器和数组大小可节流操纵.第7章 单片机的C语言应用程序设计 (8) 完大概使用最小的信息类型,MCS-51系列是8位机,明显对具有char类型的对象的操纵比int或long类型的对象的操纵要方便得多. (9) 完大概使用unsigned信息类型.MCS-51系列CPU同时不直截了当撑持有符号数的运
50、算.因而C51编译器必须产生与之相关的更多的程序代码以解决那个咨询题. (10) 完大概使用局部函数变量.编译器老是尝试在寄存器里连结局部变量.如此,将循环变量(似for和while循环中的计数变量)讲明为局部变量是最好的.使用unsigned charint的对象往往能获得最好的结论.第7章 单片机的C语言应用程序设计 7.9 MCS-51内部资源使用的内部资源使用的C语言编程语言编程7.9.1 中断应用的中断应用的C语言编程语言编程 C51编译器撑持在编译器撑持在C源程序中直截了当开发中断程源程序中直截了当开发中断程序序.中断服务程序是通过按规定语法标准定义的一个函中断服务程序是通过按规定
51、语法标准定义的一个函数数. 中断服务程序的函数定义的语法标准似下中断服务程序的函数定义的语法标准似下: 返回值返回值 函数名函数名(指标指标) interrupt musing n 第7章 单片机的C语言应用程序设计 表表7.11 MCS-51中断源编号中断源编号编 号中 断 源入 口 地 址0外部中断00003H1守时器计数器0000BH2外部中断10013H3守时器计数器1001BH4串行口中断0023H第7章 单片机的C语言应用程序设计 using n 选项用于实现任务寄存器组的切换,n是中断服务子程序中选用的任务寄存器组号(0 3).在很多情况下,响应中断时需爱护有关现场信息,以便中断
52、返回后,能使中断前的源程序从断点处接着精确地履行下去.这在MCS-51单片机中,能非常方便地操纵任务寄存器组的切换来实现.即在进入中断服务程序前的程序中使用一组任务寄存器,进入中断服务程序后,由using n切换到另一组寄存器,中断返回后又恢复到原寄存器组.如此彼此切换的两组寄存器中的内容彼此都没有被毁坏.第7章 单片机的C语言应用程序设计 图图 7.5 扩展多个中断源扩展多个中断源 例例3 图图7.5所示是操纵优先权解码芯片所示是操纵优先权解码芯片,在单片机在单片机8031的一个的一个外部中断外部中断INT1上扩展多个中断源的原理电路图上扩展多个中断源的原理电路图.图中是以开封闭图中是以开封
53、闭合来模拟中断要求信号合来模拟中断要求信号.当有任一中断源产生中断要求当有任一中断源产生中断要求,能给能给8031的的INT1引足送一个有效中断信号引足送一个有效中断信号,由由P1的低的低3位可得对应中断源位可得对应中断源的中断号的中断号.第7章 单片机的C语言应用程序设计 在中断服务程序中仅设置标记,同时保留IO口输入状态.Franklin C51编译器提供定义特定MCS-51系列成员的寄存器头文件.MCS-51头文件为reg51.h.C51程序似下: # include unsigned char status; bit flag; void service_int1( ) interru
54、pt 2 using 2 * INT1中断服务程序,使用第2组工作寄存器 * flag=1; * 设置标记 * status=p1; * 存输入口状态 * void main(void) IP=0 x04 ; * 置INT1为高优先级中断 * IE=-0 x84 ; * INT1开中断,CPU开中断 *第7章 单片机的C语言应用程序设计 for(; ;) if(flag) * 有中断 * switch(status) * 依照中断源分支 * case 0 : break ; * 操作IN0 * case 1 : break ; * 操作IN1 * case 2 : break; * 操作IN2
55、 * case 3 : break; * 操作IN3 * default : ; flag=0 ; * 操作完成清标记 * 第7章 单片机的C语言应用程序设计 7.9.2 守时器计数器守时器计数器(TC)应用的应用的C语言编程语言编程 例例4 设单片机的设单片机的fosc=12 MHz晶振晶振,要求在要求在P1.0足上输出周期足上输出周期为为2 ms的方波的方波. 周期为周期为2 ms的方波要求守不时候隔的方波要求守不时候隔1 ms,每次时候到每次时候到P1.0取反取反. 机器周期机器周期=12fosc=1 s 需计数次数需计数次数=1000(12fosc)=10001=1000 因为计数器是
56、加因为计数器是加1计数计数,为猎取为猎取1000个计数之后的守时器溢出个计数之后的守时器溢出,必须给守时器置初值为必须给守时器置初值为-1000(即即1000的补数的补数).第7章 单片机的C语言应用程序设计 (1) 用守时器0的方式1编程,采纳查询方式,程序似下: # include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; * 设置守时器1为非门操纵方式1* TR0=1 ; * 启动 TC0 * for( ; ;) TH0= -(1000256) ; * 装载计数器初值 * TL0= -(1000%256) ; do while (!TF0)
57、 ; * 查询守侯TF0置位 * P1_0=!P1_0; * 守不时候到P1.0反相 * TF0=0; * 软件清 TF0 * 第7章 单片机的C语言应用程序设计 (2) 用守时器0的方式1编程,采纳中断方式.程序似下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 * TC0中断服务程序入口 * P1_0=!P1_0 ; * P1.0取反 * TH0= -(1000256); * 再一次装载计数初值 * void main( void ) TMOD=0 x01 ; * TC0任务在守时器非门操纵方式1 * P1_
58、0=0; TH0= -(1000256 ); * 预置计数初值 * TL0= -(1000%256) ; EA=1 ; * CPU中断开放 * ET0= 1 ; * TC0中断开放 * TR0=1 ; * 启动TC0最先守时 * do while(1) ; * 守侯中断 * 第7章 单片机的C语言应用程序设计 例例5 采纳采纳10 MHz晶振晶振,在在P1.0足上输出周期为足上输出周期为2.5 s,占空比占空比20%的脉冲信号的脉冲信号. 10 MHz晶振晶振,使用守时器最大守时几十毫秒使用守时器最大守时几十毫秒.取取10 ms守时守时,周周期期2.5 s需需250次中断次中断,占空比占空比2
59、0%,高电平应为高电平应为50次中断次中断. 10 ms守时守时,晶振晶振fosc=10 MHz. 需守时器计数次数需守时器计数次数=101031012=8333# include # define uchar unsigned charuchar period=250;uchar high=50;第7章 单片机的C语言应用程序设计 timer0( )interrupt 1 using 1 * TC0中断服务程序 *TH0= - 8333256 ; * 重置计数值 *TL0= - 8333%256 ; if(+time=high)P1=0; * 高电平常间到变低 *else if (time=
60、period) * 周期时候到变高 *time=0 ;P1=1 ; 第7章 单片机的C语言应用程序设计 main( ) TMOD=0 x01 ; * 守时器0方式1 * TH0= - 8333256 ;* 预置计数初值 * TL0= - 8333%256 ; EA=1; * 开CPU中断 * ET0=1 ; * 开TC0中断 * TR0=1 ; * 启动TC0 * do while(1) ; 第7章 单片机的C语言应用程序设计 图7.6 中断服务程序流程图 第7章 单片机的C语言应用程序设计 产生一个占空比改变脉冲信号的程序,它产生的脉宽调制信号用于电机变速操纵.# include # define uchar unsigned
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业元宇宙太赫兹通信协议研究
- 2025年工业余热供暖项目碳中和设计
- 集团人力资源管控方案
- 一年级下册修辞标点专项训练
- 2026年广东惠州市初中学业第一次质量检测化学试题
- 昏迷促醒护理的护理评估工具
- 洗面护理的环境影响
- 13.2 宇宙的边疆(教学课件)-高中语文人教统编版选择性必修下册
- 气管吸痰护理的教学方法
- 智慧护理:新技术应用前景
- 2026年公务乘车座次礼仪与司机沟通规范问答
- 2026年北京市西城区高三二模英语试卷(含答案)
- 2026重庆璧山文化旅游产业有限公司面向社会招聘5人备考题库及答案详解(各地真题)
- 济宁市2026届省属公费师范毕业生就业岗位需求备考题库(112个)含答案详解(能力提升)
- GB/T 24573-2009金库和档案室门耐火性能试验方法
- GB/T 24283-2018蜂胶
- 餐饮安全管理规章制度
- 教练型领导力360°全方位目标管理之九点领导力课件
- 环通危险货物集装箱永久查验堆存场地及配套仓库项目环境风险评价报告
- 龙门吊安装技术交底
- DB11T 1620-2019 建筑消防设施维修保养规程
评论
0/150
提交评论