简易数字频率计参考keilc_第1页
简易数字频率计参考keilc_第2页
简易数字频率计参考keilc_第3页
简易数字频率计参考keilc_第4页
简易数字频率计参考keilc_第5页
已阅读5页,还剩3页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

1、KeilC 应用KeilC 和普通的 C 语言有很大的区别, KeilC 支持符合 ANSI 标准的 C 程序设计,它完全支持 C的标准指令和单片机优化 C 扩展指令。针对 8051 单片机的自身特点它作了一些特殊扩展,KeilC 在开发单片机时,能充分发挥单片机的资源,体现高级语言的优势。1要使用 KeilC 的必要性当设计一个小的系统时,一般都用汇编语言,在很多工程中,这是一个常用的方法,因为源程序的总容量一般都不超过 8K,且比较简单,如果硬件工程师不熟系 C 一类的高级语言,要同时设计硬件,经常会采用单片机特有的汇编语言来做程序。KeilC 语言功能齐全,引入了 C 语言的精华指针的概

2、念,另外它的文本编辑具有强大的图形功能,适合多种操作系统,如 Windows、UNIX,也适用于多种体系结构。对于 8051和其相应的派生门类,KeilC 语言对于它们的硬件资源大部分都可以进行操作。与汇编语言相比 KeilC 的可读性和可移植性好,而且更容易阅读和。KeilC 是目前流行的单片机 C 语言调试和开发,Keil 提供了包括 C 编辑器、编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vi)将这些部份组合在一起。2KeilC 的变量KeilC 的变量可存放在 bit、data、bdta、idata、xdata、pdata 等 K

3、eilC 定义的不同类型的器空间;KeilC 提供的 auto、sic、const 等类型和专门针对 8051 单片机的 data、idata、pdata、xdode 等类型,自动为变量合理地分配地址;提供、pact、large 等编译模式,以适应片上器的大小;3KeilC 程序结构KeilC 程序结构与一般 C 语言程序基本一致。函数是 C 程序的基本,一个 C51 源程序大体上是一个函数定义的集合,在这个集合中有且仅有一个名为 main()的函数,也可以包含其它函数。主函数是程序的唯一,一个 C 语言程序,总是从 main()函数开始执行的,而不管物理位置上这个 main()放在什么地方,

4、主函数中的所有程序执行完毕,则任务结束。主程序通过以下 2 种方式来实现函数的有关功能 自定义函数自定义函数是完全个性化的,是用户根据自己需要而编写的完成某种功能的指令集合。 由 C 语言本身提供的库函数;库函数是 C在库文件中已定义的函数,其函数说明在相关的头文件中。对于这类函数,编程时只要用 include 预处理指令将头文件包含在用户文件中,即可直接调用。在 KeilC 中,函数定义由函数类型、函数名、参数表和函数体四部分组成。例如:void setTimer0(unsigned switch (gateHours)case 0 x28:TMOD=0 x01;TH0=0 xfc; TL0

5、=0 x18;break; case 0 x24:TMOD=0 x01; TH0=0 xd8;TL0=0 xfc; break;default:break;return;chargateHours)函数的类型就是返回值的类型,函数类型(除整形外)均需在函数名前加以指定。函数名是一个标识符,参数表是用圆括号括起来的若干参数,项与项之间用逗号隔开。函数体是用大括号括起来的若干 C 语句,语句间用分号隔开,即函数名下面“”内的部份,如果一个函数内有多个“”,则最外层的一对“”为函数体的范围。最后一个语句一般是 return。每一个函数都返回一个值,该值由 return 语句中的表达式指定(省略时为零

6、)。函数体一般包括:变量声明部份;执行部份:由若干个语句组成。KeilC 也支持 C/C+风格的注释,“/”引导的语句是注释。函数定义相当于汇编程序中的一般子程序。函数调用相当于汇编程序中调用子程序的 CALL 语句,在 C 中更普遍地规定函数调用可以出现在表达式中。KeilC 的主要特点和它与 C 的不同之处4KeilC 与 C 的差异Keil 编译器与 C 的差异主要是由 8051 的一些局限引起的。C 语言中的基本数据类型有 char、 、short、long、float 和 double,但对于 Keil 编译器来说,short类型与类型相同 double 类型与 float 类型相同

