题记:刚开端练51时就用C言语,现在想再加强一下汇编,所以不得不对单片机的硬件结构,特别是地址空间的分配方面具体的做一下了解了。所以决议拿起讲义北航的《智能化丈量操控外表原理与规划》重新学一遍。书本是根底,然后应该把自己的一些运用领会实例什么的也加上去,这样学起来就事半功倍了究竟这是再学习不是入门了。
51单片机的存储器结构:
在物理上能够分为4个存储器空间:即片内ROM,片外ROM,片内RAM,片外RAM。51/52单片机有64KB(2的16次方,16条地址线寻址)的ROM地址空间。其间51有4KB的片内ROM,52有8KB的片内ROM。至于运用片内仍是片外的存储器,能够靠操控信号EA脚来设置,当从片内存储器开端取指令时,EA脚接正(关于ROM型单片机,一般采纳此方法),此刻假如指令地址超越4KB空间,则主动从片外开端取指令。而假如不运用片内存储器只从片外存储器取指令时,将EA接地即可。
ROM中有些单元是保留给体系运用的:0000-0002H单元是一切履行程序的进口地址,复位后程序总是从0000H单元开端履行。(所以在汇编的开端总是一句
ORG0000
LJMPnnnn;主程序中止进口
这个句子的意思是在0000这个地址上寄存着LJMP nnnn这个句子,这儿的nnnn是程序的进口地址,也便是编程者期望上电后程序从哪个当地开端履行)。
0003-002AH单元均匀的分为5段,用于5个中止服务程序的进口。(例如
ORG00BH
LJMPBT0;TO中止进口
也便是说00BH上寄存着LJMP BTO这个句子,当发生TO中止时,条件当然是此中止处于敞开状况了,程序将履行该句子,然后跳转到BT0所指的地址上的程序持续履行)。
51/52的片内数据存储器RAM有256Byte,其间00H-7FH地址空间是直接寻址区。该区从00H-1FH是作业寄存器区,有4组作业寄存器组,至于运用哪一组则有PSW的RS0和RS1的状况决议。片内RAM的20H-2FH地址为位寻址区。片内RAM的80H-FFH地址空间是特别功用寄存器(SFR)区。52系列有26个特别功用寄存器。下面就把头文件reg52.h里的部分内容贴出来。(关于寄存器地址参阅头文件就足够了,关于其他一些CPU也差不多)。
/*——————————————————————-
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
——————————————————————-*/
/*BYTE Registers*/
sfr P0= 0x80;
sfr P1= 0x90;
sfr P2= 0xA0;
sfr P3= 0xB0;
sfr PSW= 0xD0;
sfr ACC= 0xE0;
sfr B= 0xF0;
sfr SP= 0x81;
sfr DPL= 0x82;
sfr DPH= 0x83;
sfr PCON= 0x87;
sfr TCON= 0x88;
sfr TMOD= 0x89;
sfr TL0= 0x8A;
sfr TL1= 0x8B;
sfr TH0= 0x8C;
sfr TH1= 0x8D;
sfr IE= 0xA8;
sfr IP= 0xB8;
sfr SCON= 0x98;
sfr SBUF= 0x99;
/*8052 Extensions*/
sfr T2CON= 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2= 0xCC;
sfr TH2= 0xCD;
关于MCU的时钟问题:
一般用的是12MHz的晶体,而MCU履行一个机器周期需求12各时钟周期(所谓时钟周期,便是指晶体振荡一个周期的时刻),那么正好是1us,一般的指令需求1-2个机器周期即可完结,乘除指令的运算量比较大需求4各机器周期。
寻址方法:
51单片机有7种寻址方法。
1、寄存器寻址:前面提到了内部RAM中的00H-1FH地址单元作为作业寄存器运用。一共是有32各地址单元,分红四组,每组有8个寄存器,命名为R0-R7,每次能够运用其间的一组。当运用R0-R7来表明操作数时,就归于寄存器寻址方法。
例如:MOVA,R0;把寄存器R0的内容送入累加器A中
2、直接寻址:在指令中直接给出操作数地址,就归于直接寻址方法。此刻指令的操作数部分直接是操作数的地址。
例如:MOV A,2AH;把RAM地址2AH的内容送入累加器A中
3、当即寻址:
例如:MOV A,#3AH;该指令便是表明把当即数3AH送入累加器A中,当即数前加上一个#,和直接寻址方法区别
4、寄存器直接寻址:若以寄存器的称号直接给出操作数的地址,则称为寄存器直接寻址。
例如:MOV A,@R0;该指令是把RO里的内容作为地址,这个地址的数据送入累加器A,留意前面需求加@
5、变址寻址:变址寻址是以某个寄存器的内容为根本的地址,然后在这个基址上加以地址的偏移量,才是真实的操作数地址。
例如:MOV A,@A+DPTR;地址是A+DPTR的值,这个地址的内容送如累加器A
6、相对寻址:相对搬运指令需求用到相对寻址方法,此刻操作数部分给出的是地址的相对偏移量部分。
意图地址=源地址+指令字节数+ rel(rel可正可负)
例如:SJMP rel
7、位寻址:概念就不做解说了。仍是把reg52.h这个头文件贴出来说。
/*BIT Registers*/
/*PSW*/
sbit CY= PSW^7;
sbit AC= PSW^6;
sbit F0= PSW^5;
sbit RS1= PSW^4;
sbit RS0= PSW^3;
sbit OV= PSW^2;
sbit P= PSW^0; //8052 only
/*TCON*/
sbit TF1= TCON^7;
sbit TR1= TCON^6;
sbit TF0= TCON^5;
sbit TR0= TCON^4;
sbit IE1= TCON^3;
sbit IT1= TCON^2;
sbit IE0= TCON^1;
sbit IT0= TCON^0;
/*IE*/
sbit EA= IE^7;
sbit ET2= IE^5; //8052 only
sbit ES= IE^4;
sbit ET1= IE^3;
sbit EX1= IE^2;
sbit ET0= IE^1;
sbit EX0= IE^0;
/*IP*/
sbit PT2= IP^5;
sbit PS= IP^4;
sbit PT1= IP^3;
sbit PX1= IP^2;
sbit PT0= IP^1;
sbit PX0= IP^0;
/*P3*/
sbit RD= P3^7;
sbit WR= P3^6;
sbit T1= P3^5;
sbit T0= P3^4;
sbit INT1= P3^3;
sbit INT0= P3^2;
sbit TXD= P3^1;
sbit RXD= P3^0;
/*SCON*/
sbit SM0= SCON^7;
sbit SM1= SCON^6;
sbit SM2= SCON^5;
sbit REN= SCON^4;
sbit TB8= SCON^3;
sbit RB8= SCON^2;
sbit TI= SCON^1;
sbit RI= SCON^0;
/*P1*/
sbit T2EX= P1^1; // 8052 only
sbit T2= P1^0; // 8052 only
/*T2CON*/
sbit TF2= T2CON^7;
sbit EXF2= T2CON^6;
sbit RCLK= T2CON^5;
sbit TCLK= T2CON^4;
sbit EXEN2= T2CON^3;
sbit TR2= T2CON^2;
sbit C_T2= T2CON^1;
sbit CP_RL2 = T2CON^0;
早年面的特别功用寄存器地址里现已了解了它们在RAM中的寄存地址,这儿又对它们中的部分寄存器的各个位做了界说,也便是说,这些各个位做了界说的寄存器,它们的每一个位是能够独自进行操作的。
例如STEB EA;EA置1,表明开总中止,EA又是IE寄存器的最高位,这儿独自对它进行操作,能够免除对整个IE寄存器做赋值操作,优化程序
经过这些常识的温习,我觉得下一步该动手写程序感受一下了