c语言51单片机rrc,89c51指令 MOV A,@R0 和MOV R0,20H. RRC A 的作用解答,该怎么处理

本文详细解答了89C51单片机中关于MOV A,@R0, MOV R0,20H和RRC A指令的作用。问题涉及指令执行后A和R0的值变化,以及RRC A如何将C中的值移到A的最低位。通过示例程序解释了这些指令在实际应用中的操作。" 54022193,5710930,电力行业网络管理:智和网管平台SugarNMS解决方案,"['电力', '网管软件', '网管平台', '国产化', '自动化运维']
部署运行你感兴趣的模型镜像

当前位置:我的异常网» 单片机 » 89c51指令 MOV A,@R0 和MOV R0,20H. RRC A 的作用解

89c51指令 MOV A,@R0 和MOV R0,20H. RRC A 的作用解答,该怎么处理

www.myexceptions.net  网友分享于:2013-02-04  浏览:316次

89c51指令 MOV A,@R0 和MOV R0,#20H. RRC A 的作用解答

问题1.       MOV   A,@R0   根据89C51的指令集意思是:   若A=08H   R0地址的内容为20H,则执行MOV   A,@R0后   A=20H   A的地址为20H吗??那么A中的内容为0了吗?

问题2.       按以下程序   RRC   A   ;

C为PSW程序状态字的一位进位标志,又称为布尔处理器的一位累加器   用了这条指令可以将C中的值0或1移入A中的最低位,

但在89C51R指令集只是这样注明:累加器含进位右循环一位,若C=0,且A=20H(00100000),则执行RRC   A   后,A=10H   (00010000),C=1

请大家解答执行这条RRC   A指令后点解可以将C中的值0或1移入A中的最低位,C和A累加器到底有什么关系??

问题3.     MOV       R0,#20H     根据89C51的指令集意思是:R0=20H,到底是地址等于20H还是内容等于20H????

IRIN     EQU     P3.2         ;红外接收信号

IRCOM       EQU       20H

MAIN:

MOV       SP,#60H           ;设置堆栈指针为60H   P165

MOV       A,#00H

MOV       R0,#20H

LOOP0:         MOV       @R0,A                     ;20H-27H清零   地址20H的内容00H,R0和A的内容都不变   P116

INC       R0                           ;R0的内容加1,21H

MOV     R0,#IRCOM

MOV     C   IRIN                 ;*****

I5:             MOV     R2,#0                   ;0.14ms   计数

L1:             CALL     DEL

JB     IRIN,   N1               ;*******等   IR   变为高电平   IRIN等于1跳转

;IR=0,检查R2中的计数值

CALL   DEL                       ;10us

MOV     A,#8

;CLR     C

SUBB     A,R2                   ;判断高低位   8-0-0=8=A   P126

;IF   C=0     BIT=0

MOV     A,@R0                   ;A=20H,R0的内容不变

文章评论

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

