C51汇编伪指令

发布者:SparkleMagic最新更新时间:2016-11-09 来源: eefocus关键字:C51  汇编  伪指令 手机看文章 扫描二维码
随时随地手机看文章
1、DS ---预留存储区命令

格式: 〔标号:〕 DS   表达式值
其功能是从指定地址开始,定义一个存储区,以备源程序使用。
存储区预留的存储单元数由表达式的值决定。
TMP:   DS   1
从标号TEP地址处开始保留1个存储单元(字节)。
2、BIT---定义位命令
格式:   字符名称   BIT   位地址
其功能用于给字符名称定义位地址。
SPK   BIT   P3.7
经定义后,允许在指令中用SPK代替P3.7。
3、USING指令
USING指令通知汇编器使用8051的哪一个工作寄存器组。
格式: USING 表达式 (值必须为0-3,默认值为0。)
USING 0
使用第0组工作寄存器。
4、SEGMENT指令
SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。
格式: 再定位段名 SEGMENT 段类型〔再定位类型〕
其中,“再定位段名”用于指明所声明的段。
“段类型”用于指定所声明的段将处的存储器地址空间。
可用的段类型有 CODE、XDATA、DATA、IDATA和BIT。
STACK_SEG SEGMENT IDATA
DATA_SEG SEGMENT DATA
5、RSEG---再定位段选择指令
再定位段选择指令为RSEG,用于选择一个已在前面定义过的再定位段作为当前段。
格式: RSEG 段名
段名必须是在前面已经声明过的再定位段。
DATA_SEG SEGMENT DATA   ;声明一个再定位DATA段
RSEG   DATA_SEG   ;选择前面声明的再定位DATA段作为当前段
6、绝对段选择指令
CSEG---绝对代码段
DSEG---内部绝对数据段
XSEG---外部绝对数据段
ISEG---内部间接寻址数据段
BSEG---绝对位寻址数据段
格式:
CSEG [AT 绝对地址表达式]
DSEG [AT 绝对地址表达式]
XSEG [AT 绝对地址表达式]
ISEG [AT 绝对地址表达式]
BSEG [AT 绝对地址表达式]
括号内是可选项,用来指定当前绝对段的基地址。
CSEG AT 0000H
AJMP MAIN
7、ORG指令
ORG指令用来改变汇编器的计数器,从而设定一个新的程序起始地址。
格式: ORG 表达式
表达式必须是绝对或简单再定位表达式。
ORG 0000H
AJMP MAIN
设定 MAIN 程序的起始地址为 0000H。
8、END指令
END指令用来控制汇编结束。在每个汇编程序的最后一行必须有一条END指令,
并且END指令只能出现一次。
9、EQU指令
EQU 指令用于将一个数值或寄存器名赋给一个指定的符号名。
格式: 符号名   EQU   表达式
或     符号名   EQU   寄存器名
表达式必须是一个简单再定位表达式。
用 EQU 指令赋值以后的字符名,可以用作数据地址、代码地址、位地址或者
直接当做一个立即数使用。
LIMIT   EQU   1200
COUNT   EQU   R5
10、DATA 指令
DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。
格式: 符号名   DATA   表达式
数值表达式的值在 0-255 之间,表达式必须是一个简单再定位表达式。
PORT1   DATA   40H
11、DB 指令
DB 指令以表达式的值的字节形式初始化代码空间。
格式: [标号:]   DB   表达式表
表达式中可包含符号、字符串、或表达式等项,各个项之间用逗号隔开,字符串应用引号括起来。
括号内的标号是可选项,如果使用了标号,则标号的值将是表达式表中第一字节的地址。
DB 指令必须位于 CODE 段之内,否则将会发生错误。
TABLE:
DB 0C0H, 0F9H, 0A4H
TABLE1:
DB " 89C51 "
51汇编程序基本框架
向大家介绍一种可以不用 EQU来定义变量的方法。
先说说用 EQU 定义变量的缺点:
1:人为为每一个变量指定地址,还必须注意防止地址冲突,工作量太大。
2:编译器只是把用 EQU 定义的标识符当作常数而已,在很多情况下当用户把该标识符用错时,编译器不会给出警告或报错。
  例如,假设想在 IDATA 区定义一个变量,如果用 EQU 方式作如下定义:
  MYBYTE EQU 87H   ;(其实编译器只是将 MYBYTE 视为一个常量而已)如果想将该变量(位于 IDATA 区)赋值到累加器 A,正确的访问方式应该是
 MOV R0,#MYBYTE
  MOV A,@R0
  如果程序员将上面的语句错写为:
  MOV A,MYBYTE
  (原因可能是粗心,或者忘记了 MYBYTE 是大于 7FH 的)
  编译器不会为此报错,结果执行的操作是将地址为 87H 的特殊功能寄存器的内容赋值到 A,而不是将 IDATA 区的 87H 赋值到 A,与用户的本意大相径庭。
