Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22533
  • 博文数量: 5
  • 博客积分: 85
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-05 07:21
文章分类
文章存档

2012年(5)

我的朋友

分类: 嵌入式

2012-11-07 08:10:40

第一章 51单片机硬件结构

1. 概述
8051 系列的基本结构如下
1 一个8 位算术逻辑单元
2 32 个I/O 口4 组8 位端口可单独寻址
3 两个16 位定时计数器
4 全双工串行通信
5 6 个中断源两个中断优先级
6 128 字节内置RAM
7 独立的64K 字节可寻址数据和代码区
每个8051 处理周期包括12 个振荡周期每12 个振荡周期用来完成一项操作如取指
令和计算指令执行时间可把时钟频率除以12 取倒数然后指令执行所须的周期数
因此如果你的系统时钟是11.059MHz 除以12 后就得到了每秒执行的指令个数为921583
条指令取倒数将得到每条指令所须的时间1.085ms。

2. 存储区结构
8051结构提供给用户3个不同的存储空间。每个存储空间包括从0 到最大存储范围的连续的字节地址空间通过利用特定地址的寻址指令解决了地址重叠的问题.
2.1 CODE区
CODE区存放可执行代码;被16位寻址,空间可达到64k;一般使用EEPROM作为外接存储器,也可以使用带电池的SRAMs;外接存储器可以被外围设备或8051改写。
2.2 DATA区
DATA区是8051内128字节的内部RAM或8052的前128字节内部RAM;这部分是数据段,指令用一个或两个周期访问数据段,访问DATA区使用直接寻址,比XDATA要快。
数据段中有两个小段,第一个子段包含四组寄存器组,每组寄存器包含八个寄存器,共32个寄存器;另外一个子段叫做位寻址端,包括16个字节,共128位,每一位都可以单独寻址。
2.3 特殊功能寄存器
SFR,中断系统和外部功能控制,很多可以位寻址;
2.4 IDATA区
8051系列的一些单片机如8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,被称为IDATA;
在数据段中也可通过R0 和R1 采用间接寻址R0 和R1 被作为数据区的指针将要恢
复或改变字节的地址放入R0 或R1 中根据源操作数和目的操作数的不同执行指令需要
一个或两个周期。
2.5 XDATA区
8051的最后一个存储空间为64k,和CODE区一样,采用16位地址寻址,称作外部数据区,简称XDATA区;这个区通常包含一些RAM(如SRAM)或一些需要通过总线接口的外围器件。处理XDATA中的数据至少要花3个指令周期。

3. 位操作和布尔逻辑
4. 寻址方式
8051可对存储区直接或间接寻址。这些是典型的寻址方式。直接寻址只能在DATA区和SFR区。
直接寻址例子如下:
MOV A 03H 把地址03H 中的数移入累加器
MOV 43H 22H 把地址22H 中的数移入地址43H 中
MOV 02H C 把C 中的数移入位地址02H 中
MOV 42H #18 把立即数18 移入地址42H 中
MOV 09H SBUF 把串行缓冲区中的数移入地址09H 中
直接取址指的是直接操作某个地址内的数,间接取址时,该地址内的数不能直接进行操作,需要先把该地址的值读到指定的寄存器,对寄存器使用直接取址即可使用该地址内的操作数。间接寻址,比直接寻址增加了一步把数据读出或写入寄存器的过程。例如:
DATA 和 IDATA 区寻址
MOV R1 #22H 设置R1 为指向DATA 区内的地址22H 的指针
MOV R0 #0A9H 设置R0 为指向IDATA 区内的地址0A9H 的指针
MOV A @R1 读入地址22H 的数据
MOV @R0 A 将累加器中的数据写入地址A9H
INC R0 RO 中的地址变为AAH
INC R1 R1 中的地址变为23H
MOV 34H @R0 将地址AAH 中的数据写入34H
MOV @R1 #67H 把立即数写入地址23H
XDATA 区寻址
MOV DPTR #3048H DPTR 指向外部存储区
MOVX A @DPTR 读入外部存储区地址3048H 中的数
INC DPTR 指针加一
MOV A #26H 立即数26H 写入A 中
MOVX @DPTR A 将26H 写入外部存储区地址3049H 中
MOV R0 #87H R0 指向外部存储区地址87H
MOVX A @R0 将外部存储区地址87H 中的数读入累加器中
代码区寻址
MOV DPTR #TABLE_BASE DPTR 指向表首地址
MOV A index 把偏移量装入累加器中
MOVC A @A+DPTR 从表中读入数据到累加器中
5. 处理器状态
处理器状态保存在状态寄存器PSW中,状态字如下所示:
CY 进位标志位
AC 辅助进位标志位
F0 通用标志位
RS1 寄存器组选择位高位
RS0 寄存器组选择位低位
OV 溢出标志位
USR 用户定义标志位
P 奇偶标志位
6. 中断系统
基本的8051支持6个中断源,分别为两个外部中断,两个定时/计数器中断,一个串行口输入/输出中断。
中断使能寄存器IE 可位寻址
EA - ET2 ES ET1 EX1 ET0 EX0
EA 使能标志位置位则所有中断使能复位则禁止所有中断
- 保留
ET2 定时器2 中断使能
ES 串行通信中断使能
ET1 定时器1 中断使能
EX1 外部中断1 使能
ET0 定时器0 中断使能
EX0 外部中断0 使能
每个中断源可通过设置中断优先级寄存器IP来单独设置中断优先级,如果每个中断源的相应位被置位,则该中断源的优先级为高。如果相应的位被复位,则该中断源的优先级为低。
8051在每个处理周期查询中断标志(怎么实现查询的?),确定是否有中断请求。当中断发生时,置位相应的标志,处理器将在下个周期查询到中断标志位,这样,从发生中断到缺人中断中间有一个指令周期的延时。这是,处理器将用两个周期的时间来调用中断服务程序,总共要花三个时钟周期。理想情况下,处理器在三个时钟周期内相应中断。但是当中断到来的时候若有同级的或更高级的中断正在处理,此时中断延迟不定。还有一种情况是,检测到中断时,正在执行多周期指令。
外部中断由外部中断引脚外部中断0 为P3.2 外部中断1 为P3.3 电平为低或电平由高到低跳变引起由电平触发还是跳变触发取决于寄存器TCON 的ITX 位。
7. 内置定时/计数器
8. 内置UART
9. 其他功能。例如:I2C,A/D转换,看门狗;
10.设计
合理的选择单片机和外设;
11.实现
当选择好单片机和外围器件后,下一步就是设计和分配系统I/O地址。代码段从地址0开始的连续空间内。外部数据存储空间地址一般和器件地址相连。RAM一般在从地址0000H 或8000H开始的连续空间内。

