单片机延时delay()函数为什么里面变量填5000却是5000ms而不是500ms

一条语句是一条指令吗,如果是,那一个机器周期是1/12*12个振荡周期*10^-6s,延时函数里5000*110差不多是5*10^5,两个想抵,还有0.5s,也就是500... 一条语句是一条指令吗,如果是,那一个机器周期是1/12*12个振荡周期
*10^-6s,延时函数里5000*110差不多是5*10^5,两个想抵,还有0.5s,也就是500ms,然而实际情况却是5000ms
展开
 我来答
一剑出血
高粉答主

2018-08-12 · 醉心答题,欢迎关注
知道大有可为答主
回答量:5.7万
采纳率:78%
帮助的人:1.7亿
展开全部
“一条语句是一条指令吗”
不一定,取决于编译后的结果。
所以你需要了解一下这个110是怎么回事……了解一下编译后的指令为什么是9个周期……
北京康思
2018-09-20 广告
1、基本功能。市面上的电子负载均有基本的四项功能:恒流、恒压、恒阻和恒功率(安捷伦没有恒功率)。在功能基本相同,精确度相差不大的情况下,怎么判断是否符合要求呢?CHROMA和博计的电子负载只有一套工作电路,就是恒流功能。其他功能是根据欧姆定... 点击进入详情页
本回答由北京康思提供
lycdl
高粉答主

2018-08-12 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:4938万
展开全部
没有具体的延时函数,不知道是多少。那500ms你是怎么计算的?是C语言的程序吗?还是汇编程序?
追问
C语言写的,延时函数嵌套两重for循环,一条执行5000次,另一条执行110次
追答
根据你所说,延时函数应该是这样的:
void delay()
{
unsigned int x,j;
for(x=5000;x>0;x--)
for(j=110;j>0;j--);
}
两条for 循环语句编译后可不是一条指令的。按你的计算,一个机器周期是1us,就内循环一条语句 for(j=110;j>0;j--); 编译后就是这些指令的,
;---- Variable 'j?041' assigned to Register 'R4/R5' ----
MOV R5,#06EH ;1us ,这是j=110; 赋初值
MOV R4,#00H ;1us
;--------------------------
;开始内循环110次,共需要990+2=992us
?C0004: ;循环110次,延时110*9=990us
MOV A,R5 ;1us
DEC R5 ;1us
JNZ ?C0011 ;2us
DEC R4 ;1us
?C0011:
MOV A,R5 ;1us
ORL A,R4 ;1us
JNZ ?C0004 ;2us
内循环就是7条指令,每条后有执行的时间,内循环一共需要9us,加上赋初值 j=110 赋初值 的2 us ,内循环110次,共需992us ,再加上外循环一次的时间,需要11us,可见,外循环一次的实际时间是992us+11us=1003us=1ms。
所以,变量填5000却是5000ms,是对的,这时间已经是很准确了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式