A. 8051单片机的编址方式是什么
MCS-51单片机的存储器编址方式采用与工作寄存器、I/O端口锁存器统一编址的方式。程序存储器和数据存储器空间好似相互独立的,各自有自己的寻址系统和控制信号,物理结构也不同。程序存储器为只读存储器(ROM),数据存储器为随机存储器(RAM)。
1、程序存储器常用来存放程序和表格常数。程序存储器以程序计数器PC作为地址指针,通过16位地址总线,可寻址的地址空间为64K,片内、片外统一编址。在程序存储器中有些特殊的单元在使用时应加以注意。其中一组特殊的单元是0000H~0002H单元,在系统复位之后,PC为0000H,单片机从0000H开始执行程序,该单元是系统执行陈故乡的起始地址,通常在该地址中存放一条跳转指令,而用户程序从跳转地址开始存放程序。另外一组特殊单元为0003H~0021AH,这40个单元被均匀的分为5份,其定义如下:
0003H~000AH:外部中断0的中断地址区
000BH~0012H:定时器/计数器0的中断地址区
0013H~001AH:外部中断1的中断地址区
001BH~0022H:定时器/计数器1的中断地址区
0023H~002AH:串行中断地址区
可见以上40个单元是专门用于存放中断处理程序的地址单元,中断响应后,按中断的类型自动转到各自的终端区去执行程序。从上面看出,每个终端服务程序只有8个字节单元,用8个字节来存放一个中断服务程序显然是不可能的。通常情况下好似在中断响应的地址区存放一条无条件转移指令,指向程序存储器的真正存放终端服务程序的空间去执行。
2、MCS-51单片机的数据存储器无论在物理上或者逻辑上都是分为两个地址空间,一个为内部数据存储器,访问内部数据存储器用MOV指令;另外一个为外部数据存储器,访问外部数据存储器用MOVX指令。8051内部有128个8位数据存储单元和128个专用寄存器单元,这些单元是统一编址的,专用寄存器只能用于存放控制指令数据。所以,用户能使用的RAM只有00H~7FH单元组成的128字节地址空间,可以存放读写的数据或者运算的中间结果;80H~FFH单元组成的高128字节地址空间的特殊功能寄存器(SFR)区,只能访问,而不能用于存放用户数据。片内RAM的低128字节还可以分成工作寄存器区,可位寻址区和一般RAM去3个区域。
B. 8051单片机地址总纲
你可以参考这篇文章
MCS-51具有64kB程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,此时单片机的端必须接地。强制CPU从外部程序存储器读取程序。对于内部有ROM的8051等单片机,正常运行时,则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。
8051片内有4kB的程序存储单元,其地址为0000H—0FFFH,单片机启动复位后,程序计数器的内容为0000H,所以系统将从0000H单元开始执行程序。但在程序存储中有些特殊的单元,这在使用中应加以注意:
其中一组特殊是0000H—0002H单元,系统复位后,PC为0000H,单片机从0000H单元开始执行程序,如果程序不是从0000H单元开始,则应在这三个单元中存放一条无条件转移指令,让CPU直接去执行用户指定的程序。
另一组特殊单元是0003H—002AH,这40个单元各有用途,它们被均匀地分为五段,它们的定义如下:
0003H—000AH 外部中断0中断地址区。
000BH—0012H 定时/计数器0中断地址区。
0013H—001AH 外部中断1中断地址区。
001BH—0022H 定时/计数器1中断地址区。
0023H—002AH 串行中断地址区。
可见以上的40个单元是专门用于存放中断处理程序的地址单元,中断响应后,按中断的类型,自动转到各自的中断区去执行程序。因此以上地址单元不能用于存放程序的其他内容,只能存放中断服务程序。但是通常情况下,每段只有8个地址单元是不能存下完整的中断服务程序的,因而一般也在中断响应的地址区安放一条无条件转移指令,指向程序存储器的其它真正存放中断服务程序的空间去执行,这样中断响应后,CPU读到这条转移指令,便转向其他地方去继续执行中断服务程序。
数据存储器
数据存储器也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个是内部数据存储区和一个外部数据存储区。MCS-51内部RAM有128或256个字节的用户数据存储(不同的型号有分别),它们是用于存放执行的中间结果和过程数据的。MCS-51的数据存储器均可读写,部分单元还可以位寻址。
8051内部RAM共有256个单元,这256个单元共分为两部分。其一是地址从00H—7FH单元(共128个字节)为用户数据RAM。从80H—FFH地址单元(也是128个字节)为特殊寄存器(SFR)单元。从图1中可清楚地看出它们的结构分布。
在00H—1FH共32个单元中被均匀地分为四块,每块包含八个8位寄存器,均以R0—R7来命名,我们常称这些寄存器为通用寄存器。这四块中的寄存器都称为R0—R7,那么在程序中怎么区分和使用它们呢?聪明的INTEL工程师们又安排了一个寄存器——程序状态字寄存器(PSW)来管理它们,CPU只要定义这个寄存的PSW的第3和第4位(RS0和RS1),即可选中这四组通用寄存器。对应的编码关系如图2所示。
内部RAM的20H—2FH单元为位寻址区,既可作为一般单元用字节寻址,也可对它们的位进行寻址。位寻址区共有16个字节,128个位,位地址为00H—7FH。位地址分配如表1所示,CPU能直接寻址这些位,执行例如置“1”、清“0”、求“反”、转移,传送和逻辑等操作。我们常称MCS-51具有布尔处理功能,布尔处理的存储空间指的就是这些为寻址区。
表1 RAM位寻址区地址表
单元地址 MSB 位地址 LSB
2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H
2EH 77H 76H 75H 74H 73H 72H 71H 70H
2DH 6FH 6EH 6DH 6CH 6BH 6AH 69H 68H
2CH 67H 66H 65H 64H 63H 62H 61H 60H
2BH 5FH 5EH 5DH 5CH 5BH 5AH 59H 58H
2AH 57H 56H 55H 54H 53H 52H 51H 50H
29H 4FH 4EH 4DH 4CH 4BH 4AH 49H 48H
28H 47H 46H 45H 44H 43H 42H 41H 40H
27H 3FH 3EH 3DH 3CH 3BH 3AH 39H 38H
26H 37H 36H 35H 34H 33H 32H 31H 30H
25H 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H
24H 27H 26H 25H 24H 23H 22H 21H 20H
23H 1FH 1EH 1DH 1CH 1BH 1AH 19H 18H
22H 17H 16H 15H 14H 13H 12H 11H 10H
21H 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H
20H 07H 06H 05H 04H 03H 02H 01H 00H
--------------------------------------------------------------------------------
特殊功能寄存器
特殊功能寄存器(SFR)也称为专用寄存器,特殊功能寄存器反映了MCS-51单片机的运行状态。很多功能也通过特殊功能寄存器来定义和控制程序的执行。
MCS-51有21个特殊功能寄存器,它们被离散地分布在内部RAM的80H—FFH地址中,这些寄存的功能已作了专门的规定,用户不能修改其结构。表2是特殊功能寄存器分布一览表,我们对其主要的寄存器作一些简单的介绍。
程序计数器PC(program Counter)
程序计数器在物理上是独立的,它不属于特殊内部数据存储器块中。PC是一个16位的计数器,用于存放一条要执行的指令地址,寻址范围为64kB,PC有自动加1功能,即完成了一条指令的执行后,其内容自动加1。PC本身并没有地址,因而不可寻址,用户无法对它进行读写,但是可以通过转移、调用、返回等指令改变其内容,以控制程序按我们的要求去执行。
累加器ACC(Accumulator)
累加器A是一个最常用的专用寄存器,大部分单操作指令的一个操作数取自累加器,很多双操作数指令中的一个操作数也取自累加器。加、减、乘、除法运算的指令,运算结果都存放于累加器A或AB累加器对中。大部分的数据操作都会通过累加器A进行,它形象于一个交通要道,在程序比较复杂的运算中,累加器成了制约软件效率的“瓶颈”,它的功能较多,地位也十分重要。以至于后来发展的单片机,有的集成了多累加器结构,或者使用寄存器阵列来代替累加器,即赋予更多寄存器以累加器的功能,目的是解决累加器的“交通堵塞”问题。提高单片机的软件效率。
表2 特殊功能寄存器
标识符号 地址 寄存器名称
ACC 0E0H 累加器
B 0F0H B寄存器
PSW 0D0H 程序状态字
SP 81H 堆栈指针
DPTR 82H、83H 数据指针(16位)含DPL和DPH
IE 0A8H 中断允许控制寄存器
IP 0B8H 中断优先控制寄存器
P0 80H I/O口0寄存器
P1 90H I/O口1寄存器
P2 0A0H I/O口2寄存器
P3 0B0H I/O口3寄存器
PCON 87H 电源控制及波特率选择寄存器
SCON 98H 串行口控制寄存器
SBUF 99H 串行数据缓冲寄存器
TCON 88H 定时控制寄存器
TMOD 89H 定时器方式选择寄存器
TL0 8AH 定时器0低8位
TH0 8CH 定时器0高8位
TL1 8BH 定时器1低8位
TH1 8DH 定时器1高8位
C. 求此8051单片机程序代码怎么编写
是一种形式多样,笔墨灵活的文体
D. 8051单片机代码
你可以先去网上找找关于流水灯的程序,这两个挺相似的,稍稍改动一下就行了
E. 简述8051单片机定时计数器编程的基本步骤
设置定时计数器的工作方式。
给定时器赋初始值:THx 和TLx;
允许定时器中断;
允许全局中断;
启动定制器;
中断函数编写(这个是目的,定时计数最终要干什么?)
F. 单片机数码管显示的数值编码
8位数据总线,16位地址总线的CPU;具有布尔处理能力和位处理能力;采用哈佛结构,程序存储器与数据存储器地址空间各自独立,便于程序设计;相同地址的64KB程序存储器和64KB数据存储器;
0-8KB片内程序存储器(8031无,8051有4KB,8052有8KB,89C55有20KB);128字节片内数据存储器(8051有256字节);
32根双向并可以按位寻址的I/O线;两个16位定时/计数器(8052有3个);一个全双工的串行I/O接口;多个中断源的中断结构,具有两个中断优先级;片内时钟振荡器。
(6)8051单片机怎么编码扩展阅读:
单片机工作的三个条件分别是电源、时钟晶振、复位。当单片机不能正常工作时,我们首先就要检查这三个条件,用电压表或者万用表检测他的电源和接地脚,检测两个引脚之间的电压是不是5V左右;对于时钟晶体振荡有没有正常工作。
最好用示波器进行检测,看能否检测到相应频率的正弦波脉冲;复位检测比较简单,单片机的复位电平一般是高电平复位,单片机在接通电源的时候一般复位引脚上会出现5V左右的高电平,另外在按下复位按键时,复位引脚上也会出现高电平,用一般的电压表或者万用表都可以进行检测。
G. 单片机8051怎么编程
1、下个keil3软件,新建工程之后,新建文件,写文件名的时候,写.asm后缀的就是写汇编语言,写.c后缀的就是写C语言。
2、至于怎么编程,单片机编程,重点就是掌握单片机有哪些I/o口,哪些寄存器,哪些特殊寄存器。
3、推荐看一下视频《十天学会单片机》,搜一下都有的,对初学者非常有帮助。
4、另外补充一点,学单片机,光看书一年都学不会,边看边学,一个月就能入门了,所以最好弄一块板子,在上面跑跑程序。
H. 1. C51单片机中对有符号数有三种编码方式,分别是哪些现单片机中有存情char类
C51单片机中对有符号数有三种编码方式,分别是哪些?
--char;
--int;
--float。
现单片机中有存情char类
I. 8051单片机编程
C语言程序员如下:
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
while(1)
{ if(TF0==1)
{
TF0=0;
P2^0=!P2^0;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
}
}
J. 用C语言编写8051单片机程序
/********************************
/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定时器0,定时中断2ms一次对数码管显示扫描;
/* 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;
/* 段A-H接到P0.1....7,位选为 P1.0,1,2;
/* 流水也以计数方式从200到250在P2口显示,低电平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//共阳数字字形0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe};//低电平有效数字个十百位选择
unsigned char buf[3]={0,0,2};//计算中的个十百位暂时存放处
unsigned char one,ten,second;//个十位变量和流水灯显示3秒的时间变量
unsigned char rate;//扫描速度,调整以适应显示效果
unsigned char stop=0, flag=1,flag1=0;//闪烁3秒的标志位,用于主函数对中断的关断参数传递
unsigned int t,tt;//2ms变量
unsigned char rate;//与变量t同步,辅助赋值变
/**********主函数**********/
main(void)
{
TMOD=0X01;
TH0=0xf8;//定时2ms
TL0=0x30;
ET0=1;
EA=1;
TR0=1;
while(1)
{ if(stop==1)//判断stop信号,为1后便关闭定时器
{ TR0=0;
ET0=0;
EA=0;
}
}
}
/*******************中断*******************/
void timer0() interrupt 1
{
TH0=0xf8;//重新赋值定时2ms
TL0=0x30;
if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务
{
t++;
if(t==500)
{ t=0;
one++;
P2=200+ten*10+one; //在P2口的流水等,也是从200开始计数。
if(one==10)
{ one=0;
ten++;
if(ten==5)
{ flag=1;//转向执行闪烁任务
}
}
}
}
else//flag已经==1;转向else执行流水灯闪烁任务
{ tt++;
if(tt==500)
{ tt=0;
second++;
P2=~P2;//流水灯全部以1S速度闪烁
if(second==3)stop=1;//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭
}
}
rate++;
P0=0XFF;//消隐
if(rate==3)rate=0;
P0=num_disp[buf[rate]];
P1=bit_sel[rate];
buf[0]=one;
buf[1]=ten;
//因为百位没有变,所以不用赋值
}