barriers / 阅读 / 详情

单片机汇编指令中的RET1与RET有什么区别呀?TMOD 寄存器可以位寻址吗

2023-07-30 21:46:05
共1条回复
coco

RETI是中断子程序返回

RET是中断以外的子程序返回

TMOD不可位寻址

相关推荐

在单片机中,RET和RETI分别是什么返回指令

RET是子程序返回RETI是中断返回,并且清中断标志,以保证能继续中断.
2023-07-30 19:03:042

单片机汇编语言RETI的用法

就返回到( SJMP $;等待!! )这条指令这里.
2023-07-30 19:03:164

子程序的末尾有什么指令

子程序的末尾一定要有RETI指令,子程序的调用是LCALL和ACALL。RETI是中断返回指令,这条指令的功能和RET指令相似,2条指令的不同之处是:本指令清除了中断响应时,被置1的MCS-51内部不可寻址的 “优先级生效”触发器清零。执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。中断指令“RETI”作为中断跳出指令,除了将堆栈中保存着的地址取出,送回PC,使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。扩展资料单片机汇编指令中RETI和RET的区别通常情况下,在普通的汇编子程序中用RET做返回,在中断服务子程序中用RETI起中断返回作用。两条指令都能从堆栈中弹出断点地址并装入PC中,使CPU回到原来主程序的断点处继续运行。然而,RET和RETI有本质的区别:当某一中断源响应后,单片机中的标志寄存器flag H和flag L其中的一个将会自动置位,用于阻止比它低级或同级的中断触发。RETI可以清除“优先级激活触发器”(即flag寄存器),以保证后续中断源的及时响应。所以,当把RETI替换为RET后,该程序在第一次运行时可能不会出错,但在第二次运行时就会出错了。
2023-07-30 19:03:231

单片机汇编语言指令中中断返回指令RET和RETI有什么不同?

  RETI 是中断返回指令;  RET 是子程序返回指令;  RETI比RET多一步清除中断优先级状态位,让同级别的中断有机会得到响应。  中断指令“RETI”做为中断跳出指令除了将堆栈中保存着的地址取出,送回PC;使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。
2023-07-30 19:03:391

汇编语言中RETI是什么意思,如何使用?

就返回到( SJMP $;等待!! )这条指令这里.
2023-07-30 19:03:494

恢复断点的定义

RETI指令的功能是恢复PC值。恢复断点的定义是再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点。恢复现场和断点后,CPU将继续执行原主程序。
2023-07-30 19:03:561

单片机中断服务程序最后一条指令为什么一定是RETI

RETI是中断返回指令;
2023-07-30 19:04:062

中断服务程序的最后一条指令是RET或RETI对吗?

u221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221au221a
2023-07-30 19:04:312

单片机汇编语言中REE:RETI什么意思啊?

REE,是自定义的标号。RETI,是中断返回指令。
2023-07-30 19:04:462

单片机中的RETI指令返回到哪里

返回主函数。针对这个程序,应该是返回到主函数中的jmp $,也就是说一次计时结束后会返回继续等待定时器/计数器重新计数的时间到,之后触发中断产生。这个程序中,定时器设定的时间*10=最终需要定时的时间
2023-07-30 19:04:541

单片机中断程序执行完成后的RETI指令会转到哪,请说明具体位置

我想问你
2023-07-30 19:05:043

中断服务子程序返回指令RETI和普通子程序返回指令RET有什么区别

RETI是中断返回指令这条指令的功能和RET指令相似,2条指令的不同之处是:本指令清除了中断响应时,被置1的MCS-51内部不可寻址的“优先级生效”触发器清零。
2023-07-30 19:05:122

西门子 200 plc 中断程序结束后一定要加RETI么?

一定要加RETI!
2023-07-30 19:05:223

单片机reti后,sp内容变为多少

51 单片机:SP = SP - 2。
2023-07-30 19:05:302

RETI 与 RET 有什么区别?

atmel公司的芯片手册关于RETI是这么说的Description: RETI pops the high- and low-order bytes of the PC successively from the stack and restores the interrupt logic to accept additional interrupts at the same priority level as the one just processed. The Stack Pointer is left decremented by two. No other registers are effected; the PSW is not automatically restored to its pre-interrupt status. Program execution continues at the resulting address, which is generally the instruction immediately afte the point at which the interrupt request was detected. If a lower- or same-level interrupt was pending when the RETI instruction is executed, that one instruction is executed before the pending interrupt is processed.而RET是这么说的Description: RET pops the high- and low-order bytes of the PC successively from the stack, decrementing the Stack Pointer by two. Program execution continues at the resulting address, generally the instruction immediately following an ACALL or LCALL. No flags are affected.举例说明: 假设SP为60H MOV A,#12H PUSH ACC ;SP=61H, 61H地址的内容为0x12 MOV A,#13H PUSH ACC ;SP=62H, 62H地址中的内容为0x13 RET ;SP=60H, PC=0x1312;完整的程序:可以在KEIL里面软件仿真看看结果ORG 0000H LJMP MAINORG 0100HMAIN: MOV SP, #60H MOV A, #12H PUSH ACC MOV A, #13H PUSH ACC RETORG 1312H SJMP $ //原地跳转END
2023-07-30 19:05:391

汇编语言中RETI是什么意思

这是51单片机汇编语言的指令,是从中断服务子程序中返回指令,中断服务子程序最后一行必须是RETI指令。
2023-07-30 19:05:481

