C51语言编程基础

Keil C51语言基础知识

  • 关键字
关键字用途说明
bit位标量声明声明一个位标量或位类型的函数
sbit位标量声明声明一个可位寻址变量
sfr特殊功能寄存器声明声明一个特殊功能寄存器
sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器
data存储器类型说明直接寻址的内部数据存储器
bdata存储器类型说明可位寻址的内部数据存储器
idata存储器类型说明间接寻址的内部数据存储器
pdata存储器类型说明分页寻址的外部数据存储器
xdata存储器类型说明外部数据存储器
code存储器类型说明程序存储器
interrupt中断函数说明定义一个中断函数
reentrant再入函数说明定义一个再入函数
using寄存器组选择选择单片机的工作寄存器组
_at_绝对地址为非位变量指定存储空间绝对地址
small存储模式选择参数及局部变量放入可直接寻址的内部RAM
compact存储模式选择参数及局部变量放入分页外部数据存储区(256字节)
large存储模式选择参数及局部变量放入分页外部数据存储区(64kb)

不允许在BDATA区中声明float和double型变量


数据类型

数据类型位数字节数取值范围
bit10
sfr810~255
sfr161620~65535
sbit1可进行位寻址的SFR的某位的绝对地址
  • 位变量bit
    bit的值可以是1(true),也可以是0(false)
  • 特殊功能位sbit
    sbit是指特殊功能寄存器的可寻址位。
    sbit PSW^2 = 0xd2;符号^前面是特殊功能寄存器的名字,后面的数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。

C51语言的特殊功能寄存器以及位变量定义

  • 头文件<reg51.h>或<reg52.h>
  • 特殊功能寄存器的C51定义
    sfr 特殊功能寄存器名字 = 特殊功能寄存器地址
sfr scon = 0x98;    /*串行口控制寄存器地址98H*/

若要访问16位SFR,16位SFR的低字节地址必须作为sfr16的定义地址。

  • 特殊功能寄存器中的位定义
  1. sbit 位名 = 特殊功能寄存器^位置
sbit CY  = PSW^7;   /*定义CY位为PSW.7*/
  1. sbit 位名 = 字节地址^位置
sbit CY  = 0xD0^7;   /*CY位地址为0xD7*/
  1. sbit 位名 = 位地址
sbit CY  = 0xD7;   /*CY位地址为0xD7*/
  • 位变量的C51定义
  1. 定义位变量
bit   bit_name;
  1. 函数可以包含类型为bit的参数,也可以将其作为返回值
bit func(bit b0,bit b1)
{
    return(b1);
}
  1. 位变量不能用来定义指针和数组

C51的绝对地址访问

  • 绝对宏
    • 头文件<absacc.h>
    • 宏定义
      • CBYTE以字节形式对code区寻址;
      • CWORD以字形式对code区寻址;
      • DBYTE以字节形式对data区寻址;
      • DWORD以字形式对data区寻址;
      • XBYTE以字节形式对xdata区寻址;
      • XWORD以字形式对xdata区寻址;
      • PBYTE以字节形式对pdata区寻址;
      • PWORD以字形式对pdata区寻址;
#include<absacc.h>
#deifine PORTA XBYTE[0XFFC0]    //将PORTA口定义为外部I/O口,地址为0XFFC0
  • _at_关键字
    [存储器类型] 数据说明符 变量名_at_地址常数
void main(void)
{
    data unsigned char y1_at_0x50;      //在data区定义字节变量y1,他的地址为50H
    xdata unsigned int y2_at_0x40000;
}

中断服务函数
**void 函数名()[interrupt 中断号][using n]

中断号中断源
0外部中断0
1定时/计数器0
2外部中断1
3定时/计数器1
4串行口

using:选择单片机的工作寄存器组,可以不选用。
编写中断程序时,应遵循的原则:

  1. 中断函数不能进行参数传递。
  2. 中断函数没有返回值。
  3. 在任何情况下都不能直接调用中断函数。
  4. 如果在中断函数中在调用其他函数,则被调用的函数所使用的寄存器区必须与中断函数使用的寄存器区不同。

更多推荐

C51语言编程基础