$NOMOD51 $INCLUDE (8051.MCU) ; 硬件定义 DAT BIT P2.0 ; DS18B20数据通信口 BUZZER BIT P3.2 ; 蜂鸣器控制引脚 DIG1 BIT P1.0 ; 数码管1位选 DIG2 BIT P1.1 ; 数码管2位选 ; 定时器常量 swpH EQU 0d2H ; 定时器高位初值 swpL EQU 0ffH ; 定时器低位初值 ; 变量定义 WDLSB DATA 30H ; 读出的温度低字节 WDMSB DATA 31H ; 读出的温度高字节 TEMP DATA 40H ; 温度整数值存储 ALARM_FLAG BIT 20H.0 ; 报警标志位 ALARM_COUNT_L DATA 50H ; 报警计时计数器低字节 ALARM_COUNT_H DATA 51H ; 报警计时计数器高字节 ; 常量定义 ALARM_DUR_L EQU 0B2H ; 434的低字节 (5秒报警) ALARM_DUR_H EQU 01H ; 434的高字节 (5秒报警) DIG_SELECT BIT 21H ; 数码管选择标志位 ; 程序入口 ;*************************************************************** ORG 0000H LJMP MAIN ORG 000BH LJMP TMR0_ISR ; 定时器0中断入口 ;******************************************************** ; 定时器T0中断服务程序 - 数码管显示报警计时 TMR0_ISR: ; 重装定时器初值 MOV TH0, #swpH MOV TL0, #swpL ; 关闭所有数码管 SETB DIG1 SETB DIG2 ; 数码管选择显示 JB DIG_SELECT, DISPLAY_UNIT ; 显示十位 MOV P0, 42H CLR DIG1 ; 选中第一个数码管 SJMP DISPLAY_DONE DISPLAY_UNIT: ; 显示个位 MOV P0, 43H CLR DIG2 ; 选中第二个数码管 DISPLAY_DONE: CPL DIG_SELECT ; 切换数码管选择 ; 报警计时处理 JNB ALARM_FLAG, NO_ALARM_TIMING ; 不在报警状态则跳过 ; 16位计数器递增 INC ALARM_COUNT_L MOV A, ALARM_COUNT_L JNZ NO_HIGH_INC ; 低字节未溢出则跳过 INC ALARM_COUNT_H ; 低字节溢出时增加高字节 NO_HIGH_INC: ; 检查是否达到5秒报警时长 MOV A, ALARM_COUNT_L CJNE A, #ALARM_DUR_L, NO_ALARM_TIMING MOV A, ALARM_COUNT_H CJNE A, #ALARM_DUR_H, NO_ALARM_TIMING ; 达到5秒,关闭报警 CLR ALARM_FLAG SETB BUZZER ; 关闭蜂鸣器 MOV ALARM_COUNT_L, #0 ; 重置计数器 MOV ALARM_COUNT_H, #0 NO_ALARM_TIMING: RETI ;******************************************************** ; 主程序 MAIN: ; 初始化系统 CLR EA ; 关中断 MOV TMOD, #01H ; 定时器0模式1 MOV TH0, #swpH ; 定时器初值 MOV TL0, #swpL SETB EA ; 开中断 SETB ET0 ; 允许定时器0中断 SETB TR0 ; 启动定时器0 ; 初始化变量 MOV R2, #2 MOV R0, #42H INIT_LOOP: MOV @R0, #00H ; 清零显示缓冲区 INC R0 DJNZ R2, INIT_LOOP ; 初始化蜂鸣器(关闭) SETB BUZZER ; 初始化报警标志计数器 CLR ALARM_FLAG MOV ALARM_COUNT_L, #0 MOV ALARM_COUNT_H, #0 CLR DIG_SELECT ; 初始选择十位数码管 ; 主循环 MAIN_LOOP: LCALL READ_TEMP ; 读取温度 ; 检查是否需要报警 JNB ALARM_FLAG, CHECK_ALARM ; 当前未报警则检查 SJMP LOOP_CONTINUE ; 已在报警中,跳过检测 CHECK_ALARM: ; 检查温度是否≥37℃ MOV A, TEMP CJNE A, #37, CHECK_TEMP ; 比较温度 CHECK_TEMP: JC LOOP_CONTINUE ; 温度<37℃,继续循环 ; 温度≥37℃,触发报警 SETB ALARM_FLAG ; 设置报警标志 CLR BUZZER ; 开启蜂鸣器 MOV ALARM_COUNT_L, #0 ; 重置计数器 MOV ALARM_COUNT_H, #0 LOOP_CONTINUE: LCALL DELAY10 ; 适当延时 SJMP MAIN_LOOP ; 继续主循环 ;********************************************************** ; 读取温度值 READ_TEMP: LCALL DS18B20_RESET ; 复位DS18B20 JNB F0, READ_END ; 复位失败则退出 ; 发送跳过ROM命令 MOV R0, #0CCH LCALL SEND_BYTE ; 发送温度转换命令 MOV R0, #44H LCALL SEND_BYTE ; 等待温度转换完成 SETB EA MOV 48H, #1 ; 约1秒延时 WAIT_CONVERSION: MOV 49H, #255 WAIT_LOOP1: MOV 4AH, #255 WAIT_LOOP0: DJNZ 4AH, WAIT_LOOP0 DJNZ 49H, WAIT_LOOP1 DJNZ 48H, WAIT_CONVERSION CLR EA ; 再次复位DS18B20 LCALL DS18B20_RESET JNB F0, READ_END ; 发送跳过ROM命令 MOV R0, #0CCH LCALL SEND_BYTE ; 发送读取温度命令 MOV R0, #0BEH LCALL SEND_BYTE ; 读取温度值 LCALL READ_BYTE MOV WDLSB, A ; 温度低字节 LCALL READ_BYTE MOV WDMSB, A ; 温度高字节 ; 转换温度值 LCALL CONVERT_TEMP READ_END: SETB EA RET ;********************************************************** ; 温度转换程序(取整数部分) CONVERT_TEMP: ; 提取温度整数部分 MOV A, WDLSB ANL A, #0F0H MOV R1, A MOV A, WDMSB ANL A, #0FH ORL A, R1 SWAP A ; 保存温度值用于报警判断 MOV TEMP, A ; 转换为十进制 MOV B, #10 DIV AB MOV 42H, A ; 十位数 MOV 43H, B ; 个位数 ; 转换为七段码 MOV DPTR, #SEG_TABLE MOV A, 42H MOVC A, @A+DPTR MOV 42H, A MOV A, 43H MOVC A, @A+DPTR MOV 43H, A RET ; 七段数码管编码表 (共阳极) SEG_TABLE: DB 0C0H ; 0 DB 0F9H ; 1 DB 0A4H ; 2 DB 0B0H ; 3 DB 099H ; 4 DB 092H ; 5 DB 082H ; 6 DB 0F8H ; 7 DB 080H ; 8 DB 090H ; 9 ;************************************************* ; DS18B20复位程序 DS18B20_RESET: SETB DAT NOP NOP CLR DAT MOV R6, #250 DJNZ R6, $ MOV R6, #50 DJNZ R6, $ SETB DAT MOV R6, #15 DJNZ R6, $ CALL CHECK_PRESENCE MOV R6, #60 DJNZ R6, $ SETB DAT RET ; 检查DS18B20存在脉冲 CHECK_PRESENCE: MOV C, DAT JC NO_DS18B20 SETB F0 ; 存在DS18B20 SJMP PRESENCE_END NO_DS18B20: CLR F0 ; 未检测到DS18B20 PRESENCE_END: RET ;************************************************* ; 发送一个字节程序 SEND_BYTE: MOV A, R0 MOV R5, #8 SEND_BIT: CLR C RRC A JC SEND_1 LCALL WRITE_0 ; 发送0 SJMP NEXT_BIT SEND_1: LCALL WRITE_1 ; 发送1 NEXT_BIT: DJNZ R5, SEND_BIT RET ;************************************************* ; 读一个字节程序 READ_BYTE: MOV R5, #8 MOV A, #0 READ_BIT: LCALL READ_DS18B20 RRC A DJNZ R5, READ_BIT MOV R0, A RET ;************************************************* ; 写0时序 WRITE_0: CLR DAT MOV R6, #30 DJNZ R6, $ SETB DAT RET ;************************************************* ; 写1时序 WRITE_1: CLR DAT NOP NOP NOP NOP NOP SETB DAT MOV R6, #30 DJNZ R6, $ RET ;************************************************* ; 读一位数据程序 READ_DS18B20: SETB DAT ; 释放总线 NOP NOP CLR DAT ; 启动读时序 NOP NOP SETB DAT ; 准备采样 NOP NOP NOP NOP NOP NOP NOP MOV C, DAT ; 读取数据位 MOV R6, #23 DJNZ R6, $ RET ;************************************************* ; 10ms延时子程序 DELAY10: MOV R4, #20 DELAY_LOOP2: MOV R5, #250 DELAY_LOOP1: DJNZ R5, DELAY_LOOP1 DJNZ R4, DELAY_LOOP2 RET END帮我新添加lcd显示功能并且上电后能正确运行程序
最新发布
06-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值