第二章 用C对8051编程
8051使用的C语言不是ANSI C,而是KEIL C。
Keil C中标准数据类型占用的字节数:
数据类型大小
char/unsigned char 8 bit
int/unsigned int   16 bit
long/unsigned long 32 bit
float/double       32 bit
generic pointer    24 bit
特殊功能寄存器用sfr 来定义而sfr16 用来定义16 位的特殊功能寄存器如DPTR
通过名字或地址来引用特殊功能寄存器地址必须高于80H 可位寻址的特殊功能寄存器
的位变量定义用关键字sbit,如下:
sfr SCON=0X98; //定义 SCON
sbit SM0=0X9F; //定义 SCON 的各位
sbit SM1=0X9E;
sbit SM2=0X9D;
sbit REN=0x9C;
sbit TB8=0X9B;
sbit RB8=0X9A;
sbit TI=0X99;
sbit RI=0X98;

Keil 允许使用者指定程序变量的存储区这使使用者可以控制存储区的使用编译器
可识别以下存储区
存储区 描述
DATA    RAM 的低128 个字节可在一个周期内直接寻址
BDATA   DATA 区的16 个字节的可位寻址区
IDATA   RAM 区的高128 个字节必须采用间接寻址
PDATA   外部存储区的256 个字节通过P0 口的地址对其寻址使用指令MOVX @Rn,需要两个指令周期
XDATA   外部存储区使用DPTR 寻址
CODE    程序存储区使用DPTR 寻址

什么是再入函数:
因为8051内部堆栈空间的限制,C51没有像大系统那样使用调用堆栈。一般,C语言中调用过程时,会把过程的参数和过程中使用的局部变量。为了提高效率,C51没有提供这种堆栈,而是提供一种压缩栈,每个过程被给定一个空间用于存放局部变量,过程中的每个变量都存放在这个空间的固定位置,当递归调用这个过程时,会导致变量被覆盖。则这个过程称为非再入过程。
    再入函数则不同,它使用的堆栈是虚拟的,类似大系统的中的函数,可以被中断或递归调用,局部变量被单独保存,使用的堆栈是模拟的。再入函数一般比较大。运行起来比较慢。
    非重入库函数列表:
    gets atof atan2
    printf atol cosh
    sprinf atoi sinh
    scanf exp tanh
    sscanf log calloc
    memccpy log10 free
    strcat sqrt Init_mempool
    strncat srand malloc
  strncmp cos realloc
  strncpy sin ceil
  strspn tan floor
  strcspn acos modf
  strpbrk asin pow
  strrpbrk atan

阅读(3034) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~