汇编语言 C51 P0口

汇编语言 C51 P0口,第1张

是不是你的硬件连接有问题,从你发的仿真窗口上看,应该是没有问题的。建议你先将程序的最后一名:END 去掉试试,如果不行的话就再仔细检查一下你的硬件是否有连接不良或开路等不符合你设计意图的地方试试。

T0MS EQU NOT 25000 ; 定义 50 mS 12M晶振
ORG 0000H
JMP MAIN
ORG 0003H
JMP INT00
ORG 000BH
MOV TL0, #LOW T0MS ; TO 50MS 中断 计时 0
MOV TH0, #HIGH T0MS
CPL P10 ; P10接P32
RETI
INT00: DJNZ R1, INT02 ; INT0 中断 计数
MOV R1, #10
CPL P11
INT02 : RETI
MAIN: MOV TMOD, #01H ; T0 方式1
MOV SP, #3FH ; 初始化设置
MOV TL0, #LOW T0MS ; TO 50MS 中断 计时 0
MOV TH0, #HIGH T0MS
SETB TR0
SETB IT0 ; 开中断
SETB EX0
SETB ET0
SETB EA
MOV R1, #10
SJMP $
END

ret用栈的数据修改IP的内容,实现近转移。

ret执行步骤:

(1):(IP)=((SS)16+SP)

(2):(SP)=(SP)+2

执行过程

ret指令用栈中的数据,修改IP的值,从而实现近转移。

CPU执行ret指令时,进行下面两步 *** 作:

(IP)=((SS)16+(SP))

(SP)=(SP)+2;

另一种用法ret n(n为整数)

等效于

(IP)=((SS)16+(SP))

(SP)=(SP)+2;

(SP)=(SP)+n;

例如ret 4

pop ip

add sp,4

返回调用处

例:

push eax

call msg;call标号是把eip压入堆栈,然后再跳到标号msg处;[标记1]

;继续代码

msg:

push 0

push 0

push eax

push 0

call dword ptr[MessageBoxA]

ret;这是取出EIP,返回到调用处,继续执行[标记1]

扩展资料:

功能:

从堆栈中退出pc的高8位和低8位字节,把堆栈指针减2,从pc值处开始继续执行程序。不影响任何标志。

例子

;主程序

MAIN:SETB P10;(1)开始主程序,P10口置1(P10口输出为高,可以控制LED点亮)

LCALL DELAY;(2)此时当前堆栈指针加2,调用(6)DELAY延时子程序

CLR P10;(3)P10口清零(P10口输出为低,可以控制LED熄灭)

LCALL DELAY;(4)此时当前堆栈指针加2,调用(6)DELAY延时子程序

LJMP MAIN;(5)跳转到主程序,这样LED实现循环点亮

;子程序

DELAY:MOV R7,#250;(6)250-->R7

D1:MOV R6,#250;(7)250--->R6

D2:DJNZ R6,D2;(8)(R6-1),等于零执行下一条,不等于零,则跳转到D2

DJNZ R7,D1;(9)(R7-1),等于零执行下一条,不等于零,则跳转到D1

RET;(10)当前堆栈指针减2,返回到(3)CLR P10继续执行MAIN主程序。

END(11)程序结束(伪指令)

参考资料:

百度百科——RET指令

百度百科——ret

怎么都是输出?

没有输入作依据,根据什么输出不同的值?

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

把题目改为:

p10口输入为1,则P13口输出为1,

p10口输入为0,则P13口输出为0,

P11口输入为1,则P14口输出为1,

P11口输入为0,则P14口输出为0

程序:

    ORG   0000H
    MOV   C, P10
    MOV   P13, C
    MOV   C, P11
    MOV   P14, C
    SJMP  0000H
END

51单片机汇编啊,比较麻烦,而且有的问题条件不明确。
随便一说吧,
1这个就是啰嗦点没有难点吧,就是用mov和add吗
2定时器计数很简单,可是要定时1秒需要知道单片机的主频啊6MHZ还是12MHZ,这关系到计数1次是多少时间问题,显示器显示更不知到要怎么显示了。
3这主要是要用到对外部RAM的 *** 作,用movx,把地址存入DPTR中,也可以将高8位地址存入DPH中,低八位存入DPL中即可,然后将要向外部RAM写的数存入寄存器A中调用movx @DPTR,A即可(汇编不分大小写),读数据用movx a,@dptr即可,冒泡法很多书上有介绍啊
4这个就是调用mov和movx的事情
5应该是用P口控制led灯,没有说明用哪个p口的位控制,这个直接对p口的位 *** 作即可,如clr p10是置p1口0位为0,setb p10是置p1口0位为1

KEYL EQU P10
KEYR EQU P11
DAT EQU P0
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
LOOP:
JB KEYL,LOOP1
MOV DAT,A
LCALL DELAY
RL A
SJMP LOOP
LOOP1:
JB KEYR,LOOP
MOV DAT,A
LCALL DELAY
RR A
SJMP LOOP
DELAY:
MOV R2,#100
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13030508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存