延时1秒子程序

feiyan125 2008-06-06 05:33:44
在汇编语言中,晶振市12MHZ,延时1秒的程序怎么编写的啊?我用循环编写的,不会算。
...全文
5125 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
月光的护城河 2011-05-17
  • 打赏
  • 举报
回复
擦。。。。这么古老的帖子,亏我还给你算。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
月光的护城河 2011-05-17
  • 打赏
  • 举报
回复
延时的时间主要取决于循环体和循环次数,我用的是压栈和出栈的方法,可以查到pushf和popf指令为10个和8个时钟节拍,loop bx为3.4个时钟节拍,而时钟节拍是根据系统的晶振频率来的。。根据你的那就是每个时钟节拍需时间1/12mhz s=0.083333333333333333333333333333333333333333333333333333333333us
先延时一毫秒需次数N=1ms/(21.4*1/12MHZ)=561次
程序如下: mov bx,3E8H
shit: mov cx,231h
fuck: pushf
popf
loop shit
dec bx
jnz fuck
fuck循环1ms hlt

shit循环1000次 你懂得。。。。。。。。。。。。。。

lq334306471 2011-05-17
  • 打赏
  • 举报
回复
什么时代了写51还用汇编?
靠,菜鸟!
FENGREST 2011-05-17
  • 打赏
  • 举报
回复
用的是C51的汇编:
1s=10的6次方us 12MHZ的晶振经过12分频后1us一个机器周期,DJNZ指令是一个双机器周期的循环转移指令,所以让DJNZ执行500000次就可以延时1S了、、、程序如下:

DELAY:MOV R3,#19H ;外层循环25次
TIME: MOV R4,#64H ;中层循环100次
TIME1:MOV R5,#0C8H ;内层循环200次
TIME2:DJNZ R5,TIME2 ;延时0.4ms
DJNZ R4,TIME1 ;延时40ms
DJNZ R3,TIME ;延时1s
RET
END
guilingli 2010-11-30
  • 打赏
  • 举报
回复
调用int 08h中断
longdaogongcheng 2010-11-29
  • 打赏
  • 举报
回复
1000US=1S吗?不要误导人,应该是1000000us=1000ms=1S
汇编延迟0.1秒
应该这样写:
DELAY: MOV R1,#10
DELAY1; MOV R2,#200 ;1机器周期
DELAY2; MOV R3,#248 ;1机器周期
NOP ;1机器周期
DJNZ R3,DELAY2 ;2机器周期
DJNZ R2,DELAY1 ;2机器周期
DJNZ R1,DELAY
RET ;2机器周期

这样才正确
znxllyuan 2010-11-05
  • 打赏
  • 举报
回复
为什么看不懂 难道是单片机
darcys 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 stevenyinc 的回复:]
1000US=1S吗?不要误导人,应该是1000000us=1000ms=1S
汇编延迟0.1秒
DELAY1; MOV R2,#200 ;1机器周期
DELAY2; MOV R3,#248 ;1机器周期
NOP ;1机器周期
DJNZ R3,DELAY2 ;2机器周期
DJNZ R2,DELAY1 ;2机器周期
RET ;2机器周期


机器周期和=(2X24……
[/Quote]
学习了,,过两周就要用到了!!
masmaster 2010-10-27
  • 打赏
  • 举报
回复
利用dos的1AH号中断
liliheqing2016 2010-10-27
  • 打赏
  • 举报
回复
经典,就是这样算的
stevenyinc 2008-07-20
  • 打赏
  • 举报
回复
1000US=1S吗?不要误导人,应该是1000000us=1000ms=1S
汇编延迟0.1秒
DELAY1; MOV R2,#200 ;1机器周期
DELAY2; MOV R3,#248 ;1机器周期
NOP ;1机器周期
DJNZ R3,DELAY2 ;2机器周期
DJNZ R2,DELAY1 ;2机器周期
RET ;2机器周期


机器周期和=(2X248+1+1+2)200+1+2=100003个机器周期
12MHZ下一机器周期时间1us,总时间100003us=100.003ms=0.100003s,
这时间非常精确,
外面看来的自己写的
我自学的C51,如果有错误请指正,
希望能够找到同行互相学习,
QQ:81773291
alan001 2008-07-19
  • 打赏
  • 举报
回复
用定时器,因为有多核技术和预取指令技术/Cache都会影响循环精度
nikko_lo 2008-07-15
  • 打赏
  • 举报
回复
delay1us: ;调用时, 2uS

MOV R2,250 ;1uS
MOV R3,247 ;1uS
LOOP1:DJNZ R3,LOOP1 ;2uS*R3
LOOP2:DJNZ R2,LOOP2 ;2uS*R2
RET ;返回,2uS

计算方法:(@12MHz,8051系列)
2uS+1uS+1uS+2uS*R3+2uS*R2+2uS=1000uS=1S;
song x 2008-07-13
  • 打赏
  • 举报
回复
晶振频率12MHz = 12 * 1000 * 1000 Hz;

一条指令使用1个周期,所以1条指令使用的时间是1/12000000秒;

要用循环延迟1秒,需要循环12000000条指令,相当于执行了12000000条指令使用1秒钟。

希望对你有帮助。
lsg1116 2008-07-12
  • 打赏
  • 举报
回复
用单片机定时中断
用户 昵称 2008-06-07
  • 打赏
  • 举报
回复
这跟汇编没多大关系吧,你要是想从理论上精确,就用定时器。
食人族哲学家 2008-06-07
  • 打赏
  • 举报
回复
单片机?
用中断吧?
hswxf 2008-06-07
  • 打赏
  • 举报
回复
1 晶振12MHZ-->一个计数脉冲周期(一般为这个值的倍频或若干倍,看你系统结构,单片机为1~5,ARM为1/4~5.....)
2 设定计数脉冲个数=1/计算脉冲周期
3 设定初始计数寄存器值为上结论值,为0产生中断(一般如此)
使用端口控制技术(汇编)
*****************
经验法:分二步:
1 写一个程序,测试你的一个延时体程序时间颗粒,如
mov dx,3000
ok1: mov cx,10000
ok:loop ok
dec dx
loop ok1
以上的时间颗粒的程序OK,为你用一般计时器值除3000,这是一个大约的值t.但做1秒精度已经足够

2 设1/t=k(整数)
替换上面的3000值,可以精确到0.1秒(12M晶)

龙凤呈祥焱 2008-06-06
  • 打赏
  • 举报
回复
invoke Sleep 1000
feiyan125 2008-06-06
  • 打赏
  • 举报
回复
有没有汇编的高手呀!
HELP!
加载更多回复(1)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