单片机如何用C程序复位?

这么干好像不是太好
2023-07-30 19:05:595

汇编语言中RETI是什么意思

汇编语言(Assembly Language)是面向机器的程序设计语言。 在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈。这样用符号代替机器语盲的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。 使用汇编语言编写的程序,机器个能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言把汇编程序翻译成机器语言的过程称为f汇编。 汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。 ■对于不同型号的计算机,有着不同的结构的汇编语言 汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。 汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同的结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。 汇编语言中由于使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的汇编程序的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。 汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。 不属于汇编语言。它是Hypertext Markup Language的缩写,用来编写网页的语言.通常一个网页的网址最后面有.html或者.htm都是用这种语言编写的. 另外,它一般用来编写静态网页,现在最流行的动态语言有ASP,.NET和PHP等等.
2023-07-30 19:06:291

单片机中中断RETI执行完后是返回哪一条语句继续执行

返回LOOP标记执行
2023-07-30 19:06:394

单片机指令

START:MOV TMOD,#01H 设T0方式1MOV TL0,#0CH (设定时初值 MOV TH0,#0FEH 1MS,因P1.0输出 周期为2MS)MOV TCON,#10H 启动T0SETG ETO 开定时中断SETB EA 开总中断 AJMP$ 等待中断000BH:AJMP IST0 跳入中断入口地址IST0:MOV TL0,#OCH (重设初值MOV TH0,#0FEH )CPL P1.0 P1.0取反即高电平1MS低电平1MSRETI 中断返回
2023-07-30 19:06:483

关于RET和RETI,下面的说法中正确的是?

关于RET和RETI,下面的说法中正确的是(子程序返回指令和中断返回指令)。两者,用途不同。供参考。
2023-07-30 19:06:551

为什么80C51单片机在执行RETI或访问IE、IP指令时,不能立即响应中断?

【答案】:若正在执行RETI指令,则牵涉到前一个中断断口地址问题,必须等待前一个中断返回后,才能响应新的中断;访问IE、IP指令牵涉到有可能改变中断允许开关状态和中断优先级次序状态,必须等其确定后,按照新的IE、IP控制执行中断响应。因此,正在执行的指令不可以是RETI或者是访问IE、IP的指令,否则必须再另外执行一条指令后才能响应。
2023-07-30 19:07:031

51单片机汇编语言问题,急求回答!

ORG 0000H LJMP MAIN ORG 000BH CPL P1.7 RETI ORG 001BH CPL P1.0 RETIMAIN: MOV TMOD, #26H MOV TH0, #251 MOV TL0, #251 MOV TH1, #216 MOV TL1, #216 SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA SJMP $ END
2023-07-30 19:07:102

当CPU正在执行中断返回指令RETI、或正在读写IE或IP指令时,中断时间误差最多5个机器周期。

是这条指令本身所需要的机器周期数加执行中断的机器周期数。
2023-07-30 19:07:202

求助大神!汇编语言,中断的问题,下面程序中断怎么响应的,最后的RETI又返回到哪里了?

这个程序中断1个机器周期就回响应一次,所以基本无法正常工作,当然如果你将TMOD改变一下,使其工作在计数模式的话,TMOD=0x50,那么检测到P3.5上一个脉冲信号就会响应一次中断。RETI的返回地址是不确定的,取决于中断时候的执行地址,返回到中断响应当前执行语句的下一个语句处。
2023-07-30 19:07:291

这句话看不懂: RETI 指令以及任何访问 IE 和 IP 寄存器的指令执行过 后,CPU不能马上响应中断。

不是不能响应。而是不响应。只有再执行一条其它指令之后,单片机才去响应早已出现的中断申请。这是硬件设计的结果。
2023-07-30 19:07:401

求注释 CNT EQU 30H

CNT EQU 30H ;30H定义为CNT(中断次数)ORG 0000H ;下一条指令的地址为0000HSJMP STA ; 转STA标号处开始执行ORG 000BH ;定时器0中断入口地址LJMP T0ISR ;转定时中子程序 ORG 0050H ;定义STA标号地址为0050HSTA:MOV TMOD,#01H ;定时器T0工作方式1MOV TH0,#3CH ;定时常数 50MSMOV TL0,#0B0H;50msMOV P1,#0FEH ;#0FEH送P1口MOV CNT,#20 ;中断欠数20欠SETB ET0 ;允许定时器T0SETB TR0 ;开定时器T0SETB EA ;开总中断SJMP $ ;原地踏步,等待定时中断到来T0ISR: ;定时中断子程序CLR TR0 ;关定时器T0MOV TH0,#3CH ;得新加载定时常烽MOV TL0,#0B0H;50msSETB TR0 ;开定时器T0DEC CNT ;中断次数减1MOV A,CNT ;次数送AJNZ T0ISRE ;不是0 跳出中断MOV CNT,#20 ;是0 (中断20次了,20X50ms=1S)MOV A,P1 ;P1值送ARL A ;A左移一位 ,比如原来A=#0FEH=1111 1110 左移一位A=1111 1100MOV P1,A :A中的数送P1T0ISRE: RETI ;中断返回。(一般子程序返回用RET表示,中断子程序返回用RETI表示)END
2023-07-30 19:07:471

这个程序,中断和主程序,是怎么个执行过程,我刚接触不太懂。还有RETI返回到哪?

