单片机的C51语言.ppt_第1页
单片机的C51语言.ppt_第2页
单片机的C51语言.ppt_第3页
单片机的C51语言.ppt_第4页
单片机的C51语言.ppt_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。,汇编语言的问题,C51是为51系列单片机设计的一种C语言,其特点:,C51语言已成为51系列单片机程序开发的主流软件方法。,结构化语言,代码紧凑效率可与汇编语言媲美 接近真实语言,程序可读性强易于调试、维护 库函数丰富,编程工作量小产品开发周期短 机器级控制能力,功能很强适合于嵌入式系统开发 与汇编指令无关,易于掌握在单片机基础上上

2、手快,C51的好处,相同之处: 语法规则、程序结构、编程方法 差异之处: 数据类型、存储模式、中断处理 教学安排: 介绍C51语言的数据结构及C51编程手段; 介绍单片机I/O口的初步应用及C51编程方法。,C51与标准C语言对比,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,4.1 C51的程序结构,Project(可包含若干程序文件),Keil C51(Vionsion3),Main(函数),File_1(*.c),Func_k(函数),.,File_n(*.*),Func_1(函数),Fun

3、c_n(函数),.,用户编程,编译系统,C51单片机软件系统结构, 程序由函数组成(一个主函数,或一个主函数和若干自定义函数); 利用预处理命令对变量或函数进行集中定义或说明; 函数和变量都需遵循先定义后使用的基本原则; 主函数中的所有语句执行完毕,则程序结束。,C51与标准C程序结构完全相同,程序结构,举例:LED闪烁控制功能,#include/51头文件 void delay();/延时函数声明 sbit p1_0=P10;/输出端口定义 void main()/主函数 while(1)/无限循环体 p1_0=0;/P1.0=“0”,LED亮 delay();/延时 p1_0=1; /P1

4、.0=“1”,LED灭 delay(); /延时 void delay()/延时函数 unsigned int i;/整型变量i for(i=20000;i0;i-);/循环延时 ,预处理命令-,函数说明-,全局变量定义-,主函数-,函数定义-,局部变量定义-,函数体,函数体-,C51程序代码,4.1 C51的程序结构 4.2 C51的数据结构 1. C51的变量 2. C51的指针 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,4.2 C51的数据结构,在程序执行过程中,数值可以发生改变的量称为变量。,变量名与存储单元地址相对应,变量值与存储单元

5、的内容相对应。,例如,在哈佛结构的存储空间中如何建立变量概念?,1. C51的变量,【存储种类】数据类型【存储类型】变量名,* 方括号项可以缺省,C51变量定义的四个要素:, 自动变量(auto)在函数内部定义的变量,退出函数后,分配给该变量的存储单元即自行消失(局部变量)。,【存储种类】数据类型【存储类型】变量名, 外部变量(extern)在函数外部定义的变量,可始终保持变量的数值(全局变量)。 【强调】一个外部变量只能被定义一次,在定义文件之外的地方使用时需用extern进行声明。, 静态变量(static)静态局部变量/静态全局变量 寄存器变量(register)以寄存器为存储空间的变量

6、,* 若省略存储种类选项,则变量默认为自动变量,存储种类,数据的不同格式叫做数据类型,* 有符号数类型可以忽略signed标识符,标准C语言的数据类型,【存储种类】数据类型 【存储类型】变量名,数据类型,bit 型,用bit 定义一个位变量,语法规则如下:,bit bit_name = 常数01;,例如:bit door = 0 ; /定义一个叫door的变量且初值为0,注意: 利用bit可以定义一个位变量或位函数,但不能定义位指针,也不能定义位数组。 例如: bit gate=0;,C51扩充数据类型:bit、sfr或sfr16、sbit,sfr定义特殊功能寄存器SFR,语法规则如下: sf

7、r 或 sfr16 sfr_name = 字节地址常数;,sfr或sfr16型,例如,sfr P0 = 0 x80; /定义P0口地址80H sfr PCON = 0 x87; /定义PCON地址87H sfr16 DPTR=0 x82; /定义DPTR的低端地址82H,将SFR范围内的位地址(0 x800 xFF)定义为位变量,sbit型,1)sbit bit_name = 位地址常数; 将位于SFR字节地址内的绝对位地址定义为位变量名。 例如,sbit CY = 0 xD7;,2)sbit bit_name = sfr_name 位位置; 将已有定义的SFR的07位定义为位变量名。 例如:

