单片机c51头文件的解释

#include <reg51.h>是 c51(用于单片机开发的一种c语言)的头文件。   类似于头文件 AT89X51.h。   这两个头文件基本是一样的,只是在使用时对位的定义不一样,   at89x51.h 文件中对 P1.1的操作是写成 P1_1;   reg51.h 文件中的操作则写成 P1^1。

打开 reg51.h 可以看到这样的一些内容:   此文件一般在 C:\KEIL\C51\INC 下 ,INC 文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。   如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到 INC 文件夹里就可以了。

  sfr 并非标准C语言的关键字,而是 Keil 为能直接访问 80C51 中的 SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。   符号 P1_0 来表示 P1.0 引脚。   在C语言里,如果直接写 P1.0,C编译器并不能识别,而且 P1.0 也不是一个合法的语言变量名,所以得给它另起一个名字,这里起的名为 P1_0, 可是 P1_0 是不是就是 P1.0呢?   你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了 Keil C 的关键字 sbit 来定义,

sbit 的用法有三种:   第一种方法:sbit 位变量名=地址值   第二种方法:sbit 位变量名=SFR 名称^变量位地址值   第三种方法:sbit 位变量名=SFR 地址值^变量位地址值 如定义 PSW 中的 OV 可以用以下三种方法:   sbit OV=0xd2 (1)说明:0xd2 是 OV 的位地址值   sbit OV=PSW^2 (2)说明:其中 PSW 必须先用 sfr 定义好   sbit OV=0xD0^2 (3)说明:0xD0 就是 PSW 的地址值 因此这里用 sfr P1_0=P1^0;就是定义用符号 P1_0 来表示 P1.0 引脚,如果你愿意也可以起 P10 一类的名字,只要下面程序中也随之更改就行了。

1)“文件包含”处理概念   所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如 reg51.h 然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。

2)寄存器地址及位地址声明的原因   reg51.h 里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如 sfr P1=0x80; sfr IE=0xA8; sbit EA=0xAF 等。   sfr P1 = 0x90 这句话表示:P1 口所对应的特殊功能寄存器,P1在内存中的地址为0x90。   sbit EA=0xAF 这句话表示:EA 这一位的地址为 0xAF。   程序状态寄存器 Program Status WORD=PSW (程序状态信息)

3)内存、SFR、位、地址等的通俗解释   前面讲到了寄存器地址和位地址(前提能位寻址)声明的目的是为告诉 C 编译器相应寄存器及其位在内存中的地址,这样我们对寄存器及一些位赋的变量和数值才能正确保存, 然后才能供 CPU 正确的调用,完成相应的功能。上段文字出现了寄存器(SFR)、位、地址、内存等,单片机学习过程中还会出现ROM、RAM 等名词,可能大家觉得不是很好理解,这里可以通俗的解释一下。   我们把内存比作宾馆,ROM、RAM、SFR 相当于宾馆里具体的有三种不同功能楼层(具体这个宾馆多少层即多少 ROM、RAM、SFR,视各个宾馆或者每种单片机而不同),每层 8个房间相当于8位,每个房间要么住男人要么住女人相当于每位要么放入数字1要么放入数字0,keil 编译器就相当于宾馆的工作人员,旅客去住旅馆相当写程序的过程,住宾馆的人必须事先要给工作人员说你是哪一层哪一个房间(即声明寄存器地址和位地址,)宾馆工作人员才能把你带到你的房间里去(这里假设这个宾馆可以由旅客自己决定住哪个房间)。 即:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil 软件才能编译通过。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CodingToDie

使用Vue完成前后端分离开发(三)

可以在控制台运行 python manage.py startapp member

11320
来自专栏Python爬虫实战

Python爬虫之二:自制简易词典

运行平台: Windows Python版本: Python3.6 IDE: PyCharm 其他工具: Chrome浏览器

11820
来自专栏机器学习实践二三事

Theano的一个关于signal,signal/conv,signal/downsample的错误

安装了Theano和keras之后,准备走段代码出错了,大概意思是: “Theano is missing signal”,就是说signal模块找不到,我跑...

25880
来自专栏13blog.site

Mybatis-Generator生成Mapper文件中<if test="criteria.valid">的问题解答

写在前面 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决,有的是把问题留在项目的issue里提出,有的是在我的私人博客里留言...

34860
来自专栏Crossin的编程教室

一些常见的新手问题

本账号开设至今,回答的各种问题,没有一万也有八千了。今天挑了其中曝光率较高的一些问题,跟各位分享,供入门不久和新关注的同学参考。 1. 我是零基础,如何开始学习...

30990
来自专栏AI派

真是绝了!史上最详细的Jupyter Notebook入门教程

Jupyter Notebook 是一个在浏览器中使用的交互式的笔记本,可以实现将代码、文字完美结合起来,它的受众群体大多数是一些从事数据科学领域相关(机器学习...

1.3K80
来自专栏超然的博客

BAT 前端开发面经 —— 吐血总结

最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘、总结提升,二是希望给大家一些参考 其他面试及基础相关可以...

26920
来自专栏老九学堂

【新手必读】Java初学者,你遇到的问题都在这了

很多小伙伴初次接触Java时往往会感觉十分迷茫,在这里老九君收集并解答了同学们遇到的一些基础问题,希望能对大家的Java学习之路有所帮助。 初识篇 1、什么是J...

37760
来自专栏gaoqin31

设计模式之 六大原则

定义: 一个类承担的职责不宜过多,或者说就一个类而言,应该仅有一个引起它变化的原因

13930
来自专栏程序员的SOD蜜

移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记

之前,不怕“重复发明轮子”的我,搞了一个“PDF.NET框架”,即“PWMIS数据开发框架”(目前已经开源),自己用特殊的方式设计了一个实体类基类,然后又设计了...

46850

扫码关注云+社区

领取腾讯云代金券