【单片机】02ROMRAM

第一个程序:点亮小灯

#include <reg51.h>
sbit LED=P1^0;
void main(){
	LED=0;
	while(1);
}

image-20230328170759277

逻辑运算规则

1.逻辑“与”运算(AND):
ΟΛ0=0, 0Λ1=0, 1Λ0=0, 1Λ1=1
2.逻辑“或”运算(OR):
0v0=0, 1v0=1, 0v1=1, 1V1=1
3.逻辑“非”运算(NOT):非1 = 0
非0 = 1
4.逻辑“异或”运算(XOR):0Φ0=0 0Φ1=1
1Φ0=1
1Φ1=0

计算机中数的表示

1)计算机中数的单位
·数的最小单位:bit(比特,一个二进制位)0或1
·数的基本单位:Byte(拜特,字节)
1Byte=8bit(1字节=8位)
1KB=2^10Byte=1024 B
1MB=2^10KB=220B=1048576 B
1GB=2^10MB=220KB=230B
1TB=2^10GB=220MB=230KB=240B
1PB=2^10 TB
1EB=2^10 PB
1ZB=2^10EB
1YB=2^10 ZB
1BB=2^10YB
1NB=2^10 BB
1DB=2^10 NB

ROM : Read Only Memory,只读存储器

特点:可随机读数据,不能随机写数据
系统断电后,数据不会丢失。
用途:存放程序——程序存储器

程序存储器不但可以放程序,还有可以放数据,若要放数据需要在数据类型的后面加关键词code,例如:char code x=32;
注意点:上面的语句是将x安排在程序存储器,必须在定义时就初始化,在程序中不可以再赋值

4K 字节容量
1KB=1024字节
4KB=4096字节
image-20230328172120908

单片机内部程序存储器(ROM)
用户无须考虑程序的存放地址,编译程序会在编译过程中自动安排程序的存放地址。
0地址存放程序的第一条指令
EA引脚接高电平,无需外扩程序存储器。
image-20230328172314980

数据存储器

RAM:Random Access Memory,随机存取存储器
特点:可以随机读写数据,
掉电内容丢失容量:128x8
用途:存放中间结果或临时数据——数据存储器

这128字节的数据存储器怎样使用呢?其实,我们采用C语言编程的话,只要按照要求定义各类变量就可以了,不需要我们来具体考虑怎样存放这些中间变量,这也是我们采用C语言编程的好处,我们不需要了解太多单片机内部的结构。

说明:这128字节的数据存储器其中有16个字节可以按位寻址,也就是说我们可以定义的最小变量类型是位类型bit,例如:bit x; x的取值只有两种0和1

单片机数据存储器

接下来我们走进MCS—51单片机的内部RAM即数据存储器仓库中,大家想象一下,摆在我们面前的是一层层的“抽屉”,也就是存储单元,每个“抽屉”拉开是8个格子,每个格子里不是“0”就是“1”,每个抽屉的外面都有编号,也就是存储单元地址,编号按顺序从00H到FFH,共256个存储单元。这256个单元是可以在线写入和读出数据,也就是可以用C语言中的赋值运算符“=”向这些存储单元中写入数据。
内部数据存储器从中间一分两,00H~7FH的低128字节单元地址空间为数据存储器RAM区,而80H~FFH的高128字节单元地址空间,为单片机特殊功能寄存器区,下面我们详细介绍这个区域。
image-20230328172900956

一、数据存储RAM区

如图3.2所示,数据存储RAM区的地址空间又分为三部分,分别是00H~1FH为工作组寄存器区、20H~2FH为可位寻址区、30H~7FH为一般RAM区。
image-20230328173105122

对于使用C51编程,工作组寄存器区对于程序员来说是透明的,所以我们在这儿不做详细讲解。
可位寻址区,大家可以这么想象一下,上面我们说每个存储单元好比是个抽屉,抽屉打开里面有8个格子,而这个区域的每个抽屉打开发现有8个小抽屉,CPU可以独立读/写这些小抽屉,因为有了这些可以独立读/写的位,所以我们在用C51编程时,最小的变量可以定义为位,定义格式如下:
bit x;

当然可位寻址区也可以分配其他类型的变量,C51 与标准 C 语言区别很明显的地方。
C51中可以指定变量存储在具体的存储器区域内,若程序员想在该区域内定义一个int变量,可以在类型后加 bdata,如下:
int bdata test;
该test 变量就会被分配在可位寻址区,因为可位寻址区CPU是可以按位访问的,也就是CPU可以只访问该test变量中的一位,例如,若想将 test 变量的最低位赋为1,可以用sbit先定义test的最高位,再赋值,如下:
sbit test_0=test^0; test_0=1;

这里要注意一下sbit和bit的区别:bit定义的是位变量,编译器在编译过程中分配的地址是随机的;sbit是对应可位寻址空间的一个位,sbit大部分是用在特殊功能寄存器(后面讲解)中的,方便对特殊功能寄存器的某位进行操作的。
一般RAM区,也就是一般的存储单元,该区域的存储单元即不能做工作组寄存器使用,也不能按位访问。
总之,在用C51编程时,该区域是用来分配变量空间的,C51中变量定义类型、占用空间及变量范围如表3.1所示。
image-20230328173538710

