tzsteel 发表于 2014-10-30 10:21:01

pic12f509 i/o口操作问题

本帖最后由 tzsteel 于 2014-10-30 10:24 编辑

#include"pic12f509.h"
#include<htc.h>

//__CONFIG(0x02);//(WDT_OFF & MCLRE_OFF & OSC_IntRC );
__CONFIG(0x0a);//(WDT_OFF & MCLRE_OFF & OSC_IntRC );
/******************引脚***************/

#define LED1 GP4
#define LED2 GP2
       
void Delay1000Ms()
{
        unsigned int i,j;

        for(i=0;i<150;i++)
        {
                //btn_press();                //按键检测
                for(j=0;j<550;j++);
        }
}


main()
{
    //GPWUF = 0;    //清除唤醒标志
    OPTION=0x07;
    TRIS=0x08;
    GPIO=0x08;
        //Delay10Ms();
        while(1)
        {
   //LED1 = 0;
   //LED2 = 0;
   Delay1000Ms();
   //LED1=1;
   //LED2=1;
   LED1=~LED1;
   LED2=~LED2;
    }
}   以上程序是能实现LED1,LED2大约1秒,输出高电平,再过一秒输出低电平,但如果把LED1=~LED1; LED2=~LED2;换成 LED1 = 0;LED2 = 0;Delay1000Ms();LED1=1;LED2=1;那就会出现LED1,LED2一直为低的情况,不知是啥原因,照理软件里有LED1=1;LED2=1;的,所以LED1,LED2应该会变高电的,但一直是低电,请大虾帮忙看看,谢谢。

yjbin 发表于 2014-10-30 10:44:53

本帖最后由 yjbin 于 2014-10-30 20:47 编辑

   输出1后又马上输出0 了,当然你看不到了,除非你眼睛能看到几个uS的显示。。
加上延时就可以了。   
while(1)
      {
   LED1 = 0;
   LED2 = 0;
   Delay1000Ms();
   LED1=1;
   LED2=1;
   Delay1000Ms();

    }

tzsteel 发表于 2014-10-30 14:24:32

yjbin 发表于 2014-10-30 10:44
输出1后又马上输出0 了,当然你看不到了,除非你眼睛能看到几个MS的显示。。
加上延时就可以了。   
w ...

谢谢,楼上的,问题已搞定。另外请问一下PIC12F509的定时器,
main()
{
    OPTION=0x00;
    TRIS=0x08;
   TMR0=0x00;
        while(1)
        {
      if(TMR0==0xFF)
      {
         LED1=~LED1;
         LED2=~LED2;
       }
    }
}

请问一下,TMR0=0X00;是不是定时器的初值等于0?那如果预分频是PS<000>(1:2),内部RC4MHZ,那if(TMR0==0xFF)的运行时间,应该就是1US*2*256US+2US= 514US,但用示波器实测,LED1的波型是2.2ms,总的脉宽3.6ms,相差很大,请问一下,TMR0的初值是咋样计算的?谢谢.比如要生成一个125US的,TMR0要是多少?

yjbin 发表于 2014-10-30 20:36:12

本帖最后由 yjbin 于 2014-10-30 20:37 编辑

0xc8
给你一个工具:http://blog.sina.com.cn/s/blog_64ddebbc0101gq2v.html

yjbin 发表于 2014-10-30 20:49:39

定时器初值的计算方法:
http://blog.sina.com.cn/s/blog_64ddebbc0101gszv.html

tzsteel 发表于 2014-10-31 10:11:35

yjbin 发表于 2014-10-30 20:36
0xc8
给你一个工具:http://blog.sina.com.cn/s/blog_64ddebbc0101gq2v.html

谢谢,很不错的软件,但发现   if(TMR0==0xFF)
                                          {
                                              LED1=!LED1;
                                          }
上面的if语句,会增加延时,而且是相差很大.看来PIC12F509的定时器只能用在精度没要求的地方.

jufr12315 发表于 2014-10-31 10:30:35

用内部RC振荡器,精度不够的

jyrpxj 发表于 2014-10-31 10:34:59

楼主是新手吗,用PIC

tzsteel 发表于 2014-11-3 15:07:21

jufr12315 发表于 2014-10-31 10:30
用内部RC振荡器,精度不够的

应该不是内部RC的误差,PIC12F509的内部RC应该是+/3%以内的,现在是差很多,因为PIC12F509没专门的定时器中断,加了 if(TMR0==0xFF)
                                                                                                                                                               {
                                                                                                                                                                   LED1=!LED1;
                                                                                                                                                                  }
可能是会使判断TMR0,与实际的有误差。

jufr12315 发表于 2014-11-3 17:02:14

tzsteel 发表于 2014-11-3 15:07
应该不是内部RC的误差,PIC12F509的内部RC应该是+/3%以内的,现在是差很多,因为PIC12F509没专门的定时器中 ...

这个也有影响,之前用12f683内部RC振荡器,定时器测试输出方波,误差好大

tzsteel 发表于 2014-11-4 13:13:11

jufr12315 发表于 2014-11-3 17:02
这个也有影响,之前用12f683内部RC振荡器,定时器测试输出方波,误差好大

目前已找到问题,发现用计数用125,250等的,测出来就比较准,其它的不行,计数用125US,实测出来就是140US,计数用250US,实测出来就是275US,这些误差应该也是if(TMR0==0xFF) 引起的。
                                                                                                                                                                                                                                          {
                                                                                                                                                                                                                                           TMR0=0x85;
                                                                                                                                                                                                                                          LED1=!LED1;
                                                                                                                                                                                                                                           }
真觉的PIC12F509,是颗垃圾的MCU,定时器都弄不准,那还算啥MCU啊?

jufr12315 发表于 2014-11-4 14:07:40

tzsteel 发表于 2014-11-4 13:13
目前已找到问题,发现用计数用125,250等的,测出来就比较准,其它的不行,计数用125US,实测出来就是140 ...

{:titter:} 很老的芯片了
页: [1]
查看完整版本: pic12f509 i/o口操作问题