首页 单片机Cx51

单片机Cx51

举报
开通vip

单片机Cx51nullnull51单片机的C程序设计◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null◆Cx51基础 8051单片机有4种编程语言的支持,即汇编、PL/M、C和BASIC。 汇编是最接近机器码的一种语言,其主要优点是占用资源少、程序执行效率高,可以对底层硬件进行直接并且高效的控制。 但是它是面向机器的,不符合人的思维习惯,写出来的代码可读性、可维护性非常差,编写代码时不能把精力集中于算法的优化。null◆Cx51基础 8051...

单片机Cx51
nullnull51单片机的C程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 ◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null◆Cx51基础 8051单片机有4种编程语言的支持,即汇编、PL/M、C和BASIC。 汇编是最接近机器码的一种语言,其主要优点是占用资源少、程序执行效率高,可以对底层硬件进行直接并且高效的控制。 但是它是面向机器的,不符合人的思维习惯,写出来的代码可读性、可维护性非常差,编写代码时不能把精力集中于算法的优化。null◆Cx51基础 8051单片机有4种编程语言的支持,即汇编、PL/M、C和BASIC。 与汇编相比,C语言具有以下优点: ♀只要求基本了解单片机的存储器结构 ♀不要求了解单片机指令系统 ♀寄存器的分配、存储器的寻址由编译器决定 ♀具有规范的结构,使程序结构化,改善了程序可读性 ♀编程和调试时间大大缩短,提高了编程效率 ♀附带库里有大量标准子程序,减小了工作量 ♀程序具有良好的可移植性 ♀由于有清晰的结构,可编写较大规模程序 ♀符合人的思维习惯,编程时可以专注于算法的优化null51单片机的C程序设计◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null关键字◆Cx51的语言扩展 为了使用8051的诸多硬件特性,Cx51编译器对ANSI C增加了以下关键字: data idata bdata pdata xdata sfr sfr16 alien interrupt small large compact code bit sbit using reentrant _priority_ _task_ far _at_ null存储区和存储类型◆Cx51的语言扩展 8051单片机体系结构支持几种程序和数据物理上分开的存储器或存储空间,各有其特点: 只读存储区;可读写存储区;读写速度较快的存储区 1、程序存储器,Cx51编译器通过code存储类型来说明访问程序存储器。 2、内部数据存储器。位于51片内,是可读写的。根据51种类不同,最多256K字节。低128字节可直接寻址,而高128字节只能间接寻址。可分为3种存储类型: ★data,位于低128字节,可直接寻址。 ★ idata,全部256字节,只能间接寻址,比直接寻址慢。 ★ bdata,位于片内20H~2FH,可位寻址。null◆Cx51的语言扩展 3、片外数据存储器,可读写。采用数据指针访问,比访问内部数存要慢,最多可达64K字节。可分为2种存储类型: ★xata,可访问外部数(程)存64K字节的任意位置,只能通过数据指针(MOVX(C) @DPTR)来访问。 ★pdata,可访问外部数存的一页即256字节,通过R0和R1(MOVX @ Rn)来访问(有时可能需P2指出高8位地址)。存储区和存储类型 4、far存储类型。扩展的RAN或ROM,可多达16M字节,51派生产品中用到51对外设采取统一编址,外设也占用此空间,可以通过访问外部数存来控制外设----存储器映射I/O,所以可用空间可能不足64K字节。 null◆Cx51的语言扩展 5、特使功能寄存器。8051提供了128字节的特殊功能寄存器寻址区,可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下3种关键字说明:sfr、sfr16和sbit。 Cx51未预先定义SFR的名字,而是把它们包含在一个头文件中。存储区和存储类型null存储模式◆Cx51的语言扩展 存储模式决定了函数参数、自动变量以及没有明确指定存储类型的变量的默认存储类型,共三种: SMALL、COMPACT和LARGE ★SMALL 所有变量默认存储在内部数存,相当于把变量声明为data。访问速度快,但空间有限,只适用于小程序。 ★COMPACT 所有变量默认存储在外部数存的一页内,相当于把变量声明为pdata。空间比Small大(256字节),但速度较Small慢(比large快)。 ★LARGE 所有缺省变量可放在多达64K字节的外部RAM区,空间大,但是速度较慢。 null数据类型◆Cx51的语言扩展 Cx51编译器针对8051单片机,提供以下几种扩展数据类型: bit(0或1)、sbit(0或1)、sfr (0~255)、 sfr16(0~65535)。 1、bit型变量可用于变量声明,函数参数列表、函数返回值等,存贮于内部RAM20H~2FH区。注意: (1) 若在函数中禁止中断(#pragma disable)或用函数用“unsigned”指定寄存器组,返回值不能为位型 。 (2) 不能声明bit指针,如bit *ptr;是错误的。 (3) 不能定义bit数组,如bit arr[5];是错误的。null数据类型◆Cx51的语言扩展 2、可位寻址对象 可位寻址对象可被作为字节或位来访问,定义在51内部可位寻址区。Cx51用bdata来说明变量放到可位寻址区,且这些变量必须是全局变量。 例如: int bdata ibase;/*位寻址的整型量*/ char bdata barr[3];/*可位寻址的数组*/ sbit bit15= ibase^15;/*ibase的位15*/ sbit arr07=barr[0]^7;/*barr[0]的位7*/null数据类型◆Cx51的语言扩展 3、特殊功能寄存器,这部分包含3种数据类型: sfr,字节寻址,与声明其它类型变量一样,用变量类型直接声明。比如 sfr P0=0x80;为PO口地址为80H。 sfr16,字寻址,较少用到,将两个地址连续的SFR作为一个16位的SFR来访问。 sbit,位寻址,可访问SFR中的某位,如sbit EA=0xAF;指定第0xAF位为EA。(注意SFR是否可位寻址) 有如下定义绝对位地址的方法: sbit 0V=PSW^2;(定义0V为PSW的第2位) sbit 0V=0XD0^2;(同上) 或sbit 0V=0xD2;(同上)null指针◆Cx51的语言扩展 Cx51编译器除支持标准C的指针外,支持针对8051体系结构的两种类型的指针:一般(通用)指针和基于存储器(具体)的指针。 一般指针占3 字节,头一个字节表明指针所指的存储区空间另外两个字节存储16 位偏移量。由于编译期间无法优化存储器的存取,所以代码效率低。 使用者规定指针指向的存储段的指针叫具体指针。具体指针的好处是节省了存储空间,而且编译器可以产生高效的代码。null指针◆Cx51的语言扩展例如: 一般指针: char *s; /*字符指针*/ int *num; /*整型指针*/ long *lnum; /*长整型指针*/ 具体指针: char data *s; /*字符指针,指向data中的字符*/ int xdata *num; /*整型指针,指向xdata中的整型*/ long code *lnum; /*长整型指针,指向code中的 */ 指定指针存放位置的指针 char data * xdata s; int xdata * data num; long code * idata lnum; null函数相关◆Cx51的语言扩展Cx51函数声明对ANSI C作了扩展,具体包括: 指定函数为中断处理过程; 选择所用寄存器组; 选择存储模式; 指定是否可重入; 指定alien函数(PL/M-51)。 函数声明格式如下: [alien][返回类型] 函数名([参数列表])[small| compact|llarge][reentrant][interrupt n][using n]{ }null函数相关◆Cx51的语言扩展例如: 1、void serial_ISR () interrupt 4 [using 1]{ /* ISR */ } 2、int calc (char i, int b) large reentrant{ /**/ }注意:1、Cx51编译器为每个函数分配固定存储位置而不是堆栈传递参数和变量。2、using属性不能用在函数原型中;且using属性的函数不能返回位类型;为了避免错误也尽量不要用在以寄存器返回的函数中。 Using属性对目标代码有如下影响: ☆在函数入口处将当前工作组寄存器入栈;(PUSH PSW) ☆设置指定的工作寄存器组;(MOV PSW,#XX) ☆函数退出前恢复被保护的寄存器组。(POP PSW)null函数相关◆Cx51的语言扩展3、缺省的Cx51 编译器用绝对地址访问寄存器R0—R7,这可得到最高性能。采用绝对寄存器访问的函数不能被用不同的寄存器组的函数调用,否则可能引起不可预知的结果,因为调用函数假定一个不同的寄存器组被选择。4、中断属性的参数范围为0~31,在函数原型中不允许出现中断属性。中断☆属性对目标代码影响如下: ☆函数调用时,如果用到ACC,B,DPTR和PSW,则将他们入栈; ☆如果未指定using属性,则将所有用到的工作寄存器入栈; ☆函数退出前,所有被保护寄存器出栈; ☆中断函数有特殊的中断返回指令(RETI)结束。 还要注意,中断函数没有返回值;不能进行参数传递;如果调用了其它函数则要保证用到的寄存器组一样;不能直接调用中断函数。null函数相关◆Cx51的语言扩展5、由于片内资源的限制,Cx51编译器默认不允许函数的递规调用和以可重入函数的调用。(固定位置传递参数和变量产生覆盖) 可以有选择的将函数声明为可重入的,对每个可重入函数模拟一个可重入堆栈区放在在内部和外部存储区(由存储模式决定),如: SMALL 模式可重入函数在idata 存储区模拟可重入堆栈 COMPACT 模式可重入函数在pdata 存储区模拟可重入堆栈 LARGE 模式可重入函数在xdata 存储区模拟可重入堆栈 注意:可重入函数不支持可位寻址变量;可重入函数的函数原型中必须指定存储模式;模拟堆栈生长方向是自顶向底;模拟堆栈效率较低,尽量少用。null51单片机的C程序设计◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null配置文件◆Cx51高级编程技术 Cx51编译器提供许多可以修改的源文件使之能适合于特定硬件平台的目标程序 这些文件有: 起始执行的代码STARTUP.A51 初始化静态变量的代码INIT.A51 完成低级I/O流操作的代码 存储器分配代码 STARTUP.A51是经典系列8051单片机的标准启动代码,放在lib文件夹下。null配置文件◆Cx51高级编程技术 起始代码在目标系统复位后立即执行,并进行下面的可选操作: 清除内部数据区 清除外部数据区 清除外部页数据区 􀂃 初始化SMALL模式可重入堆栈和指针 􀂃 初始化LARGE模式可重入堆栈和指针 􀂃 初始化COMPACT模式可重入堆栈和指针 􀂃 初始化8051硬件堆栈指针 􀂃 传递控制权给C函数MAINnull优化器◆Cx51高级编程技术 Cx51编译器是一个优化编译器,即该编译器采取特定的步骤来确保生成并输出到目标文件中代码是最为高效(最小和/或最快)的代码。编译器 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 已生的代码,产生更有效的指令序列,确保Cx51编译器程序尽可能快的运行。null优化器◆Cx51高级编程技术 一般优化null优化器◆Cx51高级编程技术 针对51的特定优化与产生代码有关的优化null编程注意事项◆Cx51高级编程技术 尽量使用小存储模式; 尽量使用小数据类型;(8051为8位单片机) 尽量不使用有符号数;( 8051不直接支持有符号数) 尽可能的使用局部变量; 尽可能的使用用关键字const定义; 注意volatile关键字的使用; 注意关键词static的使用; 注意未被调用的函数; 关于程序优化。8051的中断函数不能被函数直接调用,所以未被调用的函数会被链接器作为一个潜在中断函数,为其局部变量分配不可覆盖的数据空间。null编程注意事项◆Cx51高级编程技术 在C语言中,关键字static有三个明显的作用: 第一,在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 第二,在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其 它函数访问。它是一个本地的全局变量。 第三,在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声 明它的模块的本地范围内使用。 另外,把变量声明为static也便于编译器的优化。null◆Cx51高级编程技术 const关键字主要有以下几个作用: 第一,它可以给读代码的人传递一些信息。 第二,它可以给编译器传达一定的信息便于便宜器进行程序优化。 第三,合理地使用关键字const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,减少不必要的bug 的出现。 用const修饰变量,函数参数,指针等有什么作用?编程注意事项null编程注意事项◆Cx51高级编程技术 volatile关键字volatile是暂态的,易变的意思。 一个定义为volatile 的变量是说这变量可能会被以任何未指定的方式改变,这样编译器就不会对其进行优化,每次用到时都会重新读取。 在8051中最常见的用途是外部并行设备的寄存器。例如: char cbuff = 10; …… j = cbuff; ……volatile char cbuff = 10; …… j = cbuff; ……头文件例子null编程注意事项◆Cx51高级编程技术 关于程序优化 一般来说,编译器的效率较高,无须进行一些一般的优化,例如循环中用自增还是自减变量,一些简单乘用左移来代替等等,一个优秀的编译器会自动进行优化,如果过于注重表面的程序优化,有可能会使程序变的结构混乱,可读性和可移植性下降。 不要进行过多的程序优化,把精力集中到算法优化上。 当然,对一些比较明显的优化,比如用a*a来代替库函数中的pow(a,2)这种优化还是必要的。nullC和汇编的混合编程◆Cx51高级编程技术 原则是全部程序均用C来编写。 但有时候可能需要用汇编来编写一些子程序,比如一个精确的延时程序,一个要求极短响应和处理时间的中断;或者利用现有的汇编代码。 一般涉及的混合编程包括在C中嵌入汇编代码、在C中调用汇编子程序和在汇编中调用C子程序。用的最多的是在C中调用汇编子程序。nullC和汇编的混合编程◆Cx51高级编程技术 C和汇编的编程接口: 因为是不同的两种语言,如果互相调用,必须遵循有一个编程接口。 函数参数的传递: 缺省的C函数在寄存器中最多传递三个参数,余下的参数通过固定存储区传递。可以用NOREGPARMS命令取消用寄存器传递参数。如果用寄存器传递参数取消或参数太多参数,通过固定存储区传递。用寄存器传递参数的函数在生成代码时被Cx51编译器在函数名前加了一个下划线_的前缀,只在固定存储区传递参数的函数没有下划线。nullC和汇编的混合编程◆Cx51高级编程技术 通过寄存器传递参数nullC和汇编的混合编程◆Cx51高级编程技术 参数传递例子函数返回值nullC和汇编的混合编程◆Cx51高级编程技术 函数名转换在混合编程时,互相调用的函数名会发生转换:nullC和汇编的混合编程◆Cx51高级编程技术 一个简单的C调用汇编的例子null51单片机的C程序设计◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null内联函数◆Cx51运行库 一般来说,库函数都是经过了长期的正确性和可移植性验证,因此程序设计时尽量的采用库函数来完成所需要的功能。 Cx51 编译器支持许多内联函数。内联函数编译时生成内嵌代码而不是一次函数调用来完成库函数,这样可以更高效更快速的运行函数。 Cx51 编译器支持以下几种内联函数: _crol_ _iror_ _nop_ _cror_ _lrol_ _testbit_ _irol_ _lror_ 内联函数在头文件INTRINS.H中声明。null_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回。 _iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回。 _lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回。 _nop_:相当于直接在汇编中插入NOP。 _testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。 _chkfloat_:测试并返回源点数状态。内联函数◆Cx51运行库null库文件◆Cx51运行库 Cx51 库包括六个不同的编译库,针对不同的功能要求进行了优化。这些库支持大多数的ANSI C函数调用。 库文件说明 Cx51 编译器还以源代码的形式提供了几个库模块,主要包括基本的输入输出函数和内存分配函数。用户可以自行修改以适合自己的需求,比如把默认的串口输出改写为LCD输出,把默认的输入改写为键盘输入。null绝对变量定位和绝对存储器访问宏◆Cx51运行库 ANSI C不支持直接指定一个变量的存储地址,但在嵌入式系统中可能需要指定变量的存储地址,有3种方法来实现: 第一,连接器定位控制;(比较烦琐,一般不用) 第二,_at_关键词; 第三,绝对存储器访问宏。 _at_关键词: 类型 [存储类型] 变量名 _at_ 地址 可选的存储类型指示变量的存储空间,若省略则采取缺省的空间;地址为变量定位的地址,必须位于物理存储空间范围内。绝对变量不可初始化,也不能定位位型变量和函数。注意:在使用_at_ 关键字访问XDATA变量时需要使用关键字volatile来防止编译器对存储器的访问优化。(例子)null◆Cx51运行库绝对存储器访问宏: 可以使用Cx51库提供的部分绝对存储访问宏访问显式的存储地址。这些宏在头文件ABSACC.H中定义。 CBYTE FCVAR CWORD DBYTE FVAR DWORD FARRAY PBYTE PWORD FCARRAY XBYTE XWORD 这些宏用法相似,以DBYTE为例,DBYTE宏允许访问单片机片内数存的某一字节: val = DBYTE[0x0021]; DBYTE[0x0021] = 7。 XWORD宏允许访问单片机片外数存的某一字: val = XWORD[0x0002]; XWORD[0x0002] = 7。 注意XWORD宏中地址并不表示整型存储器地址(需乘2)绝对变量定位和绝对存储器访问宏null重要库函数头文件◆Cx51运行库1、8051 特殊功能寄存器包含文件 Cx51 编译器包许多包含文件定义许多8051 派生系的特殊功能寄存器的明显常数这些文件在目录KEIL\C51\INC 和子目录下。REG51.H2、ABSACC.H ABSACC. H 文件包含允许直接访问8051 不同存储区的宏定义。4、INTRINS.H 包含指示编译器产生嵌入固有代码的程序的原型3、STDIO.H 包含流I/O 程序的原型和定义。5、STDLIB.H 包含下面类型转换和存储区分配程序的原型和定义null51单片机的C程序设计◆Cx51基础 ◆ Cx51的语言扩展 ◆ Cx51高级编程技术 ◆ Cx51运行库 ◆ 51资源的C编程null◆51资源的C编程 C编程时注意一条,第一句语句一般是SP初始化的一条指令!!! 有了前几部分的基础,可以通过包含特定的头文件,直接对51的资源进行C语言的编程。 51资源分片内外两种。片内资源主要包括中断系统、定时/计数器和串行口,一些8051的派生产品可能涉及更多的片内资源编程,如A/D、D/A、看门狗等。对片内资源的编程,就是对资源涉及的特殊功能寄存器当作普通的C中的常量来进行普通C语言的编程。 对所内部资源的编程,对使用者来说,就变成了普通的C语言程序设计。null◆51资源的C编程 Cx51支持在C源程序中开发中断程序: 返回值 函数名 interrupt n [using n]{} 以定时计数器应用为例:单片机晶振为12MHZ,要求应用T0方式1中断方式在P1.0脚上输出2ms的方波。主函数 void main (void){ TMOD = 0x01; p1_0 = 0; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; EA = 1; ET0 = 1; TR0 = 1; while(1); }中断服务程序 #include sbit p1_0 = P1.0; void time0(void) interrupt 1 using 1{ p1_0 = !p1_0; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; }null◆51资源的C编程 中断函数编程时主要注意以下几点: 中断函数的特殊属性;(前面函数属性) 中断的优先级;(尤其对于实时系统) 寄存器组切换; 在多级优先级中断系统中,高优先级中断可中断低优先级中断,因而必须指定寄存器组,为不同优先级的中断程序分配不同的寄存器组。可以通过PSW或using指定。null◆51资源的C编程 8051的外部资源主要有扩展存储器、扩展的定时/计数器、使时时钟芯片、LCD显示和键盘等。 外部资源的编程就是通过4个I/O口控制外设的过程,也就是片内相关资源即相关特殊功能寄存器的编程,与片内资源编程无本质区别。 不过需要注意的是,当从外部I/O引酵读取数据时,要加一步锁存器置1的指令,以使可以正确的读取引脚电平。 还一点就是,在定义外部地址空间的变量时,要在变量前加volatile关键词限定,以防止编译器对其进行存储器的访问优化。(外设寄存器)null◆51资源的C编程 以一个IIC总线的扩展实时时钟芯片8563为例:null◆51资源的C编程 IIC总线为两线型总线,一根为时钟线SCL,一根为数据线SDA。 PCF8563的读写地址固定,为A2和A3,对其写数据时先写地址,然后写数据;读数据时先写地址,然后读数据。 很多8051的片内没有集成IIC总线控制器,可采取用I/O的两个口线来模拟,如用P3.4和P3.5来模拟IIC总线的SCL和SDA。 程序头文件和源文件。其它通过I/O口扩展的并行外设编程更为简单,只需要设定好外部地址变量,就可以方便的控制外设。 一个LCD显示的例子。
本文档为【单片机Cx51】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_407367
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:工学
上传时间:2011-04-16
浏览量:50