主程序只管自己运行,当定时器计数溢出时,定时中断产生并保持断点(就产生中断时程序 运行到的地址)进入中断子程序。执行完后到RETI,跳出中断,返回刚才那个断点处继续运行。
2023-07-30 19:08:182

单级中断如何返回断点地址

1、将所有参数或一部分参数入栈2、将当前指令的下一条指令地址入栈(返回地址)3、跳转到函数体执行,在函数体开始执行时还需要完成一部分操作:ebp入栈,将ebp指向esp(栈顶),分配所需字节的临时空间,保存寄存器
2023-07-30 19:08:2714

51汇编中 中断程序中 可以自定义跳出循环么 即不通过reti 返回

1、用汇编编写程序。CPU只会忠实执行代码的意图,而不是程序员的“意图”。2、什么是跳出循环?直接LJMP当然可以。永远不再执行RETI,没有RETI,当然也可以。3、但是你需要明确这样做,是否符合你的真实意愿。回顾一下中断的概念。 a、当相关中断源及总中断被允许,有中断源请求时。CPU停止主程序执行,保护断点及PSW。跳转至中断入口地址。 b、如果没有RETI,将不会自动返回到之前的断点,及断点时刻的PSW恢复等。而且当前的中断源再次触发将不再理会。有时候,程序员会直接让程序复位,如LJMP 0,或者中断入口堆栈处理。但这种热重启还需要更多的初始化SFR设置,如PSW,SP等。
2023-07-30 19:08:521

中断服务程序与普通子程序有哪些相同和不同之处???

相同点:都是让cpu从主程序转去执行子程序,执行完毕又返回主程序。不同点:中断服务程序是随机的,而普通子程序是预先安排好的;中断服务子程序以reti结束,而一般子程序以ret结束。reti除将断点弹回pc动作外,还要清除对应的中断优先标志位,以便新的中断请求能被响应。
2023-07-30 19:09:023

单片机编程的小问题

ret回到acall ptomo 这一步,下一时刻就会运行acall ptomo下面的指令。他是子程序的返回指令,回到调用地点。而reti 是中断服务程序的返回指令,所以会回到中断前PC指针的位置。例如,当指针运行到mov tmod ,#01h ,此时指针为PC=1100h,现在中断,运行完中断服务程序后就会弹回 PC=1100h,那么下一步就会运行acall ptomo 。here ; ajmp here 他重复运行这条指令,运行ajmp就会跳转到here,反复循环。目的是等待中断。当你的主程序可以无限循环时可以不用这条指令当有中断来了(在mcs-51是定时/计数器T0溢出中断),pc指针 自动 从000bh开始读取数据,别的中断就从别的入口地址开始。所以必须在000bh放中断程序,当中断服务程序大于8字节,那么就得用跳转指令,跳到中断服务程序区
2023-07-30 19:09:241

汇编语言编程:一个周期10ms,占空比1:4的方波

ORG 00H MOV TH0,#0FH ;T0方式0 MOV TL0,#0B9H ;定时5ms,周期10ms SETB ET0 SETB EA SETB TR0 SJMP $ ORG 000BH ;T0入口 MOV TH0,#0FH ;回复初始值 MOV TL0,#0B9H CPL P1.1 ;P1.1取反 RETI END
2023-07-30 19:09:341

51单片机子程序中使用JMP(AJMP,LJMP,SJMP)指令 执行RET能不能回到主程序?

在子程序内用跳转可以。但是如果在子程序内用跳转 跳出了这个子程序执行别的去了,这个就要小心了,你的RET没有执行(地址没有出栈),可能会出现数据的错误,如果后面反复调用该函数 也有可能因为地址只进栈不出栈 导致最终内存占满。
2023-07-30 19:09:458

中断服务子程序返回指令RETI和普通子程序返回指令RET有什么区别

RETI是中断返回指令这条指令的功能和RET指令相似,2条指令的不同之处是:本指令清除了中断响应时,被置1的MCS-51内部不可寻址的“优先级生效”触发器清零。
2023-07-30 19:10:201

这里的RETI返回到哪里?

主程序中:LOOP1:~SJMP LOOP1这是个无限循环。循环期间,随时,都可以发生中断,转到 AAA。(0003H 处的中断,由外部按键触发。)RETI 就是返回到断点。
2023-07-30 19:10:281

子程序的末尾有什么指令

子程序的末尾一定要有RETI指令,子程序的调用是LCALL和ACALL。RETI是中断返回指令,这条指令的功能和RET指令相似,2条指令的不同之处是:本指令清除了中断响应时,被置1的MCS-51内部不可寻址的 “优先级生效”触发器清零。执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。中断指令“RETI”作为中断跳出指令,除了将堆栈中保存着的地址取出,送回PC,使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。扩展资料单片机汇编指令中RETI和RET的区别通常情况下,在普通的汇编子程序中用RET做返回,在中断服务子程序中用RETI起中断返回作用。两条指令都能从堆栈中弹出断点地址并装入PC中,使CPU回到原来主程序的断点处继续运行。然而,RET和RETI有本质的区别:当某一中断源响应后,单片机中的标志寄存器flag H和flag L其中的一个将会自动置位,用于阻止比它低级或同级的中断触发。RETI可以清除“优先级激活触发器”(即flag寄存器),以保证后续中断源的及时响应。所以,当把RETI替换为RET后,该程序在第一次运行时可能不会出错,但在第二次运行时就会出错了。
2023-07-30 19:10:371