这只是一个例子,实际上还会有其它类似的问题。
如果使用了下面描述的方式,则编译器会帮你指出此类错误。建议 EQU 只用于定义常数,不要做其它用途。
下面是一种比较好的变量定义方法,没有上面所说的缺点。
;定义变量的方法:
;1:定义字节变量用 DS 关键字,语法为:
;   变量名: DS 分配的字节数
;2:定义位变量用 DBIT 关键字,语法为:
;   位变量名:   DBIT 分配的位数
;3:定义特殊功能寄存器(SFR)用 DATA 关键字,语法为:
;   寄存器名: DATA 寄存器地址
;4:定义可位寻址的特殊功能寄存器中的位用 BIT 关键字,语法为:
;   位名: BIT 位地址
;5:常量定义用 EQU 关键字,语法为:
;   常量名: EQU 常数
;具体见如下示例:
;51汇编程序基本框架
$NOMOD51   ;如果不使用默认的 51 特殊功能寄存器定义,可以用本语句取消。
;$INCLUDE   (W79E825.INC)   ;用此语句可以包含头文件
;---------- 特殊功能寄存器定义 (仅作示范,不全)
  P0     DATA   080H
  SP     DATA   081H
  DPL   DATA   082H
  DPH   DATA   083H
 PCON   DATA   087H
  TCON   DATA   088H
  TMOD   DATA   089H
  TL0   DATA   08AH
  TL1   DATA   08BH
  TH0   DATA   08CH
  TH1   DATA   08DH
  P1     DATA   090H
  SCON   DATA   098H
  SBUF   DATA   099H
  P2     DATA   0A0H
  IE     DATA   0A8H
  PSW   DATA   0D0H
;---------- 可位寻址的特殊功能寄存器中的位定义(仅作示范,不全)
  BITIT0     BIT TCON.0 ;外部中断0触发方式
  BITIE0     BIT TCON.1 ;外部中断0标志
  BITIT1     BIT TCON.2 ;外部中断1触发方式
  BITIE1     BIT TCON.3 ;外部中断1标志
  BITTR0     BIT TCON.4 ;定时器0启动控制
  BITTF0     BIT TCON.5 ;定时器0溢出标志
  BITTR1     BIT TCON.6 ;定时器1启动控制
  BITTF1     BIT TCON.7 ;定时器1溢出标志
  BITRI     BIT SCON.0 ;接收中断标志
  BITTI     BIT SCON.1 ;发送中断标志
  BITRB8     BIT SCON.2
  BITTB8     BIT SCON.3
  BITREN     BIT SCON.4 ;接收使能
  BITSM2     BIT SCON.5 ;多机通信控制
  BITSM1     BIT SCON.6 ;串口模式位1
  BITSM0_FE   BIT SCON.7 ;串口模式位0或FE
;---------- 常量定义
NSTACKSIZE     EQU 36   ;指定堆栈大小
;---------- 以下为变量定义
;如果MCU没有某些数据段,就删除或注释掉相应的段。
;变量定义有不可重定位和可重定位之分,这二种方式可混合使用。
;需要注意的是,某些编译器对可重定位方式支持的不是很好,
;而且可重定位方式对汇编不是很有用,所以建议不用可重定位方式。
;---- 下面为不可重定位的变量分配方式
; BSEG 关键词指定 BIT 区
; DSEG 关键词指定 DATA 区
; ISEG 关键词指定 IDATA 区
; XSEG 关键词指定 XDATA 区
; CSEG 关键词指定 CDATA 区
;注意:BIT 区的位地址 20H~2FH 范围与 DATA 区的00H~7FH范围是同一存储空间,
; 所以在分配 DATA 区字节变量和 BIT 区位变量时要注意不要重叠。
  BSEG   AT 00H ;从 BIT 区的位地址 00H 开始分配位变量
