一种简单精确的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这本书,终于发现原因。绕了个的弯路)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
pangbin4
1楼-- · 2020-02-10 11:39
学习,回家下载,谢谢你的总结
zhuxm
2楼-- · 2020-02-10 16:46
凑个热闹,发个中文版的。 MPLAB XC8 C编译器用户指南.pdf (6.38 MB, 下载次数: 93) 2015-8-1 23:45 上传 点击文件名下载附件
chenliangliang_
3楼-- · 2020-02-10 17:35
 精彩回答 2  元偷偷看……
dengke
4楼-- · 2020-02-10 18:34
zhuxm 发表于 2015-8-1 23:45
凑个热闹,发个中文版的。

哈哈,谢谢。
dengke
5楼-- · 2020-02-10 22:09
chenliangliang_ 发表于 2015-8-2 01:05
AVR也是一样的,更准些

搜嘎,没用过AVR    0.0
yoursnemo
6楼-- · 2020-02-11 00:05
用这种方法,如果大延时,里边是否有加清看门狗指令?

一周热门 更多>