2009-03-24
8051微控制器和嵌入式系统-2
3.1 循环和跳指令
--循环:DJNZ reg, label
寄存器reg递减,若它不等于0,就跳到由标号label所指引的目标地址。
循环开始之前,该寄存器加载计数器用以计算循环的次数。
注意:寄存器的递减和跳的与否的决定组合成单一的指令。
MOV A, #0 ;A=0,ACC清零
MOV R2, #10 ;加载寄存器R2=10
AGAIN: ADD A, #03 ;将3加到ACC
DJNZ R2, AGAIN ;重复做加法,直至R2=0(10次)
MOV R5, A ;将ACC中的结果保存在R5中
--循环嵌套
由于R2寄存器是8位,最大值FFH,只能重复256次
例程:将累加器ACC加载值55H,将ACC值置反700次
MOV A, #55H ;A=55H
MOV R3, #10 ;加载寄存器R3=10, 外循环计数
NEXT: MOV R2, #70 ;加载寄存器R2=70,内循环计数
AGAIN: CPL A ;将寄存器A置反
DJNZ R2, AGAIN ;重复做70次(内循环)
DJNZ R3, NEXT
--其它条件跳指令
指令 动作
JZ 若A=0则跳
JNZ 若A!=0则跳
DJNZ 若寄存器!=0则递减并跳
CJNE A, #数据 若A!=数据则跳
CJNE 寄存器,#数据 若寄存器!=数据则跳
JC 若CY=1则跳
JNC 若CY=0则跳
JB 若bit=1则跳
JNB 若bit=0则跳
JBC 若bit=1则跳 并清零
例子:求79H F5H E2H值之和,和值放入寄存器R0(低字节)与R5(高字节)
MOV A, #0 ;A=0
MOV R5, A ;R5=0
ADD A, #79H ;A=0+79H=79H
JNC N_1 ;若无进位则加下一个数
INC R5 ;若CY=1,则递增R5
N_1: ADD A, #0F5H ;A=79H+F5H=6EH 及 CY=1
JNC N_2 ;若无进位则加下一个数
INC R5 ;若CY=1,则递增R5
N_2: ADD A, #OE2H ;A=6EH+E2H=50H 及 CY=1
JNC OVER ;若CY=0则跳
INC R5 ;若CY=1则递增R5
OVER: MOV R0, A ;现在R0=50H 及 R5=02
所有条件跳指令都是短跳指令,范围-128、+127
--无条件跳指令
8051有两条无条件跳指令 LJMP和SJMP
LJMP有3个字节长,第一字节操作码,第二三表示目标位置的16位地址,可以跳0000-FFFF任何单元。
SJMP是2字节指令,00-FFH,前跳和后跳
--计算短跳地址
前跳
后跳(加法替代减法)!!
3.2 调用指令
--LCALL 长调用
3字节指令,可以调用64KB地址,处理子程序时先保存LCALL后随指令的地址在栈中
ORG 0
BACK: MOV A, #55H
MOV P1, A
LCALL DELAY
MOV A, #0AAH
MOV P1, A
LCALL DELAY
SJMP BACK
------------
ORG 300H
DELAY: MOV R5, #0FFH
AGAIN: DJNZ R5, AGAIN
RET
END
--CALL指令和栈的作用
针对上例:下面是栈中存储的内容
0A
09 00(高位)
08 07(低位)
sp=09
--在子程序中PUSH和POP指令的使用
--ACALL绝对调用
目标地址只能限制于2KB范围
3.3 8051产生时间延迟
-- 8051机器周期
指令列表及其机器周期查询附表!!
11.0592MHZ/12=921.6KHZ,机器周期是1/921.6khz=1.085us微秒
16MHZ/12=1.333MHZ,机器周期是1/1.333MHZ=0.75us
常用的是11.0592MHZ晶体振荡器,其与串行口相兼容
--8051延迟计算
大部分是由循环体实施,忽略循环外部的指令时间
DELAY: MOV R3, #200 机器周期1
HERE: DJNZ R3, HERE 2
RET 2
时间延迟为[(200x2)+1+2]x1.085us=436.255us
DELAY: MOV R3, #250 机器周期1
HERE: NOP 1
NOP 1
NOP 1
NOP 1
DJNZ R3, HERE 2
RET 2
时间延迟为[250x(1+1+1+1+2)]x1.085us=1627.5us
加上外循环的两个指令3x1.085us
--嵌套循环
DELAY: MOV R2, #200 机器周期1
AGAIN: MOV R3, #250 1
HERE: NOP 1
NOP 1
DJNZ R3, HERE 2
DJNZ R2, AGAIN 2
RET
HERE循环,(4x250)x1.085us=1085us
AGAIN, 1085x200=217000us
mov&djnz 3x200x1.085=651us
::::217000+651=217.651ms
HERE: SJMP HERE=SJMP $
2009-03-22
LEGO MINDSTORM NXT
The all-new NXT Intelligent Brick, your robot’s “brain,” features a powerful 32-bit microprocessor and Flash memory, plus support for Bluetooth™ and USB 2.0! The NXT intelligent Brick includes:
32-bit ARM7 microprocessor.
Support for Bluetooth wireless communication.
1 USB 2.0 port.
4 input ports.
3 output ports.
Powered by 6 AA (1.5v) Batteries, not included, or lithium Rechargeable Battery (#9798), sold separately.
Up to three NXT Bricks can be connected at the same time; however, you can only communicate with one NXT Brick at a time.
This is the individual component, and does not include any sensors, motors, cords, software or other accessories; for the complete LEGO® MINDSTORMS® NXT set, please see item #8527.
2009-03-20
8051微控制器和嵌入式系统-1
CH01
8051 8052 8031
ROM 4KB 8KB 0
RAM 128B 256B 128B
定时器 2 3 2
I/O 32 32 32
串行端口 1 1 1
中断源 6 8 6
- 存储程序代码的是片内ROM
- RAM?
CH02-8051汇编
2.1 8051内部
寄存器:临时存放信息,可能是欲处理的一个字节数据或者指向欲获取数据的地址。
MSB(most significant bit)7 6 5 4 3 2 1LSB(least...)
8051使用最广泛的寄存器是A,B,R0,R1...,R7,DPTR(data pointer,数据指针)和PC(Program counter,程序计数器),最后两个不是8位,其他均是8位寄存器。
累加器A用于所有算数和逻辑指令。
--MOV指令:MOV 目的,源;从源复制到目的
值可以直接加载到A B R0-R7的寄存器
MOV A, #23H #号表示该为数值,否则是寄存器单元地址
MOV R0, A
MOV R6, #12
MOV B, #0F9H 必须加0,指示F是16进制数
--ADD指令:ADD A, 源 ;将源操作数加到累加器的值上,结果仍在A中
MOVE A, #25H
ADD A, #34H
2.2 8051汇编语言编程引论
[标号:] 助记符 [一个或多个操作数] [;注释]
ORG 0H ;伪指令,在单元0开始
MOV R5, #25H
MOV R7, #34H
MOV A, #0
ADD A, R5
ADD A, R7
ADD A, #12H
HERE: SJMP HERE ;停留在这个循环上
END ;伪指令,汇编源文件的终点
伪指令pseudo-instruction=assembler directive仅为汇编器所用,不生成机器码。
2.3 汇编和运行8051程序
编辑器程序->汇编器程序(生成lst列表文件)->连接器程序->目标至十六进制转换程序
lst列表文件举例
0000 ORG 0H ;伪指令,在单元0开始
0000 7D25 MOV R5, #25H
0002 7F34 MOV R7, #34H
0004 7400 MOV A, #0
0006 2D ADD A, R5
0007 2F ADD A, R7
0008 2412 ADD A, #12H
000A 80FE HERE: SJMP HERE ;停留在这个循环上
000C END
2.4 8051中的程序计数器和ROM空间
PC(PROGRAM COUNTER,程序计数器),指向下一个欲执行的指令地址,16位宽,可以访问0000-FFFF,共64KB的代码,但是一般只使用8KB。
0000-0FFF:4KB
加电时8051从何处苏醒?0000处,8051是如此。逐字节执行程序。
2.5 8051的数据类型和伪指令
8051微控制器只有一种数据类型就是8位二进制码,长于8位的数据要分解才能被CPU处理。
--DB(Define byte,定义字节)最常用的伪指令,它用于定义八位数据。当DB定义数据时,数可以是十进制(+D)、二进制(+B)、十六进制(+H)或者ASCII格式(+" ")。
DB 28 ;十进制
DB 00110101B ;二进制
DB 39H ;十六进制
DB "my name is" ;ASCII码
--ORG 指示开始地址
--EQU 等同
COUNT EQU 25
--END
2.6 8051标志位和PSW寄存器
PSW(程序状态字)8位中只使用6位,PSW.3和PSW.4分别指定为RS0和RS1,用于改变不同的“相寄存器”。PSW.5和PSW.1自定义。
-CY(carry)进位标志
只要当D7位出现进位,该标志便置位。SETB C是置进位位set bit carry; CLR C是清进位位clear carry。
-AC(auxiliary carry)辅助进位
若在ADD和SUB操作中发生从D3向D4的进位,此位置位。
-P(parity)奇偶校验
反映累加器A中1的数目,奇数个1置1,偶数置0
-OV(overflow)溢出
ADD指令和PSW
ADD指令对PSW寄存器中标志位的作用
2.7 8051寄存器相和栈
共128字节RAM,8052有256字节
00H-1FH 32字节 寄存器相bank和栈(相0、1、2、3)
20H-2FH 16字节 位可寻址RAM
30H-7FH 80字节 草稿本区域
--8051寄存器相
相1使用与栈相同的RAM空间
切换寄存器的相,可以用PSW.4.3
--8051中的栈
用于存取栈的寄存器称为SP(stack point 栈指针),8位宽,00-FFH。
加电时,SP值为07。
PUSH推入
POP拉出
8051的RAM单元08到1F可用于栈。大于此可以转向30-7FH
--CALL指令和栈
--用模拟器观察寄存器和存储器
2009-03-19
在Visual C++中处理数字图像
DDB-设备相关位图
DIB-设备无关位图
2.图形设备接口GDI
主要负责系统与绘图程序之间的信息交换,通过GDI所提供的函数,可以方便地实现在监视器、打印机等输出设备上输出图形或文本等操作。
3.OpenCV
