ORG 0000H
LJMP STA
ORG 0050H
STA:
MOV R0,#30H
MOV R1,#50H
MOV R2,#10H
MOV R3,#16
MOV DPTR,#2000H
LOOP1:
MOV A,R2
MOV @R0,A ;10H~1FH分别赋值给30H~3FH
MOV A,@R0 ;
MOVX @DPTR,A ;30H~3FH分别传送到2000H~200FH
MOVX A,@DPTR ;
MOV @R1,A ;2000H~200FH分别传给50H~5FH
INC R0
INC R1
INC R2
INC DPTR
DJNZ R3,LOOP1
SJMP $
END
冒泡排序程序如下:
ORG 0000H
LCALL SORT ; 跳转到排序程序
SJMP $ ; 。
SORT: ; 数据冒泡排序程序
MOV R6, #16 ;参加排序数据的总个数
DEC R6 ; 比较次数 比 数据总数 少 1
L1:
MOV R0, #40H ; 把数据的起始地址40h付给R0
MOV A, R6 ;调整比较次数
MOV R7, A
CLR F0 ; 清交换标志
L2: ;比较
MOV A, @R0 ; 取前一个数
INC R0
MOV B, @R0 ; 取后一个数
CJNE A, B, L3 ; 前面的数 与 后面的数 比较, 前-后
L3: ;判断、处理
JC N_JH ; 后面的数 大于 前面的数,不交换
XCH A,B ; 否则前后两数交换存放
MOV @R0,A
DEC R0
MOV @R0,B
INC R0
SETB F0 ; 设交换标志
N_JH:
DJNZ R7, L2 ; 没有比较完,就继续
JNB F0, L_END ; 没有交换过,就结束
DJNZ R6, L1
L_END:
RET ; 排序完成。
;结果是:
;40H中存放着最小的数;
;4FH中存放着最大的数。
RAMDAT:
MOV DPTR,#0000H
MOV A,#5
MOV R2,#20H
LOOP:
MOVX @DPTR,A
INC DPTR
INC A
DJNZ R2,LOOP
RET
单片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~10万的都有,但存储时间可以保证40年,在选用时要注意还有一些廉价的单片机为了集成可掉电的数据存储器,没有选用价格昂贵的EEPROM,而用FALSH来做的,但要注意其寿命最多就10万次,而且擦写不能字节擦写,这要注意使用的场合其寿命是否满足要求
RAM是数据存储器,跟计算机里面的内存差不多,主要是用来存放程序运行中的过程数据,掉电后就会丢失之前的数据,所以程序在上电时需要进行初始化,否则上电后的数据是一个随机数,可能导致程序奔溃
ROM就是程序存储器,掉电后数据不会丢失,但在程序运行过程中其数据不会改变早期的单片机的ROM因为擦写修改麻烦,价格昂贵或者价格低廉的OTP型无法修改数据等原因已经被现在的FLASH存储器替代了因为FLASH的擦写很容易,现在的部分单片机支持在线内部编程,通过特定的程序执行方式可以修改FALSH的内容,而实现在线修改程序存储器这与上面说的程序存储器的内容在运行的时候不可被改变是不冲突的,因为在程序正常运行时,其内容不会改变,只工作在只读状态下的
常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。
罗素了这么多,不知道楼主看明白了没有。
1肯定的,嵌套越多,要压栈保存的信息就越多,占用的RAM就越多了,对51来说,最多就是CPU内256字节的RAM。
2是的。
3没用过这芯片……我用的最多的是AVR
4因为你定义了一个pagebuf[512],512字节啊!51单片机的data撑死才256字节(还没算压栈保存数据需要的RAM),所以编译器自动将这个数组放在了XDATA中。
用C还是汇编写啊。
不同语言有不同写法,
C的话,先定义个指针变量p,并初始化指向50H地址,然后p=0x01;
然后p++,重复过程用循环来实现
如果用汇编,当然是用间接寻址方法方便了,先给寄存器R0赋上初始地址50H
再MOV [R0],0x01 然后再地址递增,接着传送
MOV DPTR,#3000H ;目标地址
PUSH DPL ;进栈的是目标地址
PUSH DPH
MOV DPTR,#2000H ;源地址
MOV R2,#01H ;计数器低8位
MOV R3,#01H ;数据块长度101H
LOOP: MOVX A,@DPTR
INC DPTR ;取完数源地址就+1
MOV R5,DPH ;进入R4,R5的是源地址
MOV R4,DPL
POP DPH ;进栈的是目标地址
POP DPL
MOVX @DPTR,A
INC DPTR ;送完数目标地址就+1
PUSH DPL;进栈的是目标地址
PUSH DPH
MOV DPH,R5 ;进入R4,R5的是源地址
MOV DPL,R4
CLR C
MOV A,R2
SUBB A,#01H
MOV R2,A
MOV A,R3
SUBB A,#00H
MOV R3,A
ORL A,R2
JNZ LOOP
SJMP $
以上就是关于(单片机程序编写)试编写程序,找出外部ram2000H~200FH数据区中的最小值,并放入R2中。全部的内容,包括:(单片机程序编写)试编写程序,找出外部ram2000H~200FH数据区中的最小值,并放入R2中。、51单片机汇编语言-请编写程序将内部RAM 40H到4FH 中的16个数据按从小到大顺序重新排列。 尽量简单一点的、单片机,用汇编语言编写将片外RAM中0000H-001FH单元依次赋值为从5开始的自然数的程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)