单片机数据存储类型和申明方法
单片机c语言中常用的数据类型

单片机c语言中常用的数据类型单片机C语言中常用的数据类型在单片机的C语言编程中,常常使用以下数据类型来存储和操作数据。
这些数据类型在单片机编程中具有不同的大小和范围,方便开发者根据实际需求选择合适的类型。
1. 整型数据类型:- `int`:在大多数单片机中,`int` 数据类型占用2 个字节,表示有符号的整数,范围约为-32,768 到32,767。
- `unsigned int`:也占用2 个字节,在无符号的情况下表示整数,范围约为0 到65,535。
2. 字符型数据类型:- `char`:在单片机中,`char` 数据类型占用1 个字节,用于表示字符。
可用于存储ASCII 码值范围内的字符。
- `unsigned char`:同样占用1 个字节,用于存储无符号字符数据。
3. 浮点型数据类型:- `float`:在某些单片机中,`float` 数据类型占用4 个字节,可以用于表示小数。
该类型可以用来进行浮点运算,但精度较低。
- `double`:占用8 个字节,在某些高端单片机中,用于表示双精度浮点数据类型。
精度较高,但占用更多的存储空间。
4. 位域类型:- `bit`:在某些特殊场景下,需要精确控制某个变量的每一位时,可以使用`bit` 数据类型。
此外,还可以使用`unsigned short`、`unsigned long` 等更具体的数据类型,根据需求决定。
在单片机编程中,选择合适的数据类型非常重要,因为它们直接影响了存储空间的利用和运行效率。
总结:在单片机的C语言编程中,常用的数据类型包括整型、字符型、浮点型和位域类型。
开发者可以根据自己的需求选择合适的数据类型来存储和操作数据。
这些数据类型的选择需要考虑存储空间的利用和运行效率,以便更好地进行单片机程序开发。
单片机中的数据存储与读写技术

单片机中的数据存储与读写技术作为现代电子设备的核心组成部分,单片机在各个领域中扮演着重要的角色。
而数据在单片机中的存储与读写技术更是关系到整个系统的运行效率和稳定性。
本文将介绍单片机中常用的数据存储与读写技术,旨在帮助读者更好地理解和应用单片机技术。
一、RAM随机存储器RAM(Random Access Memory)即随机存取存储器,是单片机中最常见的数据存储器之一。
它可以随机读写数据,具有读写速度快、容量大的特点。
RAM分为静态RAM(SRAM)和动态RAM(DRAM)两种类型。
1. SRAMSRAM是一种基于触发器的存储器,由多个触发器组成。
它的读写速度快,不需要刷新电路,在数据稳定性和可靠性方面表现出色。
SRAM常用于需要频繁读写数据的场景,如缓存存储器、寄存器等。
2. DRAMDRAM是一种基于电容的存储器,由字线和位线交错组成。
它的读写速度相对较慢,需要定时刷新电路来维持数据的稳定性。
DRAM常用于对存储容量要求较高的场景,如系统内存等。
二、EPROM和EEPROMEPROM(Erasable Programmable Read-Only Memory)和EEPROM (Electrically Erasable Programmable Read-Only Memory)是一种只读存储器,其内容可以通过特殊的擦除和编程操作进行修改。
EPROM使用紫外线擦除,而EEPROM使用电子擦除。
1. EPROMEPROM常用于存储固件和程序代码等不经常修改的数据。
编程EPROM需要提供高电压和较长的编程时间,同时擦除EPROM需要将芯片暴露在紫外线下。
由于操作复杂,EPROM一般不适用于需要频繁修改数据的场景。
2. EEPROMEEPROM相比于EPROM可以通过电子擦除来修改数据,操作更为灵活方便。
EEPROM具有非易失性的特点,即在断电情况下数据依然可以保持。
它广泛应用于单片机中存储配置参数、校准数据等需要经常修改的场景。
单片机内部存储器结构与数据存取方法详解