8、 sfr PSW = 0 xD0; sbit CY = PSW7;,3)sbit bit_name = sfr字节地址 位位置; 将SFR字节地址的相对位地址定义为位变量名。 例如: sbit CY = 0 xD07;,C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。,用一条预处理命令#include 把这个头文件包含到C51程序中,无需重定义即可直接使用它们的名称。,应用举例:,51系列单片机有三个逻辑存储空间:,【存储种类】数据类型【存储类型】变量名,片内数据存储器,片外数据存储器和程序存储器。,存储类型,建立C51存储类型与存储空间的对应关系,C51的

9、存储类型与存储空间对应关系表,三种默认存储类型与编译模式之间的关系: SMALL:参数及局部变量放入可直接寻址的片内RAM区,默认类型是DATA。 COMPACT:参数及局部变量放入分页片外RAM区(最大256B),默认类型是PDATA。 LARGE: 参数及局部变量放入片外RAM区(最大64KB) ,默认类型是XDATA。,C51编译器指定了三种默认存储类型:,【存储种类】数据类型【存储类型】变量名,C51编译器的三种编译模式: SMALL:所有变量都被定义在片内RAM; COMPACT:所有变量都被定义在分页寻址的片外RAM中; LARGE:所有变量都被定义在片外RAM中(最大64KB),

10、变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。,变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。 强调:头文件中定义的变量都是大写的,【存储种类】数据类型【存储类型】变量名,C51扩展的若干关键字一览表,变量名不得使用标准C语言和C51语言的关键字。,unsigned char data system_status = 0;,/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。,数据结构定义举例,变量名为system_status,位于片内RAM区,无符号字符型,自动型,初值为零,uns

11、igned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0 x89ab;,static char m, n;,/定义status_byte为无符号字符型自动变量,该变量位于bdata区,/定义unit_id2为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。,/定义m和n为2个位于data区中的有符号字符型静态变量。,4.1 C51的程序结构 4.2 C51的数据结构 1. C51的变量 2. C51的指针 3.绝对变量定义 4.3 C51与汇编语言的混合编程 4.

12、4 C51仿真开发环境 4.5 C51初步应用编程,C51的指针与标准C的指针几乎是一样的,都可以简单理解为“存储地址的变量”,例如:,int *b = ,int a; /定义一个整型变量a,/定义一个整型指针变量b,其初值为a的地址,2. C51的指针,在C51里定义指针,还需要额外指明两个问题: 1)指针变量自身位于哪个存储区域; 2)该指针的值代表的是哪个存储区域里的地址。,以SMALL编译模式(默认data区存储类型)为例:,例1 char xdata a = A; /定义xdata区里的变量a,初值A char *ptr = ,解:ptr是一个char型的指针变量,它本身位于data

13、存储区,它的初值是位于xdata区里变量a的地址。,【存储种类】数据类型【存储类型】变量名,解: unsigned char idata a = A;,例2 若ptr是一个unsigned char型指针变量,它本身位于idata存储区,它的初值是位于idata存储区里的unsigned char型自动变量a(初值为A )的地址。试据此完成相关变量的定义和初始化 。,unsigned char * idata ptr = ,4.1 C51的程序结构 4.2 C51的数据结构 1. C51的变量 2. C51的指针 3.绝对变量定义 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境

14、 4.5 C51初步应用编程,(1). 采用扩展关键字“_at_”或指针定义变量的绝对地址,一般格式: 数据类型【存储类型】变量名 _at_ 地址常量 例如: char data a10 _at_ 0 x30; int idata b _at_ 0 x40; char xdata text256 _at_ 0 x0E000; 注意:利用扩展关键字“_at_”定义的变量称为“绝对变量”,对该变量的操作就是对指定存储器空间绝对地址的直接操作,因此不能对“绝对变量”进行初始化。,(2). 采用预定义宏指定变量的绝对地址,在“ABSACC.H”中提供了如下一套预义宏: CBYTECWORDFARRAY

15、 DBYTEDWORDFCARRAY PBYTEPWORDPCVAR XBYTEXWORDFVAR 包含该头文件,即可在C51源程序中利用这些宏来指定变量的绝对地址。 常用于扩展I/O端口地址的定义,如 #include #define port_con XBYTE0 x8001 #define port_dat XBYTE0 x8000 char x; port_con=0 x5A; /向XDATA存储地址8001写入数据0 x5A x=port_dat;/从XDATA存储地址0100中读取数据并赋值给x,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程

