完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
我们想实现一个定时延时函数,在单片机里并没有什么sleep,需要我们自己实现。
延时函数跟 晶振频率 有很大的关系,因为晶振频率影响程序执行速度。 1、打开Keil 4 - Target Options - Target - Xtal(MHz) -里填写 你单片机 的晶振频率,如我的单片机晶振频率是 11.0592 就填 11.0592 2、创建c文件,编写函数 void Delay_Us(INT16U us) { while(us--); } 3、在main函数里调用它 Delay_Us(1); Delay_Us(2); Delay_Us(3); Delay_Us(100); _nop_(); 4、编译,然后Ctrl + F5 Debug运行,在每次Delay_Us 位置记录当前时间 依次记录到_nop_(); 最后停止debug,计算Delay_Us(2) - Delay_Us(1) 的时间,这个时间也就是Delay_Us(1)的执行时间,也可以认为是进入Delay_Us函数所占用的时间(函数跳转 、返回都需要时间的,while(1--) 其实没执行while循环),我这里结果是27.13微秒(Us) 然后计算Delay_Us(3) - Delay_Us(2)的时间,也就是Delay_Us(2)的执行时间,我这里是 36.89, 用36.89-27.13 =9.76 ,这个9.76 就是while 循环1次所需要的时间 。 接下来,而是推算Delay_Us(100) - Delay_Us(3),也就是 Delay_Us(3)的执行时间: 9.76 *2 + 27.13 = 46.65 , 9.76 *2也就是while执行两次循环所需要的时间 + 1次 函数进入、执行 、返回占用的时间 = 总执行时间,这个46.65和46.66基本吻合,我这里不知道为什么误差0.01 us ,不过问题不大,可以接受。 同理,我也可以计算 Delay_Us(100) 执行时间: 9.76 * 99 + 27.13 = 993.37 5、在做DS18B20温度传感器,我们初始化需要拉低控制总线480us毫秒以上,那么Delay_Us参数该如何填写呢? (480 - 27.13) / 9.76 = 47(向上取整,不要取46,拉低480us是 最低值,不能少,所以要向上取整) ,需要47次while循环 ,另外+1次 进入函数、执行、跳转的时间 47 + 1 = 48 , Delay_Us(48)就刚刚够了! 反向算下对不对: 47 *9.76 + 27.13 = 485.85us。 保险起见,我可以多写点50 也行 我看有些人和我同样的开发板 和晶振 需要 Delay_Us(75)才够 拉低480us,可能跟我这里设置了: Option Target - Target - Memory Model - Large:variables in XDATA 有关系。 |
|
|
|
只有小组成员才能发言,加入小组>>
2557 浏览 0 评论
1158浏览 2评论
761浏览 1评论
514浏览 0评论
271浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 04:25 , Processed in 1.699047 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号