单片机内部存储器结构与数据存取方法详解单片机是一种集成了处理器、内存和外设等功能于一体的微电子器件,广泛应用于各种电子设备中。
其中,内部存储器是单片机的核心组成部分之一。
本文将详细介绍单片机内部存储器的结构和数据存取方法。
一、单片机内部存储器的结构单片机的内部存储器主要包括随机存取存储器(RAM)和只读存储器(ROM)两部分。
1. 随机存取存储器(RAM)RAM是单片机内部的易失性存储器,用于存储数据、程序临时数据和运行时数据。
单片机内部的RAM可以根据存取速度和使用要求的不同,分为片内RAM 和片外RAM两种。
片内RAM是单片机芯片内部集成的存储器,速度较快。
它可以分为片内可读写RAM(RW-RAM)和片内只读RAM(RO-RAM)两种类型。
片内可读写RAM可以被程序读取和修改,存储媒介是电容或电子触发器。
而片内只读RAM则只能被程序读取,不能被修改。
片内RAM的容量相对较小,一般在几十到几百字节之间。
片外RAM是连接在单片机芯片外部的存储器,速度较慢。
它可以进一步分为静态随机存取存储器(SRAM)和动态随机存取存储器(DRAM)两种类型。
SRAM是基于触发器构建的,数据存储在触发器中,读写速度快且无需刷新。
DRAM则是基于电容构建的,存储数据需要定期刷新,但容量较大。
2. 只读存储器(ROM)ROM是单片机内部的非易失性存储器,用于存储程序和常量数据。
ROM的内容在出厂时就被写入,一般无法被程序修改。
单片机内部的ROM可以分为只读存储器(ROM)和可编程只读存储器(PROM)两种类型。
ROM存储器内容固定不变,其中包含了单片机的初始化程序和系统代码。
PROM存储器则可以通过特殊的编程操作烧写程序和数据,但一旦写入后无法擦除和修改。
这类存储器在生产流程中被用于定制特殊功能的单片机。
二、单片机内部存储器的数据存取方法单片机内部存储器的数据存取方法根据存储器的类型和连接方式而有所不同。
1. RAM的数据存取方法对于片内RAM,数据的存取可以通过直接读写特定的RAM地址来实现。
单片机存储器类型介绍

单片机存储器类型详解分为两大类RAM和ROM,每一类下面又有很多子类:RAM:SRAMSSRAMDRAMSDRAMROM:MASK ROMOTP ROMPROMEPROMEEPROMFLASH MemoryRAM:Random Access Memory随机访问存储器存储单元的内容可按需随意取出或存入,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。
它的特点就是是易挥发性(volatile),即掉电失忆。
我们常说的电脑内存就是RAM的。
ROM:Read Only Memory只读存储器ROM 通常指固化存储器(一次写入,反复读取),它的特点与RAM相反。
RAM和ROM的分析对比:1、我们通常可以这样认为,RAM是单片机的数据存储器,这里的数据包括内部数据存储器(用户RAM区,可位寻址区和工作组寄存器)和特殊功能寄存器SFR,或是电脑的内存和缓存,它们掉电后数据就消失了(非易失性存储器除外,比如某些数字电位器就是非易失性的)。
ROM是单片机的程序存储器,有些单片机可能还包括数据存储器,这里的数据指的是要保存下来的数据,即单片机掉电后仍然存在的数据,比如采集到的最终信号数据等。
而RAM 这个数据存储器只是在单片机运行时,起一个暂存数据的作用,比如对采集的数据做一些处理运算,这样就产生中间量,然后通过RAM暂时存取中间量,最终的结果要放到ROM的数据存储器中。
如下图所示:2、ROM在正常工作状态下只能从中读取数据,不能快速的随时修改或重新写入数据。
它的优点是电路结构简单,而且在断电以后数据不会丢失。
缺点是只适用于存储那些固定数据的场合。
RAM与ROM的根本区别是RAM在正常工作状态下就可以随时向存储器里写入数据或从中读取数据。
SRAM:Static RAM静态随机访问存储器它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。
不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,所以在主板上SRAM存储器要占用一部分面积。
C51常用数据类型

