一种简单精确的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条回答
smithding
1楼-- · 2020-02-11 04:20
有中断来还准么?
llww30402048
2楼-- · 2020-02-11 04:36
 精彩回答 2  元偷偷看……
dengke
3楼-- · 2020-02-11 08:50
llww30402048 发表于 2016-3-19 15:30
调用 __delay_us();,是要用 什么头文件的啊?我这边 报错,编译不通过

定义这语句#define _XTAL_FREQ 12000000就可以
llww30402048
4楼-- · 2020-02-11 14:40
dengke 发表于 2016-3-19 20:54
定义这语句#define _XTAL_FREQ 12000000就可以

我用的是 C18 编译器,这样不行,调用不了 __delay 函数
retome
5楼-- · 2020-02-11 16:43
我试过 用PICC 可以 xc也可以
TUDOU2015
6楼-- · 2020-02-11 17:56
这种方法我在看到帖子后在PIC12F1572中应用了   可以使用,我用的是内部16M晶振   us函数调用的时间是多少没有验证,MS大致是正确的

一周热门 更多>