C51语言编程基础

news/2025/2/22 4:47:21/

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,他的地址为50Hxdata unsigned int y2_at_0x40000;
}

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

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

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

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

http://www.ppmy.cn/news/282721.html

相关文章

【JD算法题】定义一个数组的权值为,该数组最大值的出现次数。求长度为n且每个元素范围都在[1,n]的所有数组的权值之和。

Problem 小红定义一个数组的权值为&#xff0c;该数组最大值的出现次数。 例如[2,3,3,4]的权值为1&#xff0c;[2,3,3,3]的权值为3. 小红想知道&#xff0c;长度为n&#xff0c;且每个元素范围都在[1,n]的数组&#xff08;显然有n^n个数组&#xff09;&#xff0c;这些数组的权…

Keil 5 C51与STM32

Keil安装以及破解 链接&#xff1a;https://pan.baidu.com/s/1ZNSFUBD6q6pEixHx6spjmw 提取码&#xff1a;xf85 安装方法按照txt文档说明进行&#xff0c;以下为早期版本安装方法&#xff0c;仅供参考 选择安装地址 完善信息&#xff08;这个地方随便写&#xff09; 以管理…

C51编程简介

Keil的C51是支持51单片机最成功的C语言&#xff0c;它功能强大且代码效率极高&#xff0c;其应用最为广泛。但是&#xff0c;C51和标准C有一定的区别&#xff0c;主要体现在数据类型和数据存储结构上的差别&#xff0c;下面主要介绍C51和标准C有区别的内容。 一、C51的数据类型…

STM32踩坑:UCOSIII下串口中断服务中使用OSIntEnter函数使程序卡死解决方案

UCOSIII下串口中断服务中使用OSIntEnter函数使程序卡死解决方案 本文侧重于 STM32 标准库&#xff0c;HAL 库可以借鉴&#xff0c;因为该项目是基于标准库做的&#xff08;因为涉及到保密&#xff0c;这里我就张贴源码进行描述了&#xff09;。 因项目需求&#xff0c;需要使用…

C5..

今天回想了一下 一维数组的定义方式. 学了创建一个二维数组. 不能忘记.一维数组可以省略元素个数.二维数组只能省略第一维. //定义字符串数组 // //char strings[几个字符串][每个字符串的长度] {初始值列表}; // char strings[4][50] {"iOS", "Cocos…

C51 按键

按键 C51 按键1.独立按键2.矩阵按键3.按键消抖4.矩阵按键扫描 C51 按键 1.独立按键 利用电流&#xff0c;我们就可以通过 KeyIn1 这个 IO 口的高低电平来判断是否有按键按下。 方框内的电路都是指单片机内部部分&#xff0c;方框外的就是我们外接的上拉电阻和按键。当我们要读…

C5 操作符

文章目录 移位操作符整数二进制表示有三种形式整数在内存中存储的是补码的二进制补码——>原码 两种方式左移操作符右移操作符对于移位操作符&#xff0c;不要移负数位&#xff0c;这是标准 位操作符 移位操作符 整数二进制表示有三种形式 原码反码补码 正整数的原码补码…

C51 定时器

目录 定时器的介绍STC89C52定时器资源定时器框图定时器工作模式中断系统单片机引脚图中断服务流程中断资源定时器相关寄存器代码 定时器的介绍 定时器介绍&#xff1a; 51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成。 定时器作用&…