C51常用数据类型在C51单片机编程中,常用数据类型是编写程序时必不可少的基本元素。
了解和正确使用这些数据类型是编程的基础。
本文将详细介绍C51常用的数据类型及其使用方法。
1. 位数据类型(bit):位数据类型是最基本的数据类型之一,用于表示一个二进制位。
在C51中,位数据类型使用关键字bit进行声明。
位数据类型只能取0或者1的值。
例如:bit flag; //声明一个位变量flag2. 逻辑数据类型(bit):逻辑数据类型是C51中的另一种位数据类型,用于表示逻辑值。
逻辑数据类型可以取0或者1的值,分别表示假和真。
例如:bit isTrue = 1; //声明一个逻辑变量isTrue,并将其赋值为真3. 字符数据类型(char):字符数据类型用于表示一个字符,它是由ASCII码表中的字符集合组成的。
在C51中,字符数据类型使用关键字char进行声明。
例如:char ch = 'A'; //声明一个字符变量ch,并将其赋值为字符'A'4. 无符号整数数据类型(unsigned char、unsigned int、unsigned long):无符号整数数据类型用于表示正整数,不包含负数。
在C51中,无符号整数数据类型分为无符号字符(unsigned char)、无符号整数(unsigned int)和无符号长整数(unsigned long)。
例如:unsigned char num1 = 255; //声明一个无符号字符变量num1,并将其赋值为255unsigned int num2 = 65535; //声明一个无符号整数变量num2,并将其赋值为65535unsigned long num3 = 4294967295; //声明一个无符号长整数变量num3,并将其赋值为42949672955. 有符号整数数据类型(signed char、signed int、signed long):有符号整数数据类型用于表示正整数和负整数。
单片机参数保存方法

单片机参数保存方法单片机参数保存是指将单片机的配置参数以某种方式保存起来,以便下次重新启动时能够快速加载并恢复之前的配置。
单片机参数是指一些影响程序运行和电路功能的设置,如时钟频率、外设配置、中断向量、IO口配置等。
常见的单片机参数保存方法有以下几种:1.外部电路存储:使用EEPROM、Flash、FRAM等非易失性存储器进行保存。
这些存储器通常可以通过I2C、SPI等接口与单片机进行通信,单片机在程序中通过读写对应地址的数据来实现参数的保存与加载。
如ST公司的STM32系列单片机内部集成了Flash存储器,可以方便地保存和加载参数。
2.内部存储器存储:一些单片机内部集成了特定的存储器,如电子可擦除只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM),可以直接将参数保存在其中。
单片机在程序中通过读写特定地址的数据来实现参数的保存与加载。
例如ATMEGA16系列单片机内部集成了EEPROM,可以直接使用其API函数读写数据。
3.引脚状态保存:将参数保存在引脚的电平状态中。
通过将不同的参数映射到不同的引脚电平状态(高电平、低电平、悬空等),单片机在启动时读取引脚的电平状态来加载参数。
这种方法简单直接,但需要额外的硬件支持,并且可保存的参数数量有限。
4.嵌入式文件系统存储:在一些资源丰富的单片机上,可以使用嵌入式文件系统,如FAT文件系统,将配置参数保存在文件中。
单片机在启动时读取文件系统中的配置文件来加载参数。
这种方法需要额外的存储空间和文件系统的支持,相对复杂。
在选择单片机参数保存方法时,需要考虑以下几个因素:1.存储空间:不同的存储方法所需要的存储空间不同,例如使用外部存储器可能需要占用额外的封装空间;使用内部存储器可能会占用部分程序存储空间;使用引脚电平保存可能对引脚资源有要求等。
2.速度:不同的存储方法读写速度有所差别,例如使用非易失性存储器比使用嵌入式文件系统更快。
51单片机的程序存储器和数据存储器