7、,如下表所示。除了这些标准数据类型外,编译器还支持以下特殊扩充数据类型的数据。.特殊功能寄存器特殊功能寄存器用 sfr 来定义,而 sfr16 用来定义 16 位的特殊功能寄存器,利用它可定义 80518 位特殊功能寄存器。sfr 型数据占用一个内存单元变量,取值范围是 0-255。通特殊功能寄存器,Keil 提供了一个包含了所有特殊功能寄存器的定义的头文件,单片机的所有过名字或地址来通过包含头文件可以很容易的进行和新的扩展。如:TMOD 表示 8051的定时器控制寄存器:TMOD=0 x01;可位寻址的数据利用关键字sbit 可以定义8051 单片机RAM 中的可寻址位或特殊功能寄存器中的可

8、寻址位。例如:sbit p2_0=P20;sbit sbit sbit sbit sbit sbitsbitp2_1=P21; p2_2=P22; p2_3=P23; p2_4=P24; p2_5=P25; p2_6=P26;p2_7=P27;.类型KeilC 允许使用者指定变量的储区:区来使用编译器,KeilC 定义了以下存区,可以通过控制DATA 区对 DATA 区的寻址是最快的,所以应该把使用频率高的变量放在 DATA 区,只要不超过 DATA区描述DATARAM 的低128个字节BDATADATA 区的16个字节的可位寻址区IDATARAM区的高128个字节,采用间接寻址PDATA外部

9、区的256个字节,通过P0口的地址对其寻址对应汇编指令MOVX Rn,(n=0,1)XDATA外部区,对应汇编指令MOVX DPTR寻址CODE程序区,MOVC TR标准数据类型所占内存大小char/unsigned char8 bit/unsigned char16 bitlong/unsigned long32 bitfloat/double32 bitgeneric poer24 bit区的范围,例如:unsigned char data keyCodeBuff ;unsigned char keyCodeBuff;BDATA 区单独的使用变量的某一位unsigned char bdat

10、a keyCodeBuff;IDATA 区IDATA 区使用寄存器作为指针进行寻址:在寄存器中设置 8 位地址,进行间接寻址。例如:#include idata unsigned char displayValue3;unsignedget_code(i);void main()/*Insert your code here. */ unsigned char display_bit;i=0;TMOD=0 x21;displayValue0=0 x20;displayValue1=0 x11; displayValue2=0 x12;for(i=0;i3;i+)display_bit=disp

11、layValuei/10;SBUF=get_code(display_bit);while(!TI);TI=0;display_bit=displayValuei%10;SBUF=get_code(display_bit);while(!TI);TI=0;while(1);unsignedget_code(i)p;switch(i)case case case case case case case case casecase0:p=0 x3f; 1:p=0 x06;2:p=0 x5b; 3:p=0 x4f; 4:p=0 x66;5:p=0 x6d; 6:p=0 x7d; 7:p=0 x07;

12、8:p=0 x7f;9:p=0 x67;break; break; break; break; break; break; break; break; break;break;default: break;return(p);PDATA和 XDATA 段这两个段中,有变量主要用于外部扩展的 RAM 或者 ROM,例如:在 KEILC 的头文件#define XBYTE (unsigned char volatile xdata *) 0)语句,所以如下指令#defined xbyte0 x8000d=0 x38 与汇编语言MOV DPTR,#8000HMOV A,#38H MOVX DPTR,

