❶ 怎么实现51单片机片外RAM 00EH和片外RAM 00FH内容的互换用C51、汇编语言分别实现
片外RAM 00EH和
片外RAM 00FH
内容的互换
汇编:
MOVDPTR,#000EH
MOVXA,@DPTR
MOVB,A
MOVDPTR,#000FH
MOVXA,@DPTR
XCHA,B
MOVX@DPTR,A
MOVDPTR,#000EH
XCHA,B
MOVX@DPTR,A
END
❷ 关于STC单片机定时器问题
--代码有误,没计算精确,如果精确计算的话,在短时间内是感觉不出来误差的.下面代码供参考..
----
;========================================================start
; MOV 8EH,#0C0H ;T0,T1=12倍速C51(STC2501)
CHA DATA 10H
CHS DATA 11H ;秒单元
CHM DATA 12H ;分单元
CHH DATA 13H ;时单元
NG DATA 14H
NS DATA 15H
;----------------BEGIN
ORG 0000H
LJMP main
ORG 000BH
LJMP CLOCK
ORG 030H
main: MOV P1,#0FFH
MOV P3,#0FFH
MOV CHA,#00H
MOV CHS,#00H
MOV CHM,#00H
MOV CHH,#00H
MOV NG,#00H
MOV NS,#00H
;===========
MOV TMOD,#01H ;定时器0控制字
MOV TL0,#0B0H ;{TL0=B0H,TH=3C}=1S
MOV TH0,#3CH
SETB ET0
SETB TR0
SETB EA
MOV DPTR,#LED
;-------DisplayProgram
;-------第一、二位
F1: MOV A,CHS ;将H中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
MOV P3,#11111110B
CALL DEL1MS ;显示1ms
MOV A,NS ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
MOV P3,#11111101B
CALL DEL1MS ;显示1ms
;-------第三、四位
MOV A,CHM ;将H中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
MOV P3,#11111011B
CALL DEL1MS ;显示1ms
MOV A,NS ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
MOV P3,#11110111B
CALL DEL1MS ;显示1ms
;-------第五、六位
MOV A,CHH ;将H中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
MOV P3,#11101111B
CALL DEL1MS ;显示1ms
MOV A,NS ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
MOV P3,#11011111B
CALL DEL1MS ;显示1ms
JMP F1
;----------------------interrupt
CLOCK: MOV P1,#0FFH
MOV TL0,#0B0H ;0B0H
MOV TH0,#3CH ;3CH
PUSH ACC
PUSH PSW
;-------
INC CHA
MOV A,CHA
CJNE A,#1,EXT ;C51=20,STC=240//8EH.2=1
MOV CHA,#00H
INC CHS
MOV A,CHS
CJNE A,#60,EXT
MOV CHS,#00H
INC CHM
MOV A,CHM
CJNE A,#60,EXT
MOV CHM,#00H
INC CHH
MOV A,CHH
CJNE A,#24,EXT
MOV CHH,#00H
;-----------
EXT: POP PSW
POP ACC
RETI
;------------------------------------------------------
LED: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
;---------------------------------------delay_program
DEL1MS: MOV R4,#2 ;延时程序3,精确延时1000微秒
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
END
C例子:
//------------------初始化函数
int_ini()
{
TH0=0X3C;TL0=0XB0;
TMOD=0X01;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
}
//----------------中断处理函数
void time_intt0(void) interrupt 1
{
ET0=0;TR0=0;TH0=0X3C;TL0=0XB0;TR0=1;
con1s++;
if(con1s==20)
{
con1s=0x00;
timedata[0]++;
if(timedata[0]>=10)
{timedata[0]=0;timedata[1]++;}
if(timedata[1]>=6)
{timedata[1]=0;timedata[2]++;}
if(timedata[2]>=10)
{timedata[2]=0;timedata[3]++;}
if(timedata[3]>=6)
{timedata[3]=0;timedata[4]++;}
if(timedata[4]>=10)
{timedata[4]=0;timedata[5]++;}
if(timedata[5]==2&&timedata[4]==4)
{timedata[4]=0;timedata[5]=0;}
}
dis[0]=timedata[0]; //相当于汇编 MOV DIS0,TDATA0]]DIS0为显示扫描时的数值[秒位]~~~~~~
dis[1]=timedata[1];
dis[2]=timedata[2];
dis[3]=timedata[3];
dis[4]=timedata[4];
dis[5]=timedata[5];
ET0=1;
}
❸ 51单片机,片内数据空间30H-3FH的数据逆序(20H → 100FH, 21H → 100EH,…)
;启动入口========================
ORG 0000H ;复位启动
AJMP START ;
;主程序==========================
START: MOV R0,#30H ;源数据开始地址
MOV DPTR,#100FH ;目标数据地址
MOV R3,#0
MOV R4,#0
MOV B,#16 ;数据个数
;
LOOP: MOV A,@R0 ;取得一个数据
MOVX @DPTR,A ;存入指定地址
;
JNB ACC.0,P100
INC R3
;
P100: CLR C ;准备比较
SUBB A,#101 ;比较
JC NOS ;不大于100
INC R4
;
NOS: INC R0 ;指向下一个数据
DEC DPTR ;调整目标地址
DJNZ B,LOOP ;搜索完所有数据
END ;结束
❹ 位地址3EH和字节地址3EH有什么区别
位地址是以1为单位递增,字节地址以8为单位。字节地址由八个位地址组, 位地址是字节地址中的某一位,在RAM 中,位地址20H是字节地址24H的最低位,字节地址20H有8个位地址:从00H---07H,所以在用汇编去编程的时候,需要注意操作的地址是位地址还是字节地址,把数据存放在含有位地址的字节地址中时,可以在程序中去改变这个数据的某一位,所以字节地址中可以存放8个位变量
采纳哦
❺ 单片机乘法指令计算步骤求解
……4Eh×5Dh = 1C56h 啊,你在草稿纸手算一下,或者直接计算器按就行。
十六进制乘法你不熟的话,可以先都转成十进制,用十进制乘法得出乘积,再转成十六进制。
4Eh = 78d,5Dh = 93d
78×93 = 7254d
7254d = 1C56h
好好学习天天向上
❻ 关于C51单片机单片机的几个问题
1、徐汉斌版单片机微型计算机原理教材P144上说“中断服务程序最后一条指令必须是中断返回指令RETI”,
这句话是不是错了?
如果最后一句话是跳转指令不是也可以么,只不过程序不会回到断点处罢了,PC也会填充跳转处PC地址
--写跳转指令、或者写其它什么指令,都行,随你便。单片机都会执行。
--只是,单片机没有执行 RETI 指令,中断程序就没有结束。
--如果,你不写 RETI,中断后,单片机就永远处于中断程序之内。
2、在方式0定时器T0的初值为1E0CH,则TH0,TL0的初值分别为()
这题答案给的居然是F0H、0CH,我觉得分明是1EH、0CH啊,是不是答案错了
--写成二进制:1E0CH = 0001 1110 0000 1100B
--取其低 13 位,写成高八位、低五位:11110000、01100
--方式0的初值,就应该是:F0、0C。
3、”MCS 51的程序计数器PC不能被用户使用,因为他没有地址“,
首先,不能被用户使用指的收拾什么?其次,它没有地址那他到底在哪?
--PC 的数值,时时刻刻,在自动加一,这个特点,用户对其,不可控制。
--但是,用户,可以用 JMP 指令,改变 PC 的数值。
--说 PC 不能被用户使用,实际上是他不会用。
--51 单片机里面,确实没有 PC 的地址,因为,谁都不需要这个地址。
4、MOV 20H,@DPTR 这个语句错了是因为DPTR只能用于片外寻址么
--这个指令,并不存在。
DPTR只能用于片外寻址么
--查一下指令表,就知道了。
5、”80C51单片机子程序调用时能自动保护断点和现场“,
这句话错了是不是因为只能自动保护断点不能自动保护现场?
--中断时,51 单片机,采用压栈的方法,自动的保护断点地址。
--保护现场 ?
--单片机,不知道你的现场是什么。
--把单片机和保护现场联系在一起,就是狗戴嚼子,胡勒!
6、MOV A,#33H 是把33H当成无符号数吧?那么如果我想移入一个带符号数呢
就写上负号即可。
MOV A, #-33H
这就行了。
7、向前转移的偏移量为什么等于(目的地址+0100H)-(原地址+3),0100H是什么?
--编写程序,现在都用编译软件来进行编译。
--编译软件,会自动计算程序中的偏移量。
--编程人,根本不用讨论偏移量的计算,以及推导公式。
--有些教材,作者的思维,还停留在人工编译的阶段,抱残守缺,不用理他。
--0100H,是256。
❼ 单片机XCHD指令是怎么进行交换的
单片机xchd
a,@r0
是半字节交换指令,累加器a的低4
位和内存的低4
位交换.
是汇编指令,类似于swap,不过有两个操作数,xchd
rd,
rn
,功能为半字节交换。
比如:
r1
=
23h,r2
=
45h,那么
xchd
r1,
r2后,
r1
=
25h,
r2
=
43h,明白了吗
❽ 0eh 0dh 什么意思 单片机
0eh 0dh在单片机中就表示两个十六进制数0EH和0DH,也即是十进制数14和13.
❾ 51单片机中位地址4EH具体在内存中什么位置
51单片机中没有4EH这个位地址,一般地,能被8整除的字节地址可位寻址,如90H,那么91H的位地址则表示90H字节地址的第一位。
❿ 单片机中 A=4EH,B=5DH,MUL AB 怎么计算的结果是AB=1C56H怎么来的
列算式就可以知道怎么得到的了:
01001110 ;A=4EH,
01011101 ;B=5DH,
------------------------;x;MUL AB
01001110
00000000
01001110
01001110
01001110
00000000
01001110
00000000
---------------------------------------------
0001110001010110
四位一组 0001 1100 0101 0110B,即1C56H。
其实乘法就是移位再累加。