51单片机的程序存储器和数据存储器51单片机是一种常见的嵌入式微控制器,具备程序存储器和数据存储器,广泛应用于各个领域。
程序存储器用于存储和执行程序,而数据存储器用于储存运行过程中的变量和数据。
本文将详细介绍51单片机的程序存储器和数据存储器的特点和使用方法。
一、程序存储器程序存储器是51单片机中用于存储程序代码的地方。
它通常在芯片内部,有多种形式,常见的有ROM(只读存储器)和Flash(闪存)两种。
1. ROM存储器ROM存储器可以被写入一次,之后不能再改变。
它通常用于存储经常使用的不变的代码,例如启动程序、中断向量表等。
ROM存储器具有较高的稳定性和可靠性,在操作过程中不易出错。
但是,由于其只能被写入一次,因此对于频繁需要修改的程序代码来说,使用ROM存储器并不方便。
2. Flash存储器Flash存储器是一种可擦写的存储器,它可以多次写入和擦除。
这使得在51单片机的开发过程中,可以方便地修改和更新程序代码。
Flash存储器的优点是灵活性高,容易更新,但相对而言,稳定性较差,可能会出现擦除错误或写入错误的情况。
在使用Flash存储器时,需要注意以下几点:(1)在写入过程中,应该保证电源的稳定性,避免写入过程中电压异常导致写入错误。
(2)应该合理规划Flash存储器的中存储空间的物理布局,以方便程序的定位和管理。
(3)由于Flash存储器的写入次数是有限的,因此要尽量减少对其频繁的擦写。
二、数据存储器数据存储器是51单片机中用于存储程序运行中的变量和数据的地方。
它可以读取和写入,是程序运行和数据处理的重要组成部分。
数据存储器通常分为RAM(随机访问存储器)和SFR(特殊功能寄存器)两种。
1. RAM存储器RAM存储器是一种易读写的存储器,其存储空间较大,可以存储较多的变量和数据。
RAM存储器的读写速度较快,对于频繁读写的数据可以更快地进行处理。
但是,RAM存储器对电源的稳定性要求较高,断电会导致存储的数据丢失。
C51数据类型