单片机中子程序和中断服务程序有何异同?为什么子程序返回指令RET和中断返回指令RETI不能相互替代?

子程序是一段程序代码,是独立的一个执行部分,你主程序调用就执行,不调用就不执行;而中断服务程序也是是一段程序代码,是独立的一个执行部分;但是只在你主程序开了中断,并且有中断条件(不如中断口接收到低电平,定时时间到了)才会去执行,并且中断服务程序会将你主程序运行时的PC指针寄存器,A累加器就信息都会入栈保护;退出中断后又会出栈进行还原;而子程序则不会;
2023-07-30 19:10:521

求大神翻译一下汇编语言

ENA EQU P2.0 ;使能A口ENB EQU P2.1 ;使能B口ENC EQU P2.2 ;使能C口CLK EQU P1.0 ;时钟口DIN EQU P1.1 ;数据输入口COUNT EQU 0FH ;计数变量CISHU EQU 2EH ;次数变量ORG 0000HAJMP MAINORG 0003HAJMP INT0ORG 000BHAJMP I0MAIN: MOV COUNT,#0 ;计数器初始化0 MOV CISHU,#12 ;次数为12 CALL L2 ;调用L2初始化WAIT: LCALL IN ;调用IN输入 LCALL XIANSHI ;调用显示 SJMP WAIT ;转WAITL2: MOV R3,#0AH ;初始化R3=0aH MOV R4,#55 ;同理 MOV R5,#59 ;同理 MOV R6,#11 ;同理 MOV TMOD,#11H ;定时器均为模式1 MOV TH0,#03CH ;定时器0初始值为65536-50000 MOV TL0,#0B0H SETB IT0 ;外部中断0为沿触发 SETB EX0 ;开外部中断0 SETB ET0 ;开定时器0 SETB EA ;开中断 SETB TR0 ;启动定时器0 RET ;IN: MOV A,R6 ;A=R6 MOV B,#0AH ;B=10 DIV AB ;A/B MOV DPTR,#TAB ;表首地址送数据指针 MOVC A,@A+DPTR ;查表 MOV 6FH,A ;结果存6FH MOV A,B ;A/B的余数送A MOV DPTR,#TAB ;表首地址送数据指针 MOVC A,@A+DPTR ;查表 MOV 6EH,A ;结果存6EH MOV A,#0BFH ;A=BFH MOV 70H,A ;(70H)=A MOV A,R5 ;A=R5 MOV B,#0AH ;B=10 DIV AB ;除法 MOV DPTR,#TAB ;表首地址送数据指针 MOVC A,@A+DPTR ;查表 MOV 72H,A ;结果存72H MOV A,B ;余数送A MOV DPTR,#TAB ;表地址 MOVC A,@A+DPTR ;查表 MOV 71H,A ;结果存71H MOV A,#0BFH ;A=BFH MOV 73H,A ;(73H)=A MOV A,R4 ;A=R4 MOV B,#0AH ;B=10 DIV AB ;除法 MOV DPTR,#TAB ;表地址 MOVC A,@A+DPTR ;查表 MOV 75H,A ;结果存75H MOV A,B ;余数送A MOV DPTR,#TAB ;表地址 MOVC A,@A+DPTR ;查表 MOV 74H,A ;结果存74H RETXIANSHI: ;显示子程序 CLR ENA ;开使能A SETB ENB ;关使能B SETB ENC ;关使能C MOV R1,6EH ;显示内容首地址送R1LOOP3: MOV A,@R1 ;取第一个数 MOV R0,#08H ;共8个数LOOP2: LCALL LOOP ;调用LOOP显示 INC R1 ;地址加1 CJNE R1,#76H,LOOP3 ;不到76H转LOOP3 SETB ENA ;关使能A RETI0: DJNZ R3,LOOP1 ;R3不等于转LOOP1 MOV R3,#14H ;R3=20 INC R4 ;R4加1 CJNE R4,#60,LOOP1 ;R4不等于60转LOOP1 MOV R4,#0 ;R4=0 INC R5 ;R5加1 CJNE R5,#60,LOOP1 ;R5不等于60转LOOP1 INC R6 ;R6加1 MOV R5,#0 ;R5=0 MOV A,R6 ;A=R6 CJNE A,CISHU,LOOP1 ;A不等于CISHU转LOOP1 MOV R6,#0 ;R6=0LOOP1: MOV TH0,#03CH ;重赋初值 MOV TL0,#0B0H ; SETB TR0 ;启动定时器0 RETILOOP: RLC A ;A带进位左移 MOV DIN,C ;C送数据口 NOP ;空操作 NOP SETB CLK ;时钟置1 NOP NOP CLR CLK ;时钟清0 DJNZ R0,LOOP ;R0减1部位0转LOOP RETINT0: INC COUNT ;计数器变量加1 MOV A,COUNT ;送A MOV B,#2 ;B=2 DIV AB ;A/B MOV A,B ;A=B CJNE A,#0,L3 ;A不为0转L3L1: MOV CISHU,#12 ; CISHU=12 RETIL3: MOV CISHU,#24 ;CISHU=24 RETI TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END
2023-07-30 19:11:021

试编写一段对中断系统初始化的程序(单片机原理与应用的习题)

初始化部分,是很简单的。MOV IE, #10010111BMOV IP, #00000010B只用两行即可。
2023-07-30 19:11:122

MCS51单片机,中断服务程序的返回指令和子程序的返回指令有什么区别?是多少?

中断服务程序的返回指令 汇编助记符 reti 机器指令 32h子程序的返回指令 汇编助记符 ret 机器指令 22h
2023-07-30 19:11:352

单片机中断问题

ORG 0000H LJMP MAIN ;主程序入口地址 ORG 000BH ;T0的中断入口地址 LJMP DVT0 ;转向中断服务程序 ORG 0100H MAIN: MOV TMOD,#001H ;置T0于工作方式1 MOV TH0,#03CH ;装入计数初值 MOV TL0,#0B0H ;设晶振12MHZ,5000次就是50毫秒 SETB ET0 ;T0开中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0 SJMP $;等待中断 DVT0:CPL P3.5 MOV TH0,#03CH ;重新装入计数值 MOV TL0,#0B0H RETI ;中断返回 END外部中断必须禁止硬件中断
2023-07-30 19:11:452

单片机中断返回指令

我感觉你的程序编译都不能过,LJMP MIN,你MIN这个标号是没有的,何况这还是一个变量。
2023-07-30 19:11:574

请教中断返回指令RET1

RET是子程序返回 RETI是中断返回,并且清中断标志,以保证能继续中断.
2023-07-30 19:12:051

说明80C51单片机的中断过程.

中断标志位至1进入中断程序保护现场执行中断程序恢复现场退出中断
2023-07-30 19:12:161

汇编语言重复定义错误

经过修改,编译通过了。ORG 0000HLJMP MAINORG 000BHLJMP PNT0 ;PT0不能 ,是系统保留字ORG 001BHLJMP PNT1 ;PT1不能 ,是系统保留字ORG 0050HMAIN:MOV SP,#50HMOV TMOD,#12HMOV A,#7EHMOV P1,AMOV R2,#00HMOV R3,#00HSETB EASETB ET1SETB ET0SETB TR1SETB TR0SETB P1.0SETB P1.7MOV TL0,06HMOV TH0,06HINC R3CJNE R3,#0CBH,NEXT1;#CBH前要加0CPL P1.7MOV R3,#00HNEXT1:MOV TL0,06HMOV TH0,06H;RETI //主程序不能用RETIHERE:SJMP HERE;ORG 0200H //这不用再定义起始地址PNT1:MOV TL1,#0B0HMOV TH1,#3CHINC R2CJNE R2,#14H,NEXTCPL P1.0MOV R2,#00HNEXT:MOV TL1,0B0HMOV TH1,63HRETIPNT0:MOV TL0,06HMOV TH0,06HINC R3CJNE R3,#190,NEXT2;190多了H,CPL P1.7MOV R3,#00HNEXT2: ;NEXT1用过了MOV TL0,06HMOV TH0,06HRETIEND
2023-07-30 19:12:391

汇编指令解释

1.Rn 表示R0~R7中的一个2.#data 表示8位的数值 00H~FFH3.direct 表示8位的地址 00H~FFH4.@Ri 表示寄存器间接寻址 只能是R0或者R15.@DPTR 表示数据指针间接寻址6.bit 表示位地址7.$ 表示当前地址寄存器寻址 MOV A,R1 将R1中的数值赋予A直接寻址 MOV A,3AH 将地址3AH中的数值赋予A立即寻址 MOV A,#3AH 将3AH数值赋予A寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A变址寻址 MOVC A,@A+DPTR 以A中的数值为地址偏移量进行查表相对寻址 AJMP MATN 跳转到行号为MATNC处位寻址 MOV C,7FH 将位地址7FH的数值赋予CMOV A,#3AH 数据传输、赋值命令PUSH direct 将direct为地址的数值压入堆栈中POP direct 将direct为地址的数值弹出堆栈XCH A,direct 将direct中的数值与A进行交换ADD A,direct 将direct中的数值与INC direct 将direct中的数值加1SUBB A,direct 将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零 CLR CDEC direct 将direct中的数值减1DA A 用于对BCD码加减法后进行10进制调整MUL AB 将A和B相乘,并把高八位放在B中,低八位放在A中DIV AB 将A和B相除,并把商放在A中,余数放在B中ANL A,direct 将A与direct中的数值进行与运算,结果保留在A中(与运算规律:有0出0,全1出1)ORL A,direct 将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0)XRL A,direct 将A与direct中的数值进行异或运算,结果保留在A中(异或运算规律:全0出0,全1出0,01、10出1)CRL A 对A清零CPL A 对A取反RL A 对A中数右移RR A 对A中数左移RLC A 对A中数带Cy右移RRC A 对A中数带Cy左移SWAP A 对A中的数高4位低4位互相交换LJMP 长跳转指令,64K地址范围AJMP 短跳转指令,2K地址范围JZ rel 如果A为0就跳转到rel行号处JNZ rel 如果A不为0就跳转到rel行号处CJNE A,#data,rel 如果A不等于data就跳转到rel行号处DJNZ R1,rel 如果R1减1后不为0就跳转到rel行号处ACALL rel 调用rel子程序,2K地址以内LCALL rel 调用rel子程序,64K地址以内RET 子程序返回指令RETI 中断程序返回指令NOP 空操作指令MOV C,bit 将位地址bit中的值赋予CCRL bit 将bit位地址清0SETB bit 将bit位地址置1CPL bit 将bit位地址取反ANL C,bit 将地址bit中的值和C做与运算,结果存放在C中ORL C,bit 将地址bit中的值和C做或运算,结果存放在C中JC rel 如果Cy为1,就跳转到rel行号处JNC rel 如果Cy为0,就跳转到rel行号处
2023-07-30 19:12:461

求有关用段码指令编的LED程序(只是想知道段码指令怎么用)

给你个8段LED测试:简易时钟(AVR汇编) 由M128移植到M16上实现,通过。(AVR Studio V4.11) 该系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。 系统使用板上8个LED数码管显示 时、分、秒、1/100秒 4个时段的数字,每个时段占用2个LED。 显示方式采用动态扫描方式,M16的PA口输出显示数字的7段码,PC口用于控制8个LED的位选。 M16使用外部(或内部)4MHz晶振。 使用M16片内的计数/定时器T1,设计T1工作在定时溢出中断方式,定时间隔为2ms,即T1每2ms产生一次中断。5次中断得到10ms的时间间隔,此时时钟的1/100秒加1,并相应进行时、分、秒的调整。 LED动态扫描方式的设计如下:在每2ms的时间中,点亮8个LED中的一个,显示其相应的数字(PC口的输出只有一位为低电平,选通一个LED,保持2ms)。因此PC口的输出值为0b11111110,每隔2ms循环右移,到0b01111111时8个LED各点亮一次,时间为16ms。在1秒钟内,循环8个LED的次数为62.5(1000/16),是人眼的滞留时间(25次/秒)的2.5倍,保证了LED显示亮度均匀,无闪烁。在程序设计中,在各个LED转换和7段码输出时,关闭位选信号(PC输出0b11111111),消除了显示的拖尾现象(消影功能)。 T1的设计:T1为16位定时器,系统时钟为4M,采用其64分频后的时钟作为T1的计数信号(寄存器TCCR1B = 0x03),一个计数周期为16us,2ms需要计125个(0x007D)。由于T1溢出中断发生在0xFFFF后下一个T1计数脉冲的到来(参见第二章关于定时器原理部分),因此T1的计数初始值为0xFF83=0XFFFF-0X007C(65535-124)。 ;******************************************************** ;AVR汇编程序实例 ;简易带1/100秒的24小时制时钟 ;Mega16 4MHz ;******************************************************** .include "m16def.inc" ;引用器件I/O配置文件 ;定义程序中使用的变量名(在寄存器空间) .def count = r18 ;循环计数单元 .def position = r19 ;LED显示位指针,取值为0-7 .def p_temp = r20 ;LED显示位选,其值取反由PC口输出 .def count_10ms = r21 ;10ms计数单元 .def flag_2ms = r22 ;2ms到标志 .def temp = r23 ;临时变量 .def temp1 = r24 ;临时变量 .def temp_int = r25 ;临时变量(在中断中使用) ;中断向量区定义,flash程序空间$000-$029 .org $000 rjmp reset ;复位处理 nop reti ;IRQ0 Handler nop reti ;IRQ1 Handler nop reti ;Timer2 Compare Handler nop reti ;Timer2 Overflow Handler nop reti ;Timer1 Capture Handler nop reti ;Timer1 Compare-A Handler nop reti ;Timer1 Compare-B Handler nop rjmp time1_ovf ;Timer1 Overflow Handler nop reti ;Timer0 Overflow Handler nop reti ;SPI Transfer Complete Handler nop reti ;USART RX Complete Handler nop reti ;USART UDR Empty Handler nop reti ;USART TX Complete Handler nop reti ;ADC Conversion Complete Handler nop reti ;E2PROM Ready Handler nop reti ;Analog Comparator Handler nop reti ;Two-wire Serial Interface Handler nop reti ;IRQ2 Handler nop reti ;Timer0 Compare Handler nop reti ;SPM Ready Handler nop ;程序开始 .org $02A reset: ldi r16,high(RAMEND) ;设置堆栈指针高位 out sph,r16 ldi r16,low(RAMEND) ;设置堆栈指针低位 out spl,r16 ser temp out ddra,temp ;设置PORTA为输出,段码输出 out ddrc,temp ;设置PORTC为输出,位码控制 out portc,temp ;PORTC输出$FF, 无显示 ldi position,0x00 ;段位初始化为1/100秒低位 ldi p_temp,0x01 ;LED第1位亮 ;初始化时钟时间为11:59:55:00 ldi xl,low(time_buff) ; ldi xh,high(time_buff) ;X寄存器取得时钟单元首指针 ldi temp,0x00 st x+,temp ;1/100秒 = 00 ldi temp,0x55 st x+,temp ;秒 = 55 ldi temp,0x59 st x+,temp ;分 = 59 ldi temp,0x11 st x,temp ;时 = 11 ldi temp,0xff ;T1初始化,每隔2ms中断一次 out tcnt1h,temp ldi temp,0x83 out tcnt1l,temp clr temp out tccr1a,temp ldi temp,0x03 ;4M,64分频 2ms out tccr1b,temp ldi temp,0x04 out timsk,temp ;允许T1溢出中断 sei ;全局中断允许 ;主程序 main: cpi flag_2ms,0x01 ;判2ms到否 brne main ;No,转main循环 clr flag_2ms ;到,请2ms标志 rcall display ;调用LED显示时间(动态扫描显示一位) d_10ms_ok: cpi count_10ms,0x05 ;判10ms到否 brne main ;No,转main循环 clr count_10ms ;10ms到,清零10ms计数器 rcall time_add ;调用时间加10ms调整 rcall put_t2d ;将新时间值放入显示缓冲单元 rjmp main ;转main循环 ;LED动态扫描显示子程序,2ms执行一次,一次点亮一位,8位循环 display: clr r0 ser temp ;temp = 0x11111111 out portc,temp ;关显示,去消影和拖尾作用 ldi yl,low(display_buff) ldi yh,high(display_buff) ;Y寄存器取得显示缓冲单元首指针 add yl,position ;加上要显示的位值 adc yh,r0 ;加上低位进位 ld temp,y ;temp中为要显示的数字 clr r0 ldi zl,low(led_7 * 2) ldi zh,high(led_7 * 2) ;Z寄存器取得7段码组的首指针 add zl,temp ;加上要显示的数字 adc zh,r0 ;加上低位进位 lpm ;读对应七段码到R0中 out porta,r0 ;LED段码输出 mov r0,p_temp com r0 out portc,r0 ;输出位控制字,完成LED一位的显示 inc position ;调整到下一次显示位 lsl p_temp cpi position,0x08 brne display_ret ldi position,0x00 ldi p_temp,0x01 display_ret: ret ;时钟时间调整,加0.01秒 time_add: ldi xl,low(time_buff) ; ldi xh,high(time_buff) ;X寄存器为时钟单元首指针 rcall dhm3 ;ms单元加1调整 cpi temp,0x99 ; brne time_add_ret ;未到99ms返回 rcall dhm ;秒单元加1调整 cpi temp,0x60 brne time_add_ret ;未到60秒返回 rcall dhm ;分单元加1调整 cpi temp,0x60 brne time_add_ret ;未到60分返回 rcall dhm ;时单元加1调整 cpi temp,0x24 brne time_add_ret ;未到24时返回 clr temp st x,temp ;到24时,时单元清另 time_add_ret: ret ;低段时间清零,高段时间加1,BCD调整 dhm: clr temp ;当前时段清零 dhm1: st x+,temp ;当前时段清零,X寄存器指针加一 dhm3: ld temp,x ;取出新时段数据 inc temp ;加一 cpi temp,0x0A ;若个位数码未到$0A(10) brhs dhm2 ;例如$58+1=$59,不须调整; subi temp,0xFA ;否则做减$FA调整:例如$49+1-$FA=$50 dhm2: st x,temp ;并将调整结果送回 ret ;将时钟单元数据送LED显示缓冲单元中 put_t2d: ldi xl,low(time_buff) ; ldi xh,high(time_buff) ;X寄存器时钟单元首指针 ldi yl,low(display_buff) ldi yh,high(display_buff) ;Y寄存器显示缓冲单元首指针 ldi count,4 ;循环次数 = 4 loop: ld temp,x+ ;读一个时间单元 mov temp1,temp swap temp1 andi temp1,0x0f ;高位BCD码 andi temp,0x0f ;低位BCD码 st y+,temp ;写入2个显示单元 st y+,temp1 ;低位BCD码在前,高位在后 dec count brne loop ;4个时间单元->8个显示单元 ret ;T1时钟溢出中断服务 time1_ovf: in temp_int,sreg push temp_int ;保护状态寄存器 ldi temp_int,0xff ;T1初始值设定,2ms中断一次 out tcnt1h,temp_int ldi temp_int,0x83 out tcnt1l,temp_int inc count_10ms ;10ms计数器加一 ldi flag_2ms,0x01 ;置2ms标志到 pop temp_int out sreg, temp_int ;恢复状态寄存器 reti ;中断返回 .CSEG ;LED七段码表,定义在Flash程序空间 led_7: ;7段码表 .db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 .db 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 ;字 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 共阴极 共阳极 ; h g f E d c b a ;0 0 0 1 1 1 1 1 1 3FH C0H ;1 0 0 0 0 0 1 1 0 06H F9H ;2 0 1 0 1 1 0 1 1 5BH A4H ;3 0 1 0 0 1 1 1 1 4FH B0H ;4 0 1 1 0 0 1 1 0 66H 99H ;5 0 1 1 0 1 1 0 1 6DH 92H ;6 0 1 1 1 1 1 0 1 7DH 82H ;7 0 0 0 0 0 1 1 1 07H F8H ;8 0 1 1 1 1 1 1 1 7FH 80H ;9 0 1 1 0 1 1 1 1 6FH 90H ;A 0 1 1 1 0 1 1 1 77H 88H ;b 0 1 1 1 1 1 0 0 7CH 83H ;C 0 0 1 1 1 0 0 1 39H C6H ;d 0 1 0 1 1 1 1 0 5EH A1H ;E 0 1 1 1 1 0 0 1 79H 86H ;F 0 1 1 1 0 0 0 1 71H 8EH .DSEG ;定义程序中使用的变量位置(在RAM空间) .ORG $0060 display_buff: ;LED显示缓冲区,8个字节 .BYTE 0x00 ;LED 1 位显示内容 .BYTE 0x00 ;LED 2 位显示内容 .BYTE 0x00 ;LED 3 位显示内容 .BYTE 0x00 ;LED 4 位显示内容 .BYTE 0x00 ;LED 5 位显示内容 .BYTE 0x00 ;LED 6 位显示内容 .BYTE 0x00 ;LED 7 位显示内容 .BYTE 0x00 ;LED 8 位显示内容 .org $0068 time_buff: ;时钟数据缓冲区,4个字节 .BYTE 0x00 ;1/100s单元 .BYTE 0x00 ;秒单元 .BYTE 0x00 ;分单元 .BYTE 0x00 ;时单元 程序实例采用比较规范标准的设计理念和风格,程序中已给出比较详细的注解。关于程序如何具体完成和实现系统的功能请读者仔细阅读程序,用心体会。下面仅对编写M16汇编程序时,在结构和语句使用上一些需要注意的方面加以介绍。 1.将程序中操作最频繁以及需要特殊位处理的变量定义在AVR的32个工作寄存器空间,因为MCU对R0-R31的操作仅需要一个时钟周期,而且功能强大。由于R0-R31的功能有不同,而且也仅有32个,所以程序员应认真考虑和规划这32个工作寄存器的使用。如尽量不要将变量放置在R26-R31中,因为这6个寄存器构成3个16位的X、Y、Z地址指针寄存器,应保留用于各种寻址使用。 2.M16有21个中断源,Flash程序存储器的低段空间为这21个中断向量地址。注意:M16的一个中断向量地址空间为2个字长度(4字节)。在中断向量处可使用长转移指令jmp转移(2字)或rjmp转移(1字)到中断服务程序,而一般的AVR的一个向量地址空间为1个字长度,使用rjmp转移指令。 出于提高系统可靠性的设计,对于系统中不使用的中断向量,应填充2个中断返回指令reti(每个reti占一个字)。在本程序中,为了程序的理解和阅读方便,使用rjmp和nop,以及reti和nop指令填充一个2个字长度的向量地址空间。 3.程序中使用X、Y、Z三个16位的地址指针寄存器,基于他们的一些指令有自动加(减)一的功能,以及先加(减)、后使用,和先使用、后加(减)的区别,在使用中应注意正确和灵活的使用。 4.由于LED的七段码对照表是固定不变的,程序中将LED的七段码表放置在Flash存储器中。对于Flash存储器的间址取数只能使用Z寄存器。由于程序存储器的地址是以字(双字节)为单位的,因此,16位地址指针寄存器Z的高15位为程序存储器的字地址,最低位LSB为“0”时,指字的低字节;为“1”时,指字的高字节。程序中使用伪指令db定义的七段码为一个字节,他保存在一个字的低字节处。如果定义字,应使用伪指令dw。 本例使用指令lpm读取Flash中的一个字节,因此在取七段码表的首地址时乘2(ldi zl,low(led_7 * 2)),将地址左移一位,Z寄存器的LSB为“0”,表示取该字的低位字节。 5.中断服务程序中,必须对MCU的标志寄存器SREG进行保护。在T1的溢出中断服务程序中,还需要对TCNT1的初值进行设置,以保证下一次中断仍为2ms。中断服务程序应尽量短小,因此在中断服务中,只将2ms标志置位和10ms加一计数,其它处理应尽量放在主程序中。 6.程序中定义了8个字节的显示缓冲区和4个字节的时钟数据缓冲区,分别存放8个LED所对应的显示数字和4个时间段的时间值(BCD码),这12个单元定义放置在M16的RAM中。M16的RAM单元应从0x0060开始,前面的地址分别对应的是32个工作寄存器、I/O寄存器,因此不要把一般的数据单元定义在小于0x0060的空间。 7.与使用db或dw伪指令在Flash空间定义常量不同的是,在RAM空间予留变量空间的定义应使用byte伪指令。byte伪指令的功能是定义变量的位置(予留空间),不能定义(填充)变量的值,变量具体的值是需要由程序在运行中写入的。而伪指令db、dw具有数据位置和值定义(填充)的功能。 在M16板上的连接方式: 使用短路片短路M16边上的: PB5、PB6、PB7、RST(以上为ISP口); VCC、GND; X2、X1(使用内部震荡可不短路); PD0、PD1(不同PC通信时可不连); AVCC、GND(在M16的右边); 如使用外部晶体时:JN(连AVR)、J1(连4M); 用16根连接线: PA0-->a PA1-->b PA2-->c PA3-->d PA4-->e PA5-->f PA6-->g PA7-->p PC0-->Jc3_8 PC1-->Jc3_7 PC2-->Jc3_6 PC3-->Jc3_5 PC4-->Jc3_4 PC5-->Jc2_3 PC6-->Jc2_2 PC7-->Jc2_1 首先使用ISP下载线对M16的熔丝位配置(建议使用BASCOM-AVR中的下载软件,非常直观): 禁止JTAG口,PORTC全部作为I/O使用; 使用外部晶体或内部RC振荡(根据需要); 允许BOD检测,门限电压4.0v; RESET向量为0x0000(确省值为0X0000,一般不用改)。
2023-07-30 19:12:561

如何使用单片机C语言实现复位

...那没有碟的话岂不一直复位了。。。
2023-07-30 19:13:084

『求助』用51单片机定时器实现99秒表倒计时功能

MOV P0, #6FH ;开始, 数码管显示"99" MOV P2, #6FH MOV TMOD, #01H ;T0定时方式1 MOV TH0, #(65536 - 50000) / 256 MOV TL0, #(65536 - 50000) MOD 256 MOV IE, #82H MOV SECOND, #0 MOV TCOUNT, #0 MOV KCOUNT, #0
2023-07-30 19:13:372