单片机怎样更新存储器(关于51单片机存储器的几个小问题)
一、关于51单片机存储器的几个小问题
第一个问题:
程序计数器PC是和RAM统一编址的,由于有特殊的作用,所以不能叫做RAM,这类空间通常被叫做寄存器。在单片机的资料中通常说是128字节(或者256字节),其实使用中没有这么多的空间供你使用,就是这个原因。
至于说为被分到内部RAM中,只是为了给这个寄存器一个名份,既一个名字。相当于一个教师是公务员,但是我们不叫他公务员,而是直接叫做教师,他的编制是在公务员里面的。
第二个问题:
同第一个问题,是和RAM统一编址的。
第三个问题:
像你所说,PO口的字节地址是80H。但是请你注意是“字节”地址。后面的80H-87H是“位”地址,这些位地址是在“字节”地址里面的。数数看80H-87H是不是8个位,正好一个字节。
你看的RAM后128单元的82H等等也是字节地址,你应向字节地址为80H的里面,(既每一位去看)。
第四个问题:
掉电再上电后,RAM中的数据是不确定的。而寄存器都有上电初始值,一般的都是清0,不过也有特殊的,比如80H(既是P0口)寄存器,上电后是FF。
掉电是电源电压低于单片机的工作电压,单片机认为掉电。
断电是外部断电,由于有电源电容的存在,所以短时间的断电,单片机不一定认为是掉电,还可能还在工作。
长时间断电的话和掉电的概念就差不多了。
二、单片机应用程序一般存放在哪一个存储器中
ROM。只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。
ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。ROM所存数据稳定,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。
扩展资料
单片机的数据存储器由读写存储器RAM组成。其大容量可扩展到64k,用于存储实时输入的数据。8051内部有256个单元的内部数据存储器,其中00H~7FH为内部随机存储器RAM,80H~FFH为专用寄存器区。
实际使用时应首先充分利用内部存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。
8051内部数据存储器地址由00H至FFH共有256个字节的地址空间,该空间被分为两部分,其中内部数据RAM的地址为00H~7FH(即0~127)。
而用做特殊功能寄存器的地址为80H~FFH。在此256个字节中,还开辟有一个所谓“位地址”区,该区域内不但可按字节寻址,还可按“位(**t)”寻址。对于那些需要进行位*作的数据,可以存放到这个区域。从00H到1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0~R7。
三、分析at89s52单片机的存储器结构
1.程序存储器
设计人员编写的程序存放在微处理器的程序存储器中。
at89s52具有64kb程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息,程序存储器的结构如图1所示。
图1 at89s52程序存储器的结构
at89s52片内片外的程序存储器在统一逻辑空间中,地址从0000h~ffffh,共有64k字节范围。引脚接高电平时,程序从片内程序存储器0000h开始执行,即访问片内存储器。当pc值超出片内rom容量时,会自动转向片外程序存储器空间执行。引脚接低电平时,迫使系统全部执行片外程序存储器0000h开始存放的程序。
2.数据存储器
at89s52有256字节片内数据存储器。地址为00h~ffh。这256个单元共分为两部分。其一是地址从00h~7fh单元(共128个字节)为用户数据ram。从80h~ffh地址单元(也是128个字节)为特殊寄存器(sfr)单元。高128字节与特殊功能寄存器重叠,也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。
在00h~1fh共32个单元中被均匀地分为四块,每块包含八个8位寄存器,均以r0~r7来命名,称这些寄存器为通用寄存器。这四块中的寄存器都称为r0~r7,利用psw的第3和第4位(rs0和rs1),即可选中这四组通用寄存器。
内部数据存储器的20h—2fh单元为位寻址区,可作为一般单元用字节寻址,也可对它们的位进行寻址,位寻址区地址如表1所示
表1 ram位寻址区地址表
3.中断服务程序的入口地址
在程序存储区中,为中断服务程序保存了一段中断服务程序的入口地址:其中一组特殊单元是0003h—0032h,各个单元各有用途,它们被分为六段,每个段8个字节,专门留给中断服务程序使用,被称为中断矢量区。at89s52共有8个中断源,6个中断矢量,它们的定义如下表2所,
表2中断服务程序的入口地址
4.特殊功能寄存器sfr(special? function register)
特殊功能寄存器是指有特殊用途的寄存器**,也称为专用寄存器,本质上是一些具有特殊功能的片内ram单元,反映单片机的运行状态,很多功能也通过特殊功能寄存器来定义和控制程序的执行。
at89s52单片机内部高128(80~ffh)地址分配给特殊功能寄存器。这个地址空间和芯片内数据存储器的高128字节地址完全重叠,但两者在物理硬件上是完全独立的,用寻址方式来区分这个完全重叠的地址空间。使用直接寻址方式访问这个地址空间时,访问的是特殊功能寄存器;使用间接寻址方式访问这个地址空间时,访问的是数据存储器。
at89s52有32个特殊功能寄存器,它们被离散地分布在内部ram的80h~ffh地址中,这些寄存的功能已作了专门的规定,用户不能修改其结构。
5.几个注意问题
(1)地址的重叠性
单片机中的所有存储器都必须分配地址,可以寻址的地址范围为64kb,数据存储器与程序存储器都占用相同的地址。
程序存储器中片内片外0000h~0ffffh低4kb地址完全重叠,但是我们使用引脚进行区分:=0时,选择片外,=1时,选择片内,这样就完全区分开来了。
数据存储器中片内外0000h~00ffh的256个单元地址完全重叠,片内外数据的访问采用不同指令来区分:mov指令访问片内数据存储器,movx指令访问片外数据存储器。
(2)程序存储器(rom)与数据存储器(ram)的区分
程序存储器(rom)与数据存储器(ram)的区分在使用上是严格区分的,程序存储器只能放置程序指令及常数表格,对程序存储器中数据的访问只可以使用movc指令。而数据存储器则存放数据,片内外的*作指令分别用mov,movx进行*作。
(3)位地址空间的区域划分
片内ram中的20h~2fh的128位,以及sfr中的位地址,这些位寻址单元与位指令集构成了位处理器系统
四、8052单片机程序存储器中的六个特殊单元是什么,各有何用途
#include<reg52.h>头文件
#define uchar unsigned char宏定义懂吧以后unsigned char就用uchar表示了
uchar code table[]=
;编码定义和C中数组定义方法类似这里主要是为了让数码管显示具体数字而编的
uchar seconds,minute,count1;定义变量
/**********初始化函数***************/
void init()
{
P0=0xff;这个有电路图才好说不过好像是让端口都为高电平
P0=0x00;//初始化关显示
seconds=0;
minute=0;
count1=0;
TMOD=0x11;//选择计数器T1模式1
TH1=(65536-46080)/256;这是定时器的设置计算初值改变那个被减数可以改变每次的时间
TL1=(65536-46080)%256;//定时器1实现50MS定时同上
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//定时器1开始计数
}
/******定时器1中断函数*********/
void t1() interrupt 3//定时器1中断级别为3
{
TH1=(65536-46080)/256;//数据重载“/”这符号是求模
TL1=(65536-46080)%256;”%“这符号是求余
count1++;
if(count1==20)这个20乘以上面的那个50毫秒就是1秒钟
{
count1=0;计20次重新归零
seconds++;每计20次秒数加一
if(seconds>59)
{
seconds=0;
}minute++;当秒数>59时秒数归零分加1我个人觉得这应该设置为>60如果设置为59的话 seconds=59的时候就归零了就是说59可能就不会显示了
}
}
/*******延时函数***************/
void delay(uchar xms)
{
char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);这是根据程序仿真算的时间每110次大概就是一毫秒设置X等于几就是几毫秒
}
/************显示函数***********/
void display(uchar temp)
{
uchar qian,bai,shi,ge;定义变量
temp=seconds;把seconds的值传递给temp
qian=minute/10;对10取模
bai=minute%10;对10取余
shi=temp/10;对10取模
ge=temp%10;对10取余
P0=0xff;//消隐这个没什么大用去掉也可以
P2=0xdf;//第一个数码管选中这个值得看你那电路图
P0=table[ge];对P0赋值从table中调取
delay(1);调用延迟函数延迟一毫秒
P0=0xff;//消隐
P2=0xef;//第二个数码管选中看电路图赋值
P0=table[shi];同上
delay(1);
P0=0xff;//消隐
P2=0xf7;//第三个数码管选中
P0=table[bai];
delay(1);
P0=0xff;//消隐
P2=0xfb;//第四个数码管选中
P0=table[qian];
delay(1);
}
/************主函数***********/
void main()
{
init();初始化函数
while(1)大循环
{
display(seconds);让数码管开始显示计秒
}
}
这是一个计时器程序没有小时是计秒然后还有分钟我也是初学者有什么问题我们可以再讨论我的邮箱snowleopard331@163有问题发邮件给我一起讨论