C51数据类型C51数据类型是指在C51单片机编程中所使用的各种数据类型。
C51单片机是一种广泛应用于嵌入式系统中的微控制器,它具有高性能、低功耗和丰富的外设资源。
在C51单片机编程中,合理选择和使用不同的数据类型可以提高程序的效率和可靠性。
1. 位数据类型(bit):位数据类型是C51中最基本的数据类型,用于表示一个二进制位。
位数据类型只能取0或1两个值,用于节省存储空间和提高程序运行效率。
例如,声明一个位数据类型的变量可以使用关键字bit,如下所示:bit flag;2. 无符号整数数据类型(unsigned):无符号整数数据类型用于表示非负整数,不包含正负号。
在C51中,无符号整数数据类型的范围是从0到2的n次方-1,其中n是数据类型的位数。
例如,声明一个8位无符号整数数据类型的变量可以使用关键字unsigned char,如下所示:unsigned char num;3. 有符号整数数据类型(signed):有符号整数数据类型用于表示带有正负号的整数。
在C51中,有符号整数数据类型的范围是从-2的n次方除以2到2的n次方除以2减1,其中n是数据类型的位数。
例如,声明一个8位有符号整数数据类型的变量可以使用关键字signed char,如下所示:signed char temperature;4. 字符数据类型(char):字符数据类型用于表示一个字符,它占用一个字节的存储空间。
在C51中,字符数据类型可以表示ASCII码表中的字符。
例如,声明一个字符数据类型的变量可以使用关键字char,如下所示:char ch;5. 整数数据类型(int):整数数据类型用于表示整数,它占用两个字节的存储空间。
在C51中,整数数据类型的范围是从-32768到32767。
例如,声明一个整数数据类型的变量可以使用关键字int,如下所示:int count;6. 长整数数据类型(long):长整数数据类型用于表示较大范围的整数,它占用四个字节的存储空间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.51的存储器结构笼统来说单片机片内存储器分为CODE区和data区,cpu从code区读取指令,对data区的数据进行运算处理。
前者在程序运行中为只读,一般为FLASH,用来放置程序代码和一些只读的数据(如字模表之类),后者可以随机读写,用来存放程序运行中的临时数据,如局部变量或全局变量,全局变量一直占用着RAM内存,而局部变量在使用完后会自动清除RAM空间。
当然在片外,可以外扩FLASH和RAM(此时称为XRAM,因为寻址方式不一样),外扩的大小与单片机寻址能力有关。
有的单片机将外扩RAM封装在片内,如AT89C51,所以有了所谓的片内XRAM。
二.变量的存储模式变量是一种在程序执行过程中能不断变化的量。
它有数据类型、存储类型、存储器模式和有效范围四种属性。
C语言规定每个变量必须有一个标识符作为变量名,在使用一个变量前,必须先对变量进行定义,指出其数据类型和存储模式。
以便编译系统为其分配存储单元。
在C51中对变量进行定义的格式如下:[存储类型] 数据类型 [存储器类型] 变量名表,如auto char data i;存储类型指明变量的存储区域,而变量的存储类型和变量在程序中说明的位置决定了它的作用范围。
存储类型含义与C语言相同。
存储类型有四种:auto型、extern型、static型、register型,缺省为auto型(看来我一直都是凹凸型啊)。
其区别如下:auto:自动变量。
存储在内存的堆栈区,属于临时性存储变量,并不长期占用内存,可以被多次覆盖。
register:寄存器变量。
register与auto一样属于自动类别。
区别在于register的值保存在CPU的寄存器中。
计算机中只有寄存器中的数据才能直接参与运算,而一般变量是放在内存中的,变量参加运算是,需要先把变量从内存中取到寄存器中,然后计算。
所以一般把使用最频繁的变量定义成register变量。
register变量只能在函数中定义,并只能是int和char型。
static:静态变量。
声明静态变量的,也就是C语言中的私有成员.如果在一个函数中声明一个静态变量,静态变量的空间不在栈里面,而是存储在静态空间里,这个函数结束后,静态变量的值依旧存在,内存不会收会此变量占用的内存空间,而是等整个程序都结果后才收回静态变量空间。
extern:外部类型。
extern用来声明外部变量,可以用于此程序外的程序中(可在两个C 文件间交叉使用),类型要一致。
变量在数据运行时被分配了一定的内存空间,该空间在整个运行程序中,只要程序存在,自始自终都被该变量使用,即其值始终不变。
数据类型就不用多说了,bit,byte,char什么的。
存储器类型与单片机的寻址方式有关,影响程序的执行效率。
下表是传统C51的存储器类型,不同单片机类型有所差别。
简单解释一下:data: 低128字节,可直接寻址,可以用acc直接读写的,速度最快,生成的代码也最小。
bdata:16字节位寻址区(当然也可以按字节寻址),一般很小。
idata: 固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。
idata是用类似C中的指针方式访问的。
汇编中的语句为:MOVX ACC,@Rx。
xdata: 外部扩展RAM,一般指外部0x0000-0xffff空间,有的集成于片内,用DPTR访问。
pdata: 外部扩展RAM的低256个字节,用movx ACC,@Rx读写。
这个比较特殊,而且C51好象有对此BUG,建议少用。
如果要指定存储地址可用如:uchar bdata LED _at_ 0x20;sbit led_7=led^7;//用关键字sbit定义位变量来独立访问可寻址位对象int bdata ab[2];//在可位寻址区定义数组ab[2]sbit ab12=as[1]^12; 操作符“^”后面的位位置的最大值取决于指定的基址类型char 0-7,int 0-15,long 0-31。
定义变量时如果省略了“存储器类型”,则按编译模式SAMLL, COMPACT,LARGE所规定的默认存储器类型确定变量的存储区域,(#pragma 预编译命令,可以指定函数的默认存储器模式。
)C51编译器的三种存储器模式(默认的存储器类型)对变量的影响如下:1. SMALL:变量被定义在8051单片机的内部数据存储器中,因此对这种变量的访问速度最快。
另外,所有的对象,包括堆栈,都必须嵌入内部数据存储器,而堆栈的长度是很重要的,实际栈长取决于不同函数的嵌套深度。
2. COMPACT:变量被定义在分页外部数据存储器中,外部数据段的长度可达256字节。
这时对变量的访问是通过寄存器间接寻址(MOVX@Ri)进行的,堆栈位于8051单片机内部数据存储器中。
采用这种编译模式时,变量的高8位地址由P2口确定。
3. LARGE:变量被定义在外部数据存储器中(最大可达64K字节),使用数据指针DPTR来间接访问变量,访问数据速度慢,增加程序代码的长度。
存储器模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。
例如:一个整形变量i,如放于内存18H、19H空间,则++ i的操作编译成四条语句:INC 0x19MOV A,0x19JNZ 0x272DINC 0x180x272D:而如果放于外存空间0000H、0001H则++i的操作编译成九条语句:MOV DPTR,0001MOVX A,@ DPTRINC AMOVX @ DPTR,AJNz #5MOV OPTR,#0000MOVX A,@DPTRINC AMOVX @ DPTR,A对于函数而言,一个函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间,规则与变量定义一致。
在定义一个函数时可以明确制定该函数的存储器模式,一般的形式如下:函数类型函数名(形式参数表) [存储器模式]其中的存储器模式是选项,未说明时则按该函数编译时的默认存储器模式处理。
例如:#pragma largeint func1(int a1, int a2) small{int c;…………}int func2(int b1, int b2){int c;…………}#pragma 预编译命令,可以指定函数的默认存储器模式。
C51允许采用存储器的混合模式编程,充分利用单片机中有限的存储器空间,同时还可以加快程序运行的速度。
三、网友的一点经验1.data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data 区内,比如for循环中的计数值。
2.data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。
当然静态局部变量除外,其内存使用方式与全局变量相同;3.确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。
函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。
这一点Keil C做得很愚蠢,但也没办法。
4.程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。
定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5.其他不频繁用到和对运算速度要求不高的变量都放到xdata区。
6.如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。
当然最好对所有变量都要指定内存类型。
7.当使用到指针时,要指定指针指向的内存类型。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data 区的指针只占1个字节;指定指向xdata区的指针占2个字节。
如指针p是指向data区,则应定义为: char data *p;。
还可指定指针本身的存放内存类型,如:char data * xdata p;。
其含义是指针p指向data区变量,而其本身存放在xdata 区。
四.关于STARTUP.A51用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段起始代码,这段起始代码的源程序名为STARTUP.A51。
其作用可以看看源代码,简单来说就是进行变量的初始化,设置SP指针、堆栈空间等。
如果考虑冷复位和热复位时的数据保存问题可以通过修改它实现(貌似不推荐)。
BTW,冷复位用英文来表示是Restart,热复位用英文来表示是Reset。
我们把单片机从没加电到加上电源,而自动产生的复位称为冷复位;单片机在已经通电的情况下,给它一个复位信号,称为热复位。
冷复位会使单片机的特殊功能寄存器和数据存储器的内容都改变;而热复位只是特殊功能寄存器的内容改变而单片机的内部数据存储器的内容不变。
六.关于中断我都困了,坚持做完吧,难得这么整理一回。
中断时很好用的,与查询方式分半边天。
C51编译器支持在C语言程序中直接编写51单片机的中断服务程序,C51编译对函数定义进行了扩展,增加了一个关键字interrupt,interrupt是函数定义时的一个选项,加上它函数将函数定义成中断服务函数。
函数类型函数名(形式参数表) [interrupt n][using n]interrupt 后面的n为中断号,n的取值范围为0~31,编译器从8n+3处产生中断向量。
C51编译器还扩展了一个关键字using,专门用来选择单片机的寄存器组,缺省时由编译器选择一个寄存器组作为绝对寄存器组访问。
对于这个using,多说几句,普通函数也可以用。
任何时候,单片机只能用到四组寄存器中的一组,一般情况下keil来自动分配,用USING来选择其中的一组,目的是提高效率减少出入栈次数。
编写8051单片机中断函数时应遵循以下规则:(l)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
(2)中断函数没有返回值,如果企图定义一个返回值将得到不正确的结果。
因此建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。
(3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。
因为中断函数的返回是由8051单片机指令RETI完成的,RETI指令影响8051单片机的硬件中断系统。
如果在没有实际中断调求的情况下直接调用中断函数,RETI 指令的操作结果会产生一个致命的错误。
(4)如果中断函数中用到浮点运算,必须保存浮点寄存器的状态,当没有其它程序执行浮点运算时可以不保存。
(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器组必须与中断函数相同。