16、 1.在C51中调用汇编程序 2. C51中嵌入汇编代码 4.4 C51仿真开发环境 4.5 C51初步应用编程,4.3 C51与汇编语言的混合编程,基本概念,由于C语言是“使用函数的语言”,所以实现两者混合编程的关键在于实现不同语言之间的函数调用。 由于C51语言对函数的参数、返回值传送规则、段的选用和命名都做了严格的规定,因此在混合编程时汇编语言要按照C51语言的规定来编写。这是一般高级语言和低级语言混合编程的通用规则,即低级语言要向高级语言看齐,按照高级语言的规定进行编写。 汇编语言与C51混合编程时,通常用C51编写主程序,用汇编语言编写与硬件相关的子程序。 不同的编译程序中,C语言对

17、汇编语言的编译方法不同。在Keil中,是将不同模块分别编译或汇编,再通过链接来产生一个目标文件。,举例:在两个数据中选出较大的数据,并赋值给变量c。,1. 在C51中调用汇编函数,/以下代码在main.c文件中实现 char max(char a,char b);/由汇编语言实现 void main() char a=30,b=40,c; c=max(a,b); ,;以下代码在汇编语言文件max.asm中实现 PUBLIC _MAX DE SEGMENT CODE RSEGDE _MAX:MOVA,R7 ;取第一个参数 MOV30H,R5 ;取第二个参数 CJNEA,30H,TAG SJMPE

18、XIT TAG:JNCEXIT MOVR7,30H EXIT: RET END,1)程序的寻址,main.c中调用的max函数,如何与汇编文件中的相应代码对应起来;,2)参数传递,main.c中传递给max()函数的参数a和b,存放在何处可使汇编程序能够获取到它们的值;,3)返回值传递,汇编语言计算得到的结果,存放在何处可使C语言程序能够获取到。,C51程序中调用汇编语言,需要解决三个问题:,通过在汇编文件中定义同名的“函数”来实现。,1)程序的寻址问题,char max(char a,char b);/由汇编语言实现 void main() char a=30,b=40,c; c=max(a

19、,b); ,PUBLIC _MAX DESEGMENT CODE RSEGDE _MAX:,_MAX:MOVA,R7 ;取第一个参数 MOV30H,R5 ;取第二个参数 CJNEA,30H,TAG SJMPEXIT TAG:JNCEXIT MOVR7,30H EXIT: RET END,2)参数传递问题,char max(char a,char b);/由汇编语言实现 void main() char a=30,b=40,c; c=max(a,b); ,3)返回值传递问题,_MAX:MOVA,R7 ;取第一个参数 MOV30H,R5 ;取第二个参数 CJNEA,30H,TAG SJMPEXIT

20、 TAG:JNCEXIT MOVR7,30H EXIT: RET END,char max(char a,char b);/由汇编语言实现 void main() char a=30,b=40,c; c=max(a,b); ,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 1.在C51中调用汇编程序 2. C51中嵌入汇编代码 4.4 C51仿真开发环境 4.5 C51初步应用编程,在C51 函数内嵌入汇编代码,可以有三种不同方法。,方法一 直接在函数体内的每个汇编语句前加“asm”预编译指令,例如:,2. C51中嵌入汇编代码,voidreset_da

21、ta(void) asmMOVR1,#0AH asm LOOP:INCA asm DJNZR0,LOOP return; ,把asm 作为关键字后续汇编用大括号括起来即可,例如:,方法二,voidreset_data(void) asm MOVR1,#0AH LOOP:INCA DJNZR0,LOOP return; ,在C 模块内通过语句“ # pragma”嵌入汇编代码,例如:,方法三,voidreset_data(void) #pragmaasm MOVR1,#0AH LOOP:INCA DJNZR0,LOOP #pragma endasm return; ,注意:上述嵌入汇编代码的C函

22、数需要对Keil C编译器进行一定的设置后才能正常编译,具体设置办法参见相关文献。,例如:编写程序从P1.0输出方波,#include sbit p10=P10; /主函数 void main() while(1) p10=!p10; #pragma ASM MOVR7,#2; D1:MOVR6,#250; DJNZR6,$ DJNZR7,D1 #pragma ENDASM ,注意:在Keil环境下,内嵌汇编时要将SRC_CONTROL激活。激活的方法是:在Project窗口中包含汇编的窗口中包含汇编代码的C文件上右击鼠标,从弹出的快捷菜单中选择Option for file命令,双击右边的G

23、enerate Assembler SRC File和Assemble SRC File,使复选框由无效变为有效状态。,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 1. Keil的编译环境 Vision3 2. Vision3的基本使用方法 4.5 C51初步应用编程,4.4 C51仿真开发环境,Keil是德国Keil Software公司的51单片机开发软件包,包括C编译器、宏汇编、连接器、库管理及仿真调试器,通过一个集成开发环境(uVisoin3)组合起来。,1. Keil的编译环境 Vision3,即菜单工具栏,项目