13、A等价。CODE 段代码段的数据是不可改变的,一般代码段用于存放数据表等常量,代码段中的对象在编译的时候初始化,例如:codeunsignedcharcctab432=0 x08,0 x80,0 x08,0 x40,0 x08,0 x40,0 x10,0 x04, 0 x17,0 xfe,0 x30,0 x80,0 x50,0 x88,0 x90,0 xfc, 0 x10,0 x88,0 x10,0 x88,0 x10,0 x88,0 x10,0 x88,0 x11,0 x08,0 x11,0 x08,0 x12,0 x50,0 x14,0 x20,0 x01,0 x00,0 x01,0 x0

14、8,0 x7f,0 xfc,0 x01,0 x10, 0 x1f,0 xf8,0 x10,0 x10,0 x1f,0 xf0,0 x10,0 x10, 0 x1f,0 xf0,0 x10,0 x10,0 x1f,0 xf0,0 x10,0 x14,0 xef,0 xfe,0 x08,0 x20,0 x10,0 x18,0 x20,0 x08,0 x10,0 x40,0 x10,0 x40,0 x14,0 x40,0 xfe,0 x7C,0 x20,0 x84,0 x29,0 x08,0 x48,0 x20,0 x7e,0 x20,0 x08,0 x20,0 x08,0 x20,0 x0e,0

15、x50,0 xf8,0 x50,0 x48,0 x88,0 x08,0 x88,0 x09,0 x06,0 x0a,0 x04,0 x10,0 x40,0 x10,0 x40,0 x12,0 x40,0 x22,0 x48,0 x23,0 xFC,0 x64,0 x40,0 xA4,0 x40,0 x28,0 x40,0 x20,0 x44,0 x3F,0 xFE,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,;指针C51 支持使用“*”定义一个指针,指针本身是一变量,但其中存放的不是普通的数据,

16、而是指向另一个数据的地址,指针变量也要占据一定的内存单元。C51 中的指针分为 2 种:通用指针和存指针,下表了在 C51 中储器器指针的类型。通用指针的实现:Char *c_ptr;Char data dd;指针类型大小XDATA 指针2字节CODE 指针2字节IDATA 指针1字节DATA 指针1字节PDATA 指针1字节C_ptr=ⅆ器指针的实现,例如:Char data * str;在定义时了数据类型和所指向的数据的空间的说明。使用具体指针的好处是节省了令产生代码,但必须保证指针不指向所空间,编译器不用为器选择和决定正确的器操作指的区以外的地方。5中断服务微处理器的中断系统十分重

17、要,C51 使你能够用 C中断和编写中断服务程序,中断过程通过使用errupt 关键字和中断号(0 到 31)来实现。中断号告述编译器中断程序的地址,中断号对应着 IE 寄存器中的使能位。在 8 位微处理器 8051断号和中断源的关系如下表:中断过程没有返回值,在中断函数里最好不要调用其他函数,中断过程必须设计的结构简单,执行迅速。在 C51 中,用户不用关心寄存器组参数和累加器,状态寄存器等的保护,只要在中断程序中被用到,中断执行之前会自动把他们入栈,在中断程序结束时恢复;中断程序的地址被编译器放在中断向量中,C51 支持所有 5 个 8051/8052 标准中断,中断号从 0 到 4,由中

18、断号来查找中断向量。一个完整的中断服务程序例子如下:定时器 T1 对外部事件记数时的溢出中断处理。#include unsigned char display_bit;void main()TMOD=0 x50;TH1=0 xff; TL1=0 xff;ACC=0;EA=1;ET1=1;TR1=1;while(1);中断号中断源0外部中断01定时器0 溢出2外部中断13定时器1 溢出4串行口中断void t1_ACC=5;r()errupt3 using 0display_bit=1;t1_r()中断函数名;3 是中断号;0 表示使用 0 号工作寄存器组。6器模式C51 提供了 3 种compact ;large。变量,器模式和程序模式一样,可以分为

温馨提示

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

评论

0/150

提交评论