C51

该文章的内容仅限于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函数外部,作为全局变量使用

时间: 2024-08-18 12:11:09

C51的相关文章

C51的数据类型

摘自百度文库 每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的.先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的数据类型.在标准C语言中基本的数据类型为 char,int,short,long,float 和 double,而在c51编译器中int 和 short 相同,float 和 double 相同,这里就不列出说明了.下面来看看它们的具体定 义: 数据类型 长 度 值 域 unsigned char 单字节 0

c51 printf的用法

keil的官方网站关于printf的参考 http://www.keil.com/support/man/docs/c51/c51_printf.htm

C51指针与A51汇编接口之间关系研究

最近在研究单片机C51对汇编的接口问题.char和int等都比较简单,使用寄存器或固定地地址传值都是可以的,具体可以参考keil的C51 user's guide.本篇短文主要重点讨论一下A51下如何遵循C51的接口标准来实现C51的指针.主要原因是,现在用C51的人越来越多,大家都图省事和方便.网上面有关A51的资料少得可怜,知道用汇编来实现代码优化的少之又少.本人是一直坚持用汇编写东西的.在嵌入式领域,很多东西都与硬件有关,多知道点底层东西还是有好处. 使用工具主要为keil,在window

关于C51与汇编的实用混合编程

最近研究了下51的混合编程,总结一下吧! 1.生成C51的汇编源码 右键单击项目文件,在弹出的opinion for file ....选择上生成SRC文件,这个可以产生汇编源文件,也能允许在C51中嵌入A51,即汇编代码,另外不知为何在项目中若嵌入汇编需添加keil的C51S.LIB,否则下载到单片机后无法正常运行,至于具体原因,现在还不是很明白. 2.查看SRC汇编文件 在项目文件中可以找到SRC文件,可查看所写的C51代码翻译成汇编后的代码,截取部分如图所示,由于编译器在编译C文件时会加入

C51单片机项目:时钟

#include<reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit ENLCD = P1^5; sbit KeyIn2 = P2^5; sbit KeyIn3 = P2^6; sbit BUZZ = P1^6; unsigned char LED[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF

字符串与C51的格式化输出

一字符数组和字符指针: 字符指针可以用字符串对其直接初始化和随时赋值:而字符数组可以用字符串进行初始化,但不能用字符串对其进行随时赋值(但此时可以定义一个字符串指针指向字符数组,然后用字符串对指针随时赋值) 如 char*p="helloword"; p="你好"; 可以char a[10]="helllo";但不能随时赋值a="word":此时可以char*p=a;   p="word" 二C51的格式化

C51学习笔记

转自:http://blog.csdn.net/gongyuan073/article/details/7856878 单片机C51学习笔记 一,   C51内存结构深度剖析 二,   reg51.头文件剖析 三,   浅淡变量类型及其作用域 四,   C51常用头文件 五,   浅谈中断 六,   C51编译器的限制 七,                        小淡C51指针 八,                        预处理命令                        

单片机开发:keil4 C51 安装与破解

初学者都知道,Keil 4 是开发单片机必不可少的好工具.其对应开发的硬件平台有多个,Keil MDK-ARM和Keil C51较为常用,但是平时我们总是认为"只要安装keil就可以开发单片机了",这样很多初学者都会随便安装一个keil.其实不然,要开发单片机就需要用到C51版本的keil,这成为初学者容易犯下的错误,本文就简单地叙述在win8.1下如何安装和破解keil4 c51.本人在学习过程中也遇到这些问题,所以找了度娘,在她万般的呵护下终于成功.(下面的步骤参考百度经验,初学者

准备用C51做个学生管理系统(1)

为了做这个看起来很容易,做起来很麻烦的基于51的学生管理系统,我得准备很多的知识,首先是51单片机的一些IO.定时器差不多就可以了,硬件方面还要有数码管.LCD1602.矩阵键盘等知识,至于代码就需要数据结构双向链表的知识就差不多了,用到的软件无非也就是protues.keil.protel这三剑客了. 1.为什么要用到数码管呢,因为很少做这些硬件的东西,用数码管主要是为了验证我的矩阵键盘功能有没有用罢了,数码管的abcdefg对应那几根“杠杠”的亮否可以直接显示亮的数据,因为矩阵键盘是8X8的