BEXAMPLE:     DBIT 1 ;在 BIT 区定义一个位变量,位地址为 00H(即DATA区20H字节的第0位)
BTESTA:       DBIT 1 ;在 BIT 区定义一个位变量,位地址为 01H(即DATA区20H字节的第1位)
BTESTB:       DBIT 1 ;在 BIT 区定义一个位变量,位地址为 02H(即DATA区20H字节的第2位)
;在 DATA 区定义变量时要注意不要与 R0~R7 寄存器重叠。
  DSEG   AT 08H ;从 DATA 区的 08H 地址(为了避开 R0~R7)开始分配变量
DEXAMPLE:     DS   2 ;在 DATA 区定义一个 2 字节的变量,地址为 08H
DTEST:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 0AH
DLCDBUFFER:   DS   21 ;注意不要与 BIT 区重叠,建议在地址 1FH 结束分配。
DSEG   AT   2EH ;在 DATA 区的可位寻址区域定义可位寻址的字节变量
              ;注意不要与前面在 BIT 区分配的 BIT 位重叠
DBYTEA:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 2EH(此变量可位寻址)
DBYTEB:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 2FH(此变量可位寻址)
DSEG   AT 30H ;从 DATA 区的 30H 地址(已避开 BIT 区)开始分配变量
DBYTEC:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 30H
DBYTED:       DS   3 ;在 DATA 区定义一个 3 字节的变量,地址为 31H
DBYTEE:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 34H
ISEG   AT 80H ;从 IDATA 区的 80H 地址(为了避开 DATA 区)开始分配变量
IEXAMPLEA:     DS   1 ;在 IDATA 区定义一个 1 字节的变量,地址为 80H
IEXAMPLEB:     DS   4 ;在 IDATA 区定义一个 4 字节的变量,地址为 81H
ISEG   AT 255-NSTACKSIZE   ;将堆栈放在 IDATA 区的末尾,首地址为 255-NSTACKSIZE
ISTACK:       DS   NSTACKSIZE ;定义多字节变量,作为堆栈用(大小为 NSTACKSIZE),
                    ; 见后面代码中的 “MOV   SP,#ISTACK”语句。
XSEG   AT 00H   ;从 XDATA 区的 00H 地址开始分配变量
XEXAMPLE0:     DS   1 ;在 XDATA 区定义一个 1 字节的变量,地址为 00H
XEXAMPLE1:     DS   1 ;在 XDATA 区定义一个 1 字节的变量,地址为 01H
;==============================================================================;
;CODE 段
  CSEG   AT 0   //程序起始地址
A_START:
  MOV   IE,#00H ;关闭中断
  SJMP   A_MAIN
  CSEG   AT 0023H   //串口中断地址,其它中断地址的指定类似此方法。
  LJMP   A_UARTINT   //跳转到中断处理子函数
;==============================================================================;
A_MAIN:
  MOV   SP,#ISTACK ;设置堆栈指针,
              ;只能在调用任何函
              ; 数之前设定SP。
  MOV   PSW,#0 ;将RS0,RS1及其它标志位清0。
;注意:内存清零不要放在子函数中,
;     因为内存清零也会清零堆栈,
;     从而导致 RET 返回地址不正确!!!
  MOV   R0,#0FFH   ;内存00H~0FFH的内容清零。
  CLR     A
A_MAIN01:
  MOV   @R0,A
  DJNZ   R0,A_MAIN01
;用户初始化代码
...
A_LOOP: ;主循环
;用户代码
  LCALL _TEST
  SJMP   A_LOOP
;用户代码(子程序)
_TEST:
  NOP
  NOP
  RET
A_UARTINT: //串口中断处理子函数
  NOP
  NOP
  RETI
 END

------------------------------------------------------------------------------------

A51

汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码.


一:A51的符号:

在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性.


符号的段属性:

指出符号所位于的地址空间.段类型有:


NUMBER       

无类型符号


DATA          DATA

段符号(可直接寻址的内部RAM空间)


IDATA         IDATA

段符号(可间接寻址的内部RAM空间)


XDATA         XDATA

段符号(外部数据存储空间)


BIT           BIT

段符号(内部RAM低地址区的可位寻址的空间)


