新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机一些基础问题

单片机一些基础问题

作者: 时间:2013-05-16 来源:网络 收藏

8051 系列的一些如8052 有附加的128 字节的内部RAM 位于从80H 开始的地址空间中被称为IDATA 因为IDATA 区的地址和SFRs (特殊功能寄存器)的地址是重叠的通过区分所访问的存储区来解决地址重叠问题因为IDATA 区只能通过间接寻址来访问。8051 的最后一个存储空间为64K 和CODE 区一样采用16 位地址寻址称作外部数据区简称XDATA 区这个区通常包括一些RAM 如SRAM 或一些需要通过总线接口的外围器件。

8051 可对存储区直接或间接寻址这些是典型的寻址方式直接寻址是在指令中直接

包含所须寻址的字节地址直接寻址只能在DATA 区和SFR 中进行。

SBUF 串行缓冲区 DPTR 数据指针 MOVX 读入或写入外部寄存器的数据

fosc (frequency oscillate)晶振频率

指针寄存器而不是直接使用地址

中断系统

基本的8051 支持6 个中断源两个外部中断两个定时/计数器中断一个串行口输

入/输出中断中断发生后处理器转到将五个中断入口处之一执行中断处理程序中断向

量位于代码段的最低地址出串行口输入输出中断共用一个中断向量

reg51.h 详细说明

是c51(用于开发的一种c语言)的头文件。类似于头文件AT89X52.h。这两个头文件基本是一样的,只是在使用时对位的定义不一样,at89x52.h文件中对P1.1的操作是写成P1_1;reg52.h文件中的操作则写成P1^1。表示方法不一样而已。另外前者是特指ATMEL公司的52系列,后者指所有52系列的单片机。

LED3.C(8): error C141: syntax error near '='

在c51单片机里面不可以用#define LED1 P0^1

正确的使用sbit LED1=P0^1;

还有keil编译器不支持像P0^1=0;或P0^1=1;这样的赋值

本征库(intrinsic routines)和非本征证库

C51提供的本征是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。

C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:

_crol_(_cror_):将char型变量循环向左(右)移动指定位数后返回

_iror_(_irol_):将int型变量循环向左(右)移动指定位数后返回

_lrol_(_lror_):将long型变量循环向左(右)移动指定位数后返回

_nop_: 相当于插入NOP “空指令”,在x86的CPU中机器码为0x90(144)。

_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。

_chkfloat_: 测试并返回源点数状态。

使用时,必须包含#inclucle 一行。

如不说明,下面谈到的库函数均指非本征库函数。

TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)

定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。

其格式为:

工作原理

其中低四位(即D0 ~ D3)定义定时器/计数器T0,高四位(即D4 ~ D7)定义定时器/计数器T1。各位的说明:

Ⅰ,GATE——门控制。

●GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。

当INT0引脚为高电平时TR0置位,启动定时器T0;

当INT1引脚为高电平时TR1置位,启动定时器T1。

●GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。

Ⅱ,C/T——功能选择位

C/T=0时为定时功能,C/T=1时为计数功能。

置位时选择计数功能,清零时选择定时功能。

Ⅲ,M0、M1——方式选择功能

由于有2位,因此有4种工作方式:

M1M0工作方式功能说明

00方式013位定时器/计数器

01方式116位定时器/计数器

10方式2自动重装8位定时器/计数器

11方式3T0分为2个8位独立计数器,T1停止计数

TR0,TR1:分别为T0,T1的运行控制位。1启动,0停止。

GATE:门控制位。GATE=0,由TR0或TR1启动定时器;GATE=1,只有TR0或TR1为1且INT0 或INT1 为高电平时才能启动定时器。

单片机中的TH0 TL0

TH0和TL0是控制定时/计数器T0的,TH1和TL1是针对T1的。也就是用TH0和TL0中的数来控制T0到底定时多久或计数多少再进入中断,TH1和TL1也一样。

16位定时器/计数器的高低位,TL0是低八位,TH0=是高八位,当低八位计数记满了之后,向高八位进一位,计数器,由于51单片机是8位机,所以要分成两个八位的寄存器来存储16位的计数器!

单片机 TH0=0xd8;TL0=0xf0是什么意思

这是为 T0 计数器赋初值,(高位)TH0=0xd8(0xffd8,初始地址为0xffff),(低位)TL0=0xf0(0xfff0)

换成 10 进制是:55536

那么 65536-55536=10000

表明 T0 计数器 计数 10000 个机器周期后溢出。

如果使用 12M 晶振,那么计数 10000 个机器周期使用 10ms,可以作为定时用。

由于TH0和TL0已知,那么可得T0寄存器中为:0xFF00(16)=65280(10)

X=65536-T0=65536-65280=256,,X即为定时机器周期数

如果是12MHz的话,机器周期=1us,那么定时为256us

如果是6MHz的话,机器周期=2us,那么定时时间为512us

机器周期=12*晶振周期,晶振周期=1/晶振频率

指令周期是看一条指令包含有多少个机器周期,如_nop_就一个机器周期

延时函数delay()

c语言里不是那么算的,编译的时候转汇编了用汇编才算的出,不用纠结这个的精确延时的话也都用定时器,大致的延时的话用软件去算就行了

void delay_ms(unsigned int x)

{

unsigned int i,j;

for(i=0;i

for(j=0;j125;j++);

}

AJMP

是无条件跳转指令之一,叫做绝对跳转。 主要是用来改变程序执行的路线,到需要的指令或程序去执行。 AJMP的范围为正负2K单元。使用时注意跳的目的地和当前地址的距离范围不能超过上述值,否则,就会跳过不去。

$

$代表它自己所在位置的地址

中断允许寄存器IE



评论


相关推荐

技术专区

关闭