二、特殊功能寄存器区

如图3.1所示,MCS—51系列单片机在内部RAM的高128字节单元地址区域集成了20多个特殊功能寄存器(SFR)区,这些寄存器除了具有可以在线访问(读/写)功能外,顾名思义,还具有特殊的功能要求。具体具有哪些特殊功能,我们在后面讲解各个模块时再一一详细介绍,这些寄存器是我们这门课的重点,可以这么说,若掌握了这些寄存器的使用,就熟悉掌握了MCS—51芯片的开发应用。表3.2中列出了8051中这些寄存器的情况。
image-20230328174202302
在使用C51编程时,若使用以上特殊功能寄存器,都必须先用sfr定义再使用,例如定义P0口锁存器,可用如下的定义语句:
sfr P0=0x80;
上句话的意思是:定义特殊功能寄存器P0,并且规定P0的地址值为80H。注意这里的“=”不能理解为赋值运算符,而是表示P0的地址。大家还要注意“sfr”与“char”区别,例如下面的定义语句:

char x=0x80;
用char定义的x,系统是任意分配数据存储单元,这里的“=”是赋值运算符,这句话的意思是定义了一个变量x,并给x赋了个初值0x80。但上面的P0和x的共同点是大小都是一个字节。

表3.2中指出,P0寄存器是可以按位寻址的,也就是CPU可以单独对P0寄存器的每个位单独赋值,而不影响其他的位,例如上面的例子,我们可以单独对PO寄存器的第0位赋值,首先我们要先用sbit对P0寄存器的第0位进行定义:
sbit P0_0=P0^0;
该定义语句的意思是将P0寄存器的第0位定义为P0_0,你也可以定义为其他的名称,例如该位是控制LED灯的,可以定义为LED,这样更形象一点。定义了该位后,我们可以直接对该位赋值:

P0_0=0;//将P0寄存器的第0位赋值为0,P0寄存器的其他位不受影响
P0_0=1;//将P0寄存器的第0位赋值为1,P0寄存器的其他位不受影响

这里需要说明的是,表3.2中的特殊功能寄存器在keil软件里的“reg51.h”中都已定义好了,程序员完成可以不用自己定义这些寄存器,只要在需要的源程序文件里开头加上“#include<reg51.h>”就行了。

下面我们结合点亮LED灯实验,重点介绍P0、P1、P2、P3特殊功能寄存器,看看他们的特殊功能体现在哪儿?大家回想一下,P0、P1、P2、P3这四个名称我们还在哪儿用过?对了,我们上次课介绍单片机引脚功能时介绍过输入/输出口P0口、P1口、P2口、P3口,那PO、P1、P2、P3寄存器跟PO口、P1口、P2口、P3口有什么联系呢?他们的联系就是,当四个I/O口作为输出功能时,P0、P1、P2、P3寄存器的某一位为0,P0口、P1口、P2口、P3口对应的引脚就是低电平,P0、P1、P2、P3寄存器的某一位为1,PO口、P1口、P2口、P3口对应的引脚就是高电平(+5V),例如P1寄存器的第0位为0,那P1口的第0个脚也就是P1.0则会输出低电平,P1寄存器的第0位为1,那P1口的第0个脚也就是P1.0则会输出高电平。
综上所述,我们终于可以自己写出点亮LED的程序了。

#include <reg51.h>
sbit LED=P1^0;  //P1寄存器的最低位定义为LED
void main(){
	LED=0;      //将LED位赋为0,这时外部引脚P1.0就会输出低电平,LED会亮。
	while(1);
}
#include <reg51.h>
void main(){
	P1=0;
	while(1);
}

P1=0时,8个小灯都亮了

特殊功能寄存器Special Function Register(SFR)

image-20230328175231518

  • 在这128个字节单元中,SFR其实只占用了21个单元,这21个单元的地址地址是不连续的
  • 没有出现在这里的单元是为单片机硬件升级的时候预留下来的,我们是不能使用的。
  • 在程序设计中,只要我们对这些寄存器进行控制,也就控制了单片机的硬件了。
  • image-20230328175334146

sfr——定义寄存器的名字和地址的对应关系

sfr P0=0x80;//特殊功能寄存器PO的地址是0x80
P0=0x55;//把十六进制数55H(01010101)赋值给PO寄存器

image-20230328175545890

有部分SFR还可以位操作,它们对应的地址都能被8整除
位和字节的关系就像组员和小组的关系一样,位是一个组员,小组是一个集体。
sbit——定义特殊功能寄存器中的可位寻址的位名称
sbit LED=P1^0;//定义SFR中的可寻址位LED=1;
image-20230328175704729

I/O接口特殊功能寄存器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fhPtB8i-1680017742349)(./assets/image-20230328190209139.png)]

image-20230328190809331

image-20230328190857995

)]

I/O接口特殊功能寄存器
image-20230328190209139

image-20230328190809331

image-20230328190857995

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值