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

2020-02-10 09:00发布

本帖最后由 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页找到下面这段话:
(OQD0CVR9QY)8M`T7$LW`(2.png (316.1 KB, 下载次数: 1) 下载附件 p59 2015-7-24 12:57 上传
发现了这种方法其实就是循环调用NOP();函数,之所以要宏定义就是为了让编译器知道一个__delay_us(1);对应几个指令周期也就是几个NOP();函数。而这个其实就是编译器的事了。
注:这种方法并不是十分精准的,想要特别精准的延时就需要用到定时器了。当然相对自己写的延时函数也已经是十分准确的了。
不仅xc8编译器支持这种方法,picc编译器也支持。



这种方法为什么能用 百度谷歌都没查到,mplab官网也没特别说明,所以在这水一贴。(当时我一直在pic的芯片手册找原因,以为这个是写进去以后单片机调用定时器啥的,实现的精准延时。后来仔细想想发现自己错了,这个应该是编译器的事,不应该在芯片手册中找,要在编译器手册中找,于是在官网找到MPLAB XC8 C Compiler User这本书,终于发现原因。绕了个的弯路)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
21条回答
K7toubleaz
2020-02-12 02:36
Microchip 有些程式碼改用狀態機的方式運作,雖然裡面是用Timer去做延時,不過適合延時比較長時間,時間短的還是樓主方法好__delay_us(1);很方便 ,XC8會編譯錯誤的注意一下 _ _ 是兩個底線,這之前我常出錯。

一周热门 更多>