CODE          CODE

段符号(程序存储器空间)


REGISTER     

寄存器符号


作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN

关键字说明)


二:标号:定义标号时,标号名后必须接冒号”:

”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义.


三:特殊的汇编符号:A51

宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组.


四:运算符:

有三种1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序.2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或).3):关系运算符:>=,<=,<>,=,<,>.


所有运算符的优先级顺序:()àNOT,HIGH,LOWà+,-(正负号)à*,/,MODà+,-(加减)àSHR,SHLàAND,OR,XORà

>=,<=,<>,>,<,=.


数值表达式:

数值表达式由运算符和操作数组成,一个操作数又可以是表达式,与符号具有段属性一样,表达式也具有段类型属性,表达式的类型依赖于操作数的类型.表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包含有段类型的操作数或者是子表达式时,运算结果的段类型遵循下面的原则:


对于单目运算符:(+/-/HIGH/LOW/NOT)表达式的结果与操作数具有相同的类型

.

对于所有的双目运算符(除+/-),表达式的结果均为无类型的结果

.

对加减运算,只有当其中的一个操作数具有段类型的时候,运算结果才具有相同的段类型,如果两个操作数具有段类型,即使他们的段类型一样,结果也是无类型的

(NUMBER).

总结:只有当操作数加上或者是减去一个无类型时,才可能产生一类型,其他所有的组合均产生无类型的表达式

.


A51提供了伪指令,

可以利用这些伪指令在汇编程序中定义符号,保留和初始化存储空间,定位目标代码等功能,伪指令中除DB,DW外均不产生目标代码,但可以改变汇编器的状态,并将有关信息(如段定义)加到目标文件中.


伪指令分四类

:

1):定义符号:SEGMENT,EQU,SET,DATA,IDATA,XDATA,BIT,CODE

2):

保留和初始化存储空间:DS,DB,DW,DBIT


3):程序链接:

PUBLIC,EXTRN,NAME


4):

汇编状态控制和段选择


:ORG,

END,RSEG,CSEG,DSEG,XSEG,ISEG,BSEG,USING


一 :定义符号的伪指令

1

)SEGMENT


   

格式:  段名符号  SEGMENT   段类型  [再定位类型]


SEGMENT

指令可声明一个可再定位(区别于CSEG,DSEG,XSEG,BSEG,ISEG等 定义的在相对应的空间固定地址定义的绝对段—在连接的过程中不允许重新定位)的段符号和一个可选的再定位类型,段符号可以用来定义段,L51连接器可将多个模块内的具有相同段名和再定位类型的几个段合成为一个段.段类型说明了段所处的地址空间.


如果是编写的汇编程序要与C源程序接口,即被C源程序调用,则全部的汇编子程序所命名的定义的代码段的段名必须是可用SEGMENT来定义的,而且名字的命名的方法也应该参照C51编译器产生的局部段的段名的转换规则.段名的作用主要是在汇编的时候用RSEG来激活的,在连接定位的时候用到的.与段名相应的是用于存储和传递参数的别名,可以在汇编源程序中直接应用局部段的别名,这个别名主要是在传递函数参数的时候用的.在汇编程序中要用PUBLIC 声明被其他模块引用的全局符号.

DATA           (

可直接寻址的内部RAM空间)


IDATA          (

可间接寻址的内部RAM空间)


XDATA         (

外部数据存储空间)


BIT            (

内部RAM低地址区的可位寻址的空间)


CODE          (

程序存储器空间)


可选的再定位类型定义了L51连接时的定位方式,再定位类型

:

UNIT:

定义一个可开始于任一单元的段对于BIT型的段,一个单元是一个位,


其它所有的段一个单元是一个字节

.

PAGE:

定义一个起始地址必须是256的整数倍的段,段的绝对地址由L51自己计算,该类型只允许用于XDATA和CODE类型段.


INPAGE:

定义一个由L51连接后必须包含在256B的块中,只适用于XDATA和CODE段.


INBLOCK:

定义一个L51连接后必须包含在2KB中的段,只适用于CODE段.


OVERLAYABLE:定义一个可与其他段交叠的覆盖段,其段名符号必须按C51或者PL/M51的规则命名.C51把局部数据段和局部位段定义成?DT?FUNCTIONNAME?MODULENAME和?BI?FUNCTIONNAME?MODULENAME这是在small模式下.其他的模式略有不同。

