查看: 1691|回复: 0
打印 上一主题 下一主题

一种简单精确的pic延时方法

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-15 08:38:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

本帖最后由 dengke 于 2015-7-24 13:09 编辑


写程序缺不了延时函数,记得刚开始学习pic的时候总是自己写for延时函数,可是自己写for延时函数有两个缺点,一是换了晶振以后for语句还得重新计算,调试,非常麻烦,二是他的精确度不高。后来发现其实我们完全不必如此,microchip提供了一种特别好的方法,就是只要宏定义了#define _XTAL_FREQ 12000000(之所以这样写,是因为我用的是12M晶振,12M=1200000,如果用4M晶振的话就写#define _XTAL_FREQ 4000000),就可以调用__delay_us();和__delay_ms();等这些延时函数。(谁说我们pic不好用)
使用方法详情见下面网址(内容已经放在附件中了)
http://wenku.baidu.com/link?url= ... dbqXZJB4phD9REbrkqa
这个是怎么实现的呢?我们可以在编译器手册MPLAB XC8 C Compiler User中的第59页找到下面这段话:

发现了这种方法其实就是循环调用NOP();函数,之所以要宏定义就是为了让编译器知道一个__delay_us(1);对应几个指令周期也就是几个NOP();函数。而这个其实就是编译器的事了。
注:这种方法并不是十分精准的,想要特别精准的延时就需要用到定时器了。当然相对自己写的延时函数也已经是十分准确的了。
不仅xc8编译器支持这种方法,picc编译器也支持。



这种方法为什么能用 百度谷歌都没查到,mplab官网也没特别说明,所以在这水一贴。(当时我一直在pic的芯片手册找原因,以为这个是写进去以后单片机调用定时器啥的,实现的精准延时。后来仔细想想发现自己错了,这个应该是编译器的事,不应该在芯片手册中找,要在编译器手册中找,于是在官网找到MPLAB XC8 C Compiler User这本书,终于发现原因。绕了个的弯路)。转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表