单片机学习小组
直播中

李晓婷

7年用户 176经验值
私信 关注

pic程序延时函数宏定义后就能使用__delay_us();和__delay_ms();的方法分享!

写程序缺不了延时函数,microchip提供了一种特别好的方法,就是只要宏定义了#define _XTAL_FREQ 12000000(之所以这样写,是因为我用的是12M晶振,12M=1200000),就可以调用__delay_us();和__delay_ms();等这些延时函数。
使用方法详情见下面网址
http://wenku.baidu.com/link?url= ... dbqXZJB4phD9REbrkqa

但是这是怎么实现的呢?之前一直是不求甚解,学长教给我们这样用就这样用,而且学长说这个十分准确,用了很长时间,也不知道是怎么实现的,百度谷歌都没查到,mplab官网也没特别说明,无奈只能自己找了。
之前一直在芯片手册找,以为这个是写进去以后单片机调用定时器啥的,实现的精准延时。后来仔细想想发现自己错了,这个应该是编译器的事,不应该在芯片手册中找,要在编译器手册中找,于是在官网找到MPLAB XC8 C Compiler User这本书,终于发现原因。
在手册的第59页终于发现下面这段话:
p59   发现了自己之前的两个错误:①这种方法并不是十分精准的,想要特别精准的延时需要定时器。当然也已经十分准确了。
②这种方法其实就是调用NOP();函数,根本没用到定时器啥的,之所以要宏定义就是为了让编译器知道一个__delay_us(1);对应几个指令周期也就是几个NOP();函数。而这个其实就是编译器的事了。




终于解决了,虽然没有太大用,但是还是心情大好。分享出来,因为没人写过这么简单的问题,看来以后还得多看看手册。

回帖(10)

王琴

2019-9-30 07:19:37
谢谢分享。。。
举报

娄莉莉

2019-9-30 07:28:37
钻研精神,佩服  ,我时常也是这样郁闷
举报

鲁瑶

2019-9-30 07:35:44
就是指令周期!不可能很准确,除非你把中断关闭!
举报

谭齐慧

2019-9-30 07:53:50
这个和中断有什么关系?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分