BITADDRESSABLE:

定义一个L51连接后位于可位寻址的区,段长不能超过16B.


2)       EQU

 

格式:  符号名 EQU 表达式


        符号名 EQU  寄存器名

EQU

伪指令定义一表示数值或寄存器的符号,该符号可用于表达式或助记符指令的操作数,EQU指令定义的符号不能被改变或重新定义,其段类型取决于表达式中的操作数类型类型,无类型的EQU符号可用于任何表达式中.


  

LIMIT  EQU  200


   VALUE  EQU  LIMIT-100+’A’

   COUNTER EQU  R5

3)       SET

 

格式: 符号名 SET 表达式


      

符号名 SET 寄存器名


SET

指令的功能与EQU指令的功能一样,区别是SET指令定义的符号可以再定义和改变.


VALUE    EQU  200

VALUE    SET   VALUE/2

COUNTER  SET  R1

TEMP     SET  COUNTER/2

4)       BIT

  格式:  符号名 BIT 表达式

BIT

指令定义一表示位地址的符号,该符号一经定义便不能重新定义和改变.


DATA_BSEG SEGMENT  BIT

    RSEG  DATA_BSEG

    CTRL  DS  1

    FLAG  BIT  CTRL.1

    FLAG2  BIT  FLAG+1

5)       DATA 

   格式:   符号名 DATA  表达式

    DATA

指令定义一表示MCS-51内部数据存储器字节地址的符号,表达式必须是一个绝对地址值或者是一个简单的再定位表达式(即数值确定的,且其值必须在0—255之间,类型必须是DATA或者是NUMBER类型)


例如在汇编程序中:

  

PORT   DATA  90H


   RESULT_L  DATA  40H

   RESULT_H  DATA  RESULT_L+1

6) XDATA,IDATA,CODE

均是也和DATA一样,都是定义一个代表相应存储空间单元的地址符号,表达式也必须是相对应的类型或者是NUMBER类型。


二 初始化和保留指令

1)

DS


格式:  [标号:] DS 表达式

DS

指令以字节为单位,在内部或者外部地址空间中保留存储空间,表达式中不能包含前向地址参考量,可为除BIT段的任何类型。该伪指令语句使当前地址计数器加上表达式的值,需要注意的是地址计数器加上表达式结果的值不能超出地址空间的范围。(无论是汇编器还是编译器,对每一种不同类型的地址空间(DATA,CODE,PDATA,XDATA,BIT)都产生一个独立的地址计数器,每汇编一条指令,计数器都会自动增加,不过可以用ORG伪指令改变当前段地址计数器,用ORG伪指令表达式的值作为当前段地址计数器的初值,而当前段的改变可以用RSEG伪指令来改变。


RSEG ?DT?FUNCTION?MODULENAE----

声明当前段为局部数据段


?FUNCTION?BYTE:-------------

函数局部段的别名


TIME:  DS  5

2) DBIT

   格式  [标号:]  DBIT 

表达式


以位为单位在可位寻址段内保留存储空间, 表达式中不能包含前向地址参考量或者是再定位的符号和外部符号,该指令使当前地址计数器增加表达式结果值,其增加量以位为单位

.

3) DB DW

   格式:  [标号]:  DB/DW  表达式1[,表达式2,………]

这两个指令的作用相同,均是以字节或者是字初始化程序存储空间,上面是保留存储空间,存储空间可以使RAM和ROM,而这两个指令直接就是初始化程序存储空间

.

Table: DB  “any key to continue!”

Requst: DB  LOW(Table),HIGH(Table)

关键字:C51  汇编  伪指令 引用地址:C51汇编伪指令

上一篇:C51串口通信(中断模式)T2产生波特率
下一篇:C51成功读写AT24C32(EEPROM)

推荐阅读最新更新时间:2024-03-16 15:20

