C51语言编程基础

时间:2025-03-07 13:57:42

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型变量


数据类型

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

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

  • 头文件<>或<>
  • 特殊功能寄存器的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的绝对地址访问

  • 绝对宏
    • 头文件<>
    • 宏定义
      • CBYTE以字节形式对code区寻址;
      • CWORD以字形式对code区寻址;
      • DBYTE以字节形式对data区寻址;
      • DWORD以字形式对data区寻址;
      • XBYTE以字节形式对xdata区寻址;
      • XWORD以字形式对xdata区寻址;
      • PBYTE以字节形式对pdata区寻址;
      • PWORD以字形式对pdata区寻址;
#include<>
#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. 如果在中断函数中在调用其他函数,则被调用的函数所使用的寄存器区必须与中断函数使用的寄存器区不同。