由于是刚接触PIC的单片机,所以需要仔细学习。
一 我所使用的延时方法:
工作需要用到PIC10F200来定时:
1 最初我用的是简单的delay()来实现
但是这种延时不精确,且由于各个PIC10F200芯片的晶振精度存在差异(即使厂家上电校正后,差异始终存在);我在235个芯片上刷相同的程序延时600ms,实际抽样测得延时时间在584~611ms左右不等。
delay(long i)
{
while(i)
i--;
}
2 网友的方法1
程序中加入如下两行,按照网友的方法在程序中添加如下两行,网友的意思是可以精确定时。但我实际运行的结果仍然存在误差,实际运行时间为1.015ms
#define _XTAL_FREQ 4000000
__delay_ms(1);
3 网友的方法2
利用timer0定时
#include
int mydelay_ms(int y) ;
long i ;
int CountOld;
int CountNew;
void main(void)
{
__CONFIG(OSC_IntRC&WDT_OFF&CP_OFF&MCLRE_ON);
OPTION = 0x07; //256倍频
TRIS = 0x09; //GPIO1、GPIO2输出;GPIO0、 GPIO3输入;高四位不可修改,默认为0: 0000,1001
GP2 = 1;
GP1 = 0; //因为 只要MCLR功能开,则内部上拉始终有效;
mydelay_ms(60); //延时60*10ms左右
GP1 = 1;
mydelay_ms(4);//延时40ms左右
GP2 =0;
while(1)
{
GP1=1;
GP2=0;
}
}
int mydelay_ms(int y) //延时 y*10 ms
{
for(i =y;i>0;i--)
{
TMR0 = 0xD9; //延时10ms
CountOld = TMR0;
CountNew = TMR0;
while (CountNew >= CountOld)
{
CountOld = CountNew;
CountNew = TMR0;
}
}
}
//********************************NOTE*************************************************//
//定时时间计算:
// N倍频,周期T,定时t,定时器初值X(TIMER0从 X向上计数,最多记到256,因为它是8位的寄存器)
// N *(256-X)*T =t
// --> X =256 - t/N*T +2
// 其中N 由OPTION的第三位设置,周期默认为1us
// 之所以X后面还要加2,是因为芯片自身存在2个周期的延时
上面程序是我自己写的,通过Stopwatch观察发现:定时时间为604.369ms 和40.338ms
利用K150将程序烧写到芯片后,测试芯片的实际定时时间为600ms,44ms 以及596ms,42ms。说明同一程序在不同PIC芯片上运行的定时时间确实存在差异,也说明了利用定时器确实能较精确地定时。
二 新发现:
1 MPLAB 不接仿真器和芯片也可以直接仿真;
2 MPLAB X IDE V4.2中Stopwatch的位置:
Window-->Debugging-->Stopwatch
二 遗留问题:
1 自己修改OSCCAL的校正参数有何作用?我在程序中加与不加这句似乎对运行结果没什么影响。