基于51单片机的精确延时(微秒级)

上传人:飞****9 文档编号:132100136 上传时间:2020-05-12 格式:PDF 页数:3 大小:49.08KB
返回 下载 相关 举报
基于51单片机的精确延时(微秒级)_第1页
第1页 / 共3页
基于51单片机的精确延时(微秒级)_第2页
第2页 / 共3页
基于51单片机的精确延时(微秒级)_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于51单片机的精确延时(微秒级)》由会员分享,可在线阅读,更多相关《基于51单片机的精确延时(微秒级)(3页珍藏版)》请在金锄头文库上搜索。

1、声明 此文章是基于 51 单片机的微秒级延时函数 采用 12MHz 晶振 此文章共包含 4 个方面 分别是延时 1us 5us 10us 和任意微秒 前三个方面是作者学习 过程中从书本或网络上面总结的 并非本人所作 但是延时任意微秒函数乃作者原创且亲测 无误 欢迎转载 此篇文章是作者为方便初学者使用而写的 水平有限 有误之处还望大家多多指正 作者 Qtel 2012 4 14 QQ 97642651 序 对于某些对时间精度要求较高的程序 用 c 写延时显得有些力不从心 故需用到汇编程序 本人通过测试 总结了 51 的精确延时函数 在 c 语言中嵌入汇编 分享给大家 至于如何在 c 中嵌入汇编大

2、家可以去网上查查 这方面的资料很多 且很简单 以 12MHz 晶振为例 12MHz 晶振的机器周期为 1us 所以 执行一条单周期指令所用时间就是 1us 如 NOP 指令 下 面具体阐述一下 1 若要延时 1us 则可以调用 nop 函数 此函数是一个 c 函数 其相当于一个 NOP 指令 使用时必须包含头文件 intrins h 例如 include include void main void P1 0 x0 nop 延时 1us P1 0 xff 2 延时 5us 则可以写一个 delay 5us 函数 delay 5us pragma asm nop pragma endasm 这就

3、是一个延时 5us 的函数 只需要在需要延时 5us 时调用此函数即可 或许有人会问 只 有一个 NOP 指令 怎么是延时 5us 呢 答案是 在调用此函数时 需要一个调用指令 此指令消耗 2 个周期 即 2us 函数执行完 毕时要返回主调函数 需要一个返回指令 此指令消耗 2 个周期 2us 调用和返回消耗了 2us 2us 4us 然后再加上一个 NOP 指令消耗 1us 不就是 5us 吗 3 延时 10us 我们编写一个 delay 10us 函数 delay 10us pragma asm nop nop nop nop nop nop pragma endasm 这就是延时 10u

4、s 的函数 同延时 5us 函数一样 调用和返回消耗 4us 加上函数中的 6 个 NOP 指令 6us 正好是 10us 4 此时有人不禁要问那么 任意微秒时 函数应该怎么写呢 看我慢慢道来 首先 延时任意微秒我暂时没有想到 但是 我可以延时任意偶数微秒或延时任意奇数微秒 也就是说 需要两个函数 一个函数专门实现任意偶数的微秒级延时 另一个函数专门实现 任意奇数的微秒级延时 只要有了这两个函数在 不就可以延时任意的微秒了吗 首先我们来实现任意偶数的微秒级延时 void delay even us unsigned char even 任意偶数的微秒级延时 pragma asm 1mova r

5、7 为什么要用到 r7 呢 因为 r7 里面装的是函数的参数 这句消耗 1 个周期 2subba 10H 这句看完程序我再解释这句消耗 1 个周期 3movb 02H 这句看完程序我再解释这句消耗 2 个周期 4divab 这句意思是 a b 商放在 a 里 余数放在 b 里 稍 后解释这句消耗 4 个周期 5movr0 a 这句消耗 1 个周期 6nop 这句消耗 1 个周期 7loop 8djnzr0 loop 不等于 0 跳转指令 也就是说 r0 中的值若不为 0 的话 就跳转到 loop 处 这句消耗 2 个周期 pragma endasm 下面我们来分析一下为何这样写 为了方便分析

6、我给句子编上了序号 我们以延时 100us 为例 delay even us 100 首先减去调用和返回的 4 个周期 4us 再减去参数传递所消耗的 2 个周期 因为 c 函数参数传递到汇编是需要消耗周期的 一共消耗了 6 个周期 也就是消 耗了 6us 还剩下 100us 6us 94us 然后再看我再程序上面注释的各语句消耗时间 从 1 句 到 5 句一共消耗了 10 个周期 不信你数数 还剩下 94us 10us 84us 现在就看第 8 句了 这句应该消耗 84 个周期才能达到我们延时 100us 而这句每执行一次消耗 2 个周期 也就 是说 r0 的值应该为 84 2 42 那么

7、怎样达到 r0 42 的呢 我们从第 1 句开始分析 第 1 句中 r7 为 c 传递过来的参数 此例子中为 100 执行完此句后 a 的值为 100 第 2 句中 将 a a 16 100 16 84 此句结束后 a 的值为 84 第 3 句中 给 b 赋值为 2 第 4 句中 用 a 来除以 b 结果商存入 a 中 余数存入 b 中 此句结束后 a 的值为 a a b 84 2 42 第 5 句 将 a 值赋给 r0 此句结束后 r0 的值为 42 于是乎 r0 的值为 42 这个目的达到了 结合前面的分析 此程序是不是延时了 100us 呢 答案当然是 是 了 这个函数可以实现任意偶数微秒 18 的延时的 不信的话可以带一个值进去算的 至于为 什么值必须 18us 用不着我解释了吧 任意奇数的微秒级延时 void delay odd us unsigned char odd pragma asm 1mova r7 2subba 0fH 3movb 02H 4divab 5movr0 a 6loop1 7djnzr0 loop1 pragma endasm 此即为任意奇数微秒的延时 和偶数延时一样的道理 不解释了 此函数的参数必须大于等于 17 请思考为什么

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号