码迷,mamicode.com
首页 > 其他好文 > 详细

C51

时间:2015-02-24 12:32:23      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

该文章的内容仅限于STC15F2K60S2单片机的程序设计

一.常用功能

1.逻辑运算和位运算,

  1.逻辑运算符:与(&&),或(||);非(!); 返回0为假,1为真,运算符连接的多为条件语句,例如 (a<10)&&(b==1);

  2.位运算符

  位与(&),位或(|),位异或(^),取反(~),左移(<<),右移(>>)

  位运算符出现的时候,都需要将运算数变成二进制形式,进行位运算,其中位与可以用于清0,位或可以用于置1,对于有符号数,在右移时,符号位将随同移动,当为正数时,最高位补0,而为负数时,最高位为1,最高位补0或是1取决于编译系统的规定(编译系统的规定是什么东西??)在左移的时候不需要考虑正负数的情况吗??

2.预处理

  1.宏定义(define)

    1.无参宏定义

      #define 标识符 字符串                   字符串可以是常数,表达式,格式串等       终止宏定义,可以用#undef命令

    2.带参宏定义

      #define 宏名(形参表) 字符串

  2.文件包含(include)

    #include "文件名"     功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连接成一个源文件。

    比如一些公用的符号常量或者宏定义等可以单独组成一个文件,在其他文件的开头包含该文件,就避免了重复书写公用量

    亲试 ,可以包含.c,.h文件,而且在.c 或者.h文件中编写的程序,定义的变量,在main()中都可以直接使用

    #include "文件名"   #include <文件名>    二者的区别是: 使用尖括号表示在包含文件目录中去查找(包含目录由用户在开发环境中设置,不清楚怎么设置,从未设置过。。),而不在源文件目录去查找,使用双引号表示首先在当前的源文件目录中查找,若找不到,才到包含目录中去查找。  

  3.条件编译

    就是按照不同 的条件去编译不同的程序部分,从而产生不同的目标代码文件,特别是在操作系统的裁剪中,经常用到条件编译。

    1.#ifdef 标识符

        程序段1

     #else 

        程序段2

     #endif

    它的功能是:如果标识符已经被#define命令定义过,则对程序段1进行编译,否则对于程序段2进行编译,当然也可以没有#else 程序段2

    2.#ifndef 标识符

        程序段1

      #else

        程序段2

      #endif

     与1.的功能正好相反,如果没有被定义过,则编译1

   3.#if 常量表达式

      程序段1

     #else

      程序段2

    #endif

    功能是:如果常量表达式的值为真(非0),则对1进行编译

   条件编译当然也可以用条件语句来实现,但是用条件语句会对整个源程序进行编译,生成的目标代码程序较长,而采用条件编译,则根据条件只编译程序段1,或者程序段2,生成的目标程序较短。

二. Keil C 和 ANSI C

  C51的基本语法和ANSI C相同,但对ANSI C进行了扩展,大多数扩展功能都是直接针对8051内核单片机的

  1.扩展关键字(19个)

    _at_      sbit   sfr     bit    sfr16   idata    bdata    xdata    pdata   data  code   alien   small   compact   large   using    reentrant   interrupt   _task_

  1.内存区域

    1.程序存储器

      code: 程序存储区,可以使用code定义表格常数

    2.内部数据存储器(内部RAM)

    .data 直接寻址区,内部RAM的低128B,地址范围是00H-7FH

    .idata 间接寻址区,包括整个内部的RAM区 256B,地址范围是00H-0FFH

    .bdata 可位寻址区,地址范围是20H-2FH

    3。外部数据存储器

    外部RAM视使用情况可由以下关键字标示

    xdata 可指定多达64KB的外部直接寻址区,地址范围是0000H-0FFFFH.

    pdata 能访问1页(256B)的外部RAM(很少用)

  例如 unsigned char xdata arr[10][4][4];

    4.特殊功能寄存器(sfr)

    STC15F2K60S2单片机的特殊功能寄存器(sfr)寻址区,用来控制定时器,计数器,串口,I/O即其他部件,为了支持SFR及其可位寻址的声明,引入sfr,sbit等关键词

    sfr 字节寻址      sfr P0=0X80;   0x80为P0口的地址,=后为常数,并且这个常数必须在特殊功能寄存器的地址范围内,位于0x80到0xff之间

    sfr16 字寻址         sfr16 DPTR = 0X82;  //指定DPTR的地址 DPL = 0X82   DPH = 0X83

    sbit 位寻址         用于声明可位寻址的特殊功能寄存器的位变量  sbit  CY = PSW^7;    sbit OV = 0XD0^2;   sbit EA = 0XAF;  (PSW为已经定义的SFR的名字)

    对于大多数8051内核单片机成员,KEIL提供了一个包含所有特殊功能寄存器和他们位定义的同文件reg51.h

  2._at_ 关键字

    若要实现变量的绝对定位(称为绝对变量),可以直接在数据定义后加上“_at_ 常数地址”即可    注意: 一。绝对变量不能初始化 二。bit型函数以及变量不能用_at_指定

  例如: unsigned char idata  ADCdata _at_ 0x40;

     unsigned char xdata buffer[20] _at_ 0x0010; 指定buffer数组从XRAM的0010H单元开始

  3.存储模式

     1.small 模式             

    所有的变量默认在内部数据存储器,和使用data 指定存储器类型的方式一样    优点是: 效率高,访问速度快,缺点是:空间有限,只适合小程序

    2.compact 模式

    缺省变量位于外部RAM区的一页内,和pdata指定存储器类型一样   特点: 空间比small宽裕,速度比small慢,比large快,是一种中间状态

    3.large 模式

    。。。。。。多大64kb的外部RAM区,和使用xdata一样,使用数据指针DPTR进行寻址,效率低(DPTR是什么啊。。。。。。。)

   4.变量或数据类型

    bit 

    bit型变量用于变量类型和函数声明。函数返回值等,存储于内部RAM的20H-2FH单元中

    注意: 使用禁止中断(#pragma disable)或包含明确的寄存器切换(using n)的函数不能返回位值,否则,编译器会识别出来并产生一个错误信息

        位不能声明为一个指针  不能有bit数组

      sbit可以 声明可独立访问可位寻址对象的位,  sbit声明要求基址对象的存储器的类型是bdata,否则只有绝对的位声明方法是合法的。 位的位置的最大值依赖于指定的基类型,对于char/unsigned char 是 0-7,对于 int /unsigned int /short/unsigned short 是0-15,对于long/unsigned long 是0-31,

例如      int bdata bittest _at_ 0x20;   //可以省略“_at_ 0x20"

    sbit bit0 = bittest^0;     //0x20单元的第0位

    sbit bit1 = bittest^15; //0x21单元的第7位

    注意:可位寻址对象的位声明必须放到main函数外部,作为全局变量使用

C51

标签:

原文地址:http://www.cnblogs.com/lingxianxia/p/4298546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!