[C51代码]串口通信
/********************************************** * File: Serial_Comm_1.C * Description: Serial Communication Example 1 * Created Date: 2007-10-01 * Last Modified: 2007-10-01 * Author: Jeffrey - Schicksal@126.com * Notes: None **********************************************/ #include Atmel/AT89X51.h unsigned c
[单片机]
单片机c语言教程第十三章--C51循环语句
循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作。如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序 结构清晰明了,而且使其编译的效率大大的提高。在 C 语言中构成循环控制的语句有 while,do-while,for 和 goto 语句。同样都是起到循环作用,但具体的作用和使用方法又大不一 样
[单片机]
ARM汇编语言 - 简介 [一]
说明:本系列文章将主要以ARMv7和ARMv8架构为例,介绍ARM汇编语言的一些基础知识。关于ARM汇编语言的学习,这里我要推荐一本书和一个网站,其中书是由宋岩翻译的《Cortex-M3权威指南》,其文笔风趣幽默,引人入胜,网站则是azeria-labs。当然,ARM官方的Architecture Reference Manual更是重要的参考。 说起与系统结构相关的汇编语言,自然要先介绍该体系结构的寄存器组成。ARMv7相较于同为32位的x86,寄存器的数量要多一些,名称和配置也不尽相同,但两者还是有一个基本的对照关系: ARMv7-A在设计之初,就有和之前系列的处理器(比如以ARM9系列为代表的ARMv5)兼容的七种处
[单片机]
ARM<font color='red'>汇编</font>语言 - 简介 [一]
C51#学习笔记01#| Keil软件的使用入门教程
Keil软件的使用具体教程: 1、新建项目【project】-【New】-【uvision project】选择保存文件目录后,在弹出来的菜单栏中选择芯片型号【Atmel】-【STC89C51/STC89C52】,注意这里还会弹出来一个方框选择【否】。注意:新建项目有的Keil版本是在【File】-【New】-【New Project】 2、新建.C文件【File】- 【New】,此时会新建一个文本文件【Text】; 接着将文本文件保存在项目文件中,并更改它的后缀名为【main.c 】,最后在项目中导入main.c文件: 选择工作台左边的项目【Target】- 鼠标右键【Source Group1】 - 【Add File
[单片机]
C51#学习笔记01#| Keil软件的使用入门教程
怎么样在c程序中使用汇编编程
标签(TAG): 方法一:在每个汇编语句前加asm即可。如 void reset_data(void) { asm mov r0,#0dfh asm do_resetdata: asm mov @r0,#00h asm djnz r0,do_resetdata return ; } 方法二:把asm作为关键字后续汇编用大括号括起来即可。如下: void reset_data(void) { asm { mov r0,#0dfh do_resetdata: mov @r0,#00h djnz r0,do_resetdata } return ; }
[单片机]
基于C51中断过程及interrupt和using的使用
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务。 处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下: 中断源 中断向量 --------------------------- 上电复位 0000H 外部中断0
[单片机]
GNU ARM汇编(四)中断汇编之非嵌套中断处理
在写这篇blog之前,不得不感慨一句:纸上得来终觉浅,绝知此事要躬行.作为EE出身的,虽然好久好久没用汇编写单片机的中断了,但自我感觉对中断的理解还是比较深入的,本以为在GNU ARM汇编下搞个中断会很容易,谁知道断断续续花了我几周.完全用汇编写中断和用c中的_irq写中断还是有区别的,谁用谁知道.还是那句话:深入细节是必须的,也是值得的.         这一篇blog的理论知识主要来源于:《ARM System Developer's Guide》.         ARM的异常和相应的模式之间的对应关系见下表:   当一个异常导致模式的改变时,内核自动地: 1、把cpsr保存到相应模式下的spsr 2、
[单片机]
S3C4480在高精度直流开关电源设计中的应用
引言 近年来,嵌入式技术发展极为迅速,出现了以单片机、专用嵌入式ARM为核心的高集成度处理器,并在通信、自动化、电力电子等领域得到了广泛应用。电源行业也开始采用内部集成资源丰富的嵌入式控制器来构成大型开关电源的控制系统。开关电源是效率较高的一种电源,是由占空比可凋的脉宽调制波(PWM)来控制M0S管、IGBT等开关器件的开通与关闭,从而实现电压电流稳定输出,其性能的优劣直接关系到整个电子系统的工作性能指标。将SAMSUNC公司的嵌入式ARM处理器S3C44BOX芯片,应用到开关电源的控制系统的设计中,采用C语言和少量汇编语言,就可以实现一种以嵌入式ARM处理器为核心、具有智能PID控制器以及触摸屏、液晶显示器等功能的开关电源控
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved