在51单片机的汇编语言中的双周期指令说第二个周期读入操作码并丢弃,既然读了又丢弃了还要第二个周期干什

么,这不是一种时间的浪费吗,岂不是一个周期就可以完成。还有我用延迟函数做两位数的数码管倒计时60秒,一闪一闪的,根本做不到,但是能做成一位的倒计时,比如从9数到0。两位的只能用定时器,中断去做,我不明白,希望大家指导下,不要用定时器中断定时不占用CPU时间来解释,从两种不同的实际效果结合cpu执行情况给我解释下,回答好的给额外加分。

第一个问题:双周期指令,第二周期读的是操作数,只有在第一周期读操作码的,而有几条指令是单字节的,也需要两个周期,这不是浪费时间,是因一个周期是不能完成的,这不是你想像的那样。
第二个问题:要做计时,不管是倒计时还是正常计时,用延迟函数来做,这种方法计时是不准确的,只有用定时器才比较准确。
第三个问题:你不要求计时准确,就想用延迟函数来做也可以,那为什么两位会一闪一闪的,是因为在调用延迟函数时不能完成显示的,也就是不能同时调用显示函数了,所以,就不显示了,而等到延时到了才能再调显示子函数,这样,显示的间隔长了,就会闪烁了。
第四个问题:是很好解决的,其实在调用显示子函数时也是等于在延迟,因为显示一位一般要延时1ms的,显示两位就延时2ms,可以写一个延时1ms的函数。这样,就不用另外调用其它的延时函数了。反复调用显示函数,调用一次就延时2ms,然后对调用显示函数计数,调用500次就是1秒了,这是大约的时间,因不准确。有了1秒的时间,剩下的问题你会解决了吧。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-16
时间,是故意浪费的。

双周期指令,都是针对片外RAM(或IO接口)的。
当年,它们的工作速度,明显跟不上 CPU 的速度。

如果 CPU 没有在这里《等待》一下,就必须在电路上,增加一个部分,强迫单片机,停顿一下。

你去看看 80x86 CPU 的等待周期,是怎么插入的,就知道了。--都是用外接电路,来完成的。
-----------
两位的只能用定时器,中断去做...

你的程序呢?追问

谢谢你的回答,你能在帮我看看这两个代码吗。,帮我解释下吧,分数上我会多给点的;
第一个倒计时60秒

while(1)
{
for(i=0;i<=60;i++)
{
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=sz[i%10];
duan=0;
delay(200);\\D
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=sz[i/10];
duan=0;
delay(200);
for(a=0;a<10000;a++)
{
for(b=0;b<123;b++);//1s时间
}
}

追答

for(a=0;a<10000;a++) {
for(b=0;b<123;b++);//1s时间
}
----
原来是 C 语言 !
C 语言,那有时间概念 !
用汇编语言,才行。

用汇编语言编程,就连一个微秒,都不带错的。

用 C 语言,只能用定时器,才能保证定时精度。
----
两位数码,不用中断,程序如下:

while(1) {

for(i = 0; i <= 60; i++) { //0 ~ 59

for(a = 0; a < 1000; a++) { //这个1000,你可以随便改

wei=1; P0 = 0xfd; wei=0;
duan=1; P0 = sz[i % 10]; duan=0; delay(200);
wei=1; P0 = 0xfe; wei=0;
duan=1; P0 = sz[i / 10]; duan=0; delay(200);

} //循环 1000 遍,但愿正好是一秒
}

本回答被提问者和网友采纳
第2个回答  2013-04-16
其实单片机编程 没有那么要考虑得这么复杂,
用延迟函数做数码管显示 & 定时器中断做数码管显示 都一样,
只是 要使 数码管显示 不一闪一闪,只要 每个数码管 在 一秒钟内显示 大于 50 次
用中断显示参考 汇编在追问里
http://zhidao.baidu.com/question/541524005.html#answer-1368058655
用延时
ORG 00H
SJMP STAR
ORG 1BH
SJMP TIS; 转T1中断服务程序
ORG 30H
STAR:MOV R2,#60H; 倒计时初值
MOV R4,#100; 定时中断溢出计数器
STA1:ACALL DIS; 调用显示子程序
SJMP STA1
SEG7:INC A; A的值加一
MOVC A,@A+PC; 取显示断段
RET
DB 0C0H,0F9H,0A4H,0B0H; 0至3的共阳型显示码
DB 99H,92H,82H,0F8H; 4至7的共阳型显示码
DB 80H,90H,88H,83H; 8至B的共阳型显示码
DB 0C6H,0A1H,86H,8EH; C至F的共阳型显示码
DIS: MOV A,R2; 单字节十六进制数转为十进制数
ANL A,#0FH
ACALL SEG7
SETB P2.0
CPL A
MOV P1,A; 显示十位
CLR P2.1
ACALL DLY0
MOV A,R2
SWAP A
ANL A,#0FH
ACALL SEG7
SETB P2.1
CPL A
MOV P1,A; 显示个位
CLR P2.0
ACALL DLY0
RET; 子程序返回
DLY0:MOV R6,#20 ; 10 mS 12MHz
DLY1:MOV R5,#250 ; 延时
DJNZ R5,$
DJNZ R6,DLY1
DJNZ R4,DLY8; 定时1S到否
MOV R4,#100; 到1S,重置R4=100
MOV A,R2
ADD A,#99H ; 倒计时递减
DA A
MOV R2, A
DLY8:RET; 子程序返回
END

在51单片机的汇编语言中的双周期指令说第二个周期读入操作码并丢弃...
第一个问题:双周期指令,第二周期读的是操作数,只有在第一周期读操作码的,而有几条指令是单字节的,也需要两个周期,这不是浪费时间,是因一个周期是不能完成的,这不是你想像的那样。第二个问题:要做计时,不管是倒计时还是正常计时,用延迟函数来做,这种方法计时是不准确的,只有用定时器才...

如何区分51单片机中的单周期和双周期指令
5、位操作指令中,ANL和ORL是2周期指令 6、所有包含立即地址的指令,除INC direct及DEC direct外,均为2周期指令 7、剩下的均为单周期指令。

如何区分51单片机中的单周期和双周期指令
单双周期指的是指令的执行速度,现在很多单片机都对指令执行速度进行了优化,比如 4T \/ 3T \/1T等等,所以不同单片机的指令执行速度都不一样,建议参考数据手册的指令集。

单片机延时子程序流程图
1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度, 51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行 一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。 2 .指令周期是指单片机执行一条...

汇编语言中,如何区分单\\双周期指令?
为什么要死记?通常没用,用到的时候去查表。如果是为了考试,我建议放弃这几分,去钻研点更有意义的东西。

“51单片机时钟周期”、“机器周期”和“指令周期”如何定义的?
8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。机器周期:在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器...

单片机的一条指令: SJMP $ 是啥意思
即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令,指令码格式为:80H rel(操作码 地址偏移量),这里,80H是SJMP指令的操作码;rel是地址偏移量,在程序中也常采用符号地址,上机运行前才被代真成二进制形式。

单片机中sjmp和ljmp是啥意思啊
…)表示,只有在上机执行前才被汇编(或代真)为16位二进制地址。长转移指令为三字节,双周期指令。上机试试吧!很直观的! For Example: LJMP F886H 注意:在下载的这个8051DEBUG软件中,不支持标号,且程序状态字PSW(Program State Word)中的D0位,即奇偶标志位P,与正确的正好相反,这一点...

51单片机短转移指令是什么?
C51单片机的跳转指令包括LJMP、SJMP、AJMP、JMP和DJNZ等:LJMP指令:长跳转指令,用于将程序跳转到指定的16位地址,指令格式为“LJMP A16”,其中A16表示跳转目标地址。SJMP指令:短跳转指令,用于将程序跳转到相对偏移量的16位地址,指令格式为“SJMP rel”,其中rel表示跳转目标的相对偏移量。AJMP指令:...

MCS-51单片机外接晶振频率6MZH时,它的双周期指令的指令周期是多少?
每个机器周期完成某些规定操作。指令周期:指令周期是指执行一条指令所占用的全部时间,一个指令周期通常含有1~4个机器周期(依指令类型而定)。显然,当震荡频率为12MHz时,一个机器周期为1us;当振荡频率为6MHz时,一个机器周期为2us。具体各指令周期时间见下图:...

相似回答