24、管理窗口,文件窗口和输出窗口。,Vision3的软件界面包括四大组成部分,工具栏的位置和数量可以通过设置选定和移动。,Vision3中共有11个下拉菜单,项目管理窗口用于管理项目文件目录,它由五个子窗口组成,可以通过子窗口下方的标签进行切换,它们分别是:文件窗口,寄存器窗口,帮助窗口,函数窗口,模版窗口。,项目管理窗口:,输出窗口用于编译过程中的信息交互作用,由三个子窗口组成,可以通过子窗口下方的标签进行切换,它们分别是:编译窗口,命令窗口,搜寻窗口。,输出窗口:,观察窗口(Watch P2=0; while(1) key = P0 /显示到led ,“取反”操作的优先级高于“与”操作,参考程

25、序如下,编程界面和运行界面分别如下图,【要求】 K1为“开始键”,可使K3和K4有效,初值为“自下向上” 运动; K2 为“停止键”,可使K3和K4失效,并使全灯关闭; K3和K4为“方向键”,分别对应 “自上向下”和 “自下向上” 运动。,实例2 键控流水灯,分析整体关系,分析局部关系(获取按键状态),对应功能:启停=1, 启停=0, 方向=1, 方向=0,switch (表达式) case 常量表达式1:语句1; case 常量表达式2:语句2; case 常量表达式n:语句n; default:语句n+1; ,1#4#的键值:0 x0e, 0 x0d, 0 x0b, 0 x07,分析局部

26、关系(修改状态标志),建立LED显示码数组 = 01,02,04,08,分析局部关系(LED循环控制),参考程序如下,#include reg51.h char led=0 x01,0 x02,0 x04,0 x08; /显示模型 /延时子程序 void delay(unsigned int time) unsigned int j = 0; for(;time0;time-) for(j=0;j125;j+); /返回键值,当有键按下时,返回低4位相应位为1 /如果P0口低4位为全“1”,则返回0, /否则返回低4位相应位为0,其它位为“1” char key() return (P0 /P

27、0.3为0,则dir置“0” ,if (run) /若run为“1” if(dir) /若dir为“1” /自上而下流动 for(i=0;i=0;i-) P2=ledi; delay(200); else P2=0;/灯全灭 ,Keil项目和程序界面如下图所示,将实例2中的C51函数key()的功能改用汇编语言实现,并完成系统的混合编程。,程序说明,按照混合编程规则分别编写汇编语言(流水灯.asm)与C51语言(流水灯汇.c)两个程序文件,并将其添加到Keil的同一项目中。,实例3 混合编程,流水灯汇.c,#include reg51.h char led=0 x01,0 x02,0 x04,

28、0 x08; void delay(unsigned int time) unsigned int j = 0; for(;time0;time-) for(j=0;j125;j+); char key();/按键处理(汇编)在.asm文件中 void main() bit dir=0,run=0; char i; while(1) switch (key() case 0 x0e:run=1;break; case 0 x0d:run=0;break; case 0 x0b:dir=1;break; case 0 x07:dir=0;break; ,if (run) if(dir) /自上而

29、下流动 for(i=0;i=1;i-) P2=ledi - 1; delay(200); else P2=0;/灯全灭 ,key.asm,;按键处理函数(汇编) PUBLICKEY DE SEGMENT CODE RSEG DE KEY: MOVA,P0 ANLA,#0FH MOVB,A CJNEA,#0FH,KEYOUT MOVR7,#0 SJMPDOWN KEYOUT: MOVR7,B DOWN: RET END,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程 4.5.1 IO端口的简单应用 4

30、.5.1.1 基本输入输出单元与编程 4.5.1.2 LED数码管原理与编程 4.5.2 IO端口的进阶实践,4.5 C51初步应用编程,LED显示元件人机交互输出设备,其作用是指示中间运行结果与运行状态。,2. LED数码管原理与编程,com为公共端,共阳极LED,共阴极LED,引脚配置,(7-Segment Display),七段式LED显示器,以共阴极为例,部分字符的显示码(字模)为:,七段LED数码管的标准显示字符为0-9,A-F,LED的亮暗组合(显示码)能形成不同的显示字符,在P0口连接一个共阴极数码管,使之循环显示0-9数字。,实例4 LED数码管显示,将显示码循环输出到P0口即

31、可实现循环显示。但由于数字09的显示段码没有规律可循,需要采取查表方式进行操作:,将显示码按序存放在一个数组中, 顺序号与代表的显示字符相对应。(如,char led_mod =x1,x2,.,xn) 通过循环变量指定待送出的数组元素,分析:,参考程序,#include /包括一个51标准内核的头文件 char led_mod=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d, 0 x07,0 x7f,0 x6f;/LED显示字模 void delay(unsigned int time) unsigned int j = 0; for(;time0;time

32、-) for(j=0;j125;j+); void main(void) char i = 0; while(1) for(i=0;i=9;i+) P0=led_modi; delay(500); ,对按键动作进行计数和显示,达到99后重新由1开始计数。,个位LED接P2口;十位LED接P0口(上拉电阻),实例5 计数显示器,读P3.7口,进行加1计数和超界处理; 拆分计数器数值个位、十位; 查找/输出显示码到P0和P2口。,计数值拆分: 取模运算(%)个位 整除10运算(/)十位,查找/输出显示码: 按拆分值输出相应数组元素,分析:,参考程序,#include sbit P3_7=P37;

33、unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; unsigned char count; void delay(unsigned int time) unsigned int j = 0; for(;time0;time-) for(j=0;j125;j+); void main(void) count=0; /计数器赋初值 P0=tablecount/10; /P0口显示初值 P2=tablecount%10; /P2口显示初值,(接前页),while(1) /进入无限

34、循环 if(P3_7=0) /软件消抖,检测按键是否压下 delay(10); if(P3_7=0) /若按键压下 count+; /计数器增1 if(count=100) /判断循环是否超限 count=0; P0=tablecount/10;/P0口输出显示 P2=tablecount%10;/P2口输出显示 while(P3_7=0); /等待按键松开,防止连续计数 ,程序运行效果,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程 4.5.1 IO端口的简单应用 4.5.2 IO端口的进阶实践

35、4.5.2.1 数码管动态显示原理与编程 4.5.2.2 行列式键盘原理与编程,4.5 C51初步应用编程,静态显示接口和动态显示接口,静态显示接口:一个并行口接一个数码管。 优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。 缺点:占用资源较多,1. 数码管动态显示原理与编程,将所有数码管的段码线对应并联起来接在一个8位并行口上,而每位数码管的公共端分别由一位I/O线控制。,动态显示接口,轮流显示,即每一时刻只有一只显示器工作。当时间间隔很小(如10ms)时,人眼的暂留特性无闪烁的连续显示。 优点:占用资源较少 缺点:占用机时较多(需要CPU随时刷新显示值),工作原理,

36、采用共阴极动态LED显示原理,实现如下功能: SW1向下拨时显示字符“L2”,向上拨时显示字符“H3”。,实例6 数码管动态显示,Proteus中的双联LED数码管相当于两个并联的数码管。,分析:,如果不考虑switch,动态显示“L2”的程序可以如下:,完整的源程序,#include char led_mod = 0 x38,0 x5B,0 x76,0 x4F;/显示字模“L2H3” void delay(unsigned int time); sbit P17=P17; void main() char led_point = 0, switch_sta = 0; while (1) sw

37、itch_sta = (P17 = 1) ? 2 : 0; /如果P17为1,则取2,否则取0 P3 = 2 - led_point; /LED位选择 P2 = led_modswitch_sta + led_point;/P2输出字模 led_point = 1 - led_point; delay(30); void delay(unsigned int time) unsigned int j = 0; for(;time0;time-) for(j=0;j125;j+); ,需要数码管指针led_point和开关状态标志switch_sta的配合才能实现两个显示值的切换功能。,#inc

38、lude char led_mod = 0 x38,0 x5B,0 x76,0 x4F;/显示字模“L2H3” void delay(unsigned int time); sbit P17=P17; void main() char md,i,k; while (1) md=0 x01; if(P17)k=2;else k=0; for (i=0;i0;time-) for(j=0;j125;j+); ,运行效果图,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程 4.5.1 IO端口的简单应用 4

39、.5.2 IO端口的进阶实践 4.5.2.1 数码管动态显示原理与编程 4.5.2.2 行列式键盘原理与编程,独立式键盘的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题。,独立式键盘,独立式键盘与行列式键盘,2. 行列式键盘原理与编程,将IO口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。,行列式键盘,特点:占用IO口线较少,但软件将较为复杂。,键值(按键闭合时的数值),键模(按键代表的数值),行列式键盘,判断哪一行有键压下 写端口(0 xf0):行线电平=0;列线电平=1。 读端口进行判断:若P3 = 0 xf0没有按键压下; 若P30 xf0某行有键压下K1,(以P3口为例):,键盘扫描原理,判断哪一列有键压下 写端口(0 x0f):行线电平=1;列线电平=0。 读端口进行判断:若P3 = 0 x0f没有按键

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论