打印
[PIC®/AVR®/dsPIC®产品]

PIC10F200的8位单片机

[复制链接]
2530|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szyonggui|  楼主 | 2016-2-3 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问现在想用PIC10F200的8位单片机做一个小玩意,需要用到里面的定时器,定时1S,但看完手册发现居然没有中断标志位,各位大神,如果没有中断标志位,要这个定时器怎么用啊?
沙发
yewuyi| | 2016-2-4 08:22 | 只看该作者
通过比较定时器数值的前后两次状态即可以实现。

方法如下:
1、读取定时器计数值并保存到变量CountOld
2、再次读取定时器计数值并保存到变量CountNew
3、比较CountOld和CountNew大小并同时将CountNew赋给CountOld,如果比较结果CountNew小于CountOld,,表示定时器发生了溢出,此时定时中断标志位被置1 .

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
szyonggui + 2 赞一个!
板凳
JY-DX-JY| | 2016-2-4 09:22 | 只看该作者
学习了。

使用特权

评论回复
地板
szyonggui|  楼主 | 2016-2-19 12:53 | 只看该作者
#include<pic.h>
#include<pic10f200.h>
#define uchar unsigned char
#define uint unsigned int
#define Led GP0
#define Switch  GP1
//#define Beep   GP2
#define Sensor   GP3
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config CP = ON          // Code Protect (Code protection on)
#pragma config MCLRE = OFF      // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)

uchar disturb,count,count02;
int count01;

void LED(uchar i)
{
   if(i==0)
          {
               Led=0;//GP0 ON
           }
     else
          {
               Led=1;//GPO OFF
            }
}

void init()
{
    //WDTE=0;
     TRIS=0X08;//??GP0/1/2???;GP3 ???  
    FOSC4=0;//??GP2??Fosc/4????
    OPTION=0X02;//choose the 16 bits
   // GPIO=0X0F;
    GP2=0;
    disturb=1;//bit for the time control
    count=0;
    TMR0=0;
    count01=0;
}
void main()
{
    init();
    while(1)
    {
      
    if((Sensor==0)&&(disturb==1))
    {
         if(TMR0==255)//3.5mS
        {
            count++;
            TMR0=0;
            if(count==48)//100ms delete the false trigger
            {
                count=0;
                GP2=~GP2;
                if(Sensor==0)
                {
                    Switch=~Switch;
                    disturb=0;
                    //LED(Switch);//GP0 on/off by Switch
                   //PWM* 100ms*3 10%
                  uchar i;
                     for(i=3;i>0;i--)
                        {
                          while(1)
                         {
                               if(TMR0==255)
                                {
                                 TMR0=0;
                                 count++;
         
                                 }
                             if(count>3&&count<48)//BEEP OFF
                                {
                                   GP2=1;
                                 }
                                else//BEEP ON
                                 {
                                    GP2=0;
                                 }
                                if(count==48)
                                 {
                                     count=0;
                                     GP2=0;
                                     break;
                                  }
                            }
                        }
                     //PWM
                }
            }
           
        }
     }
    else
    {
       // SLEEP();
       count=0;
      // GP2=0;
    }

    if(disturb==0)
    {
      /*  if(TMR0=255)
        {
            TMR0=0;  
            count01++;
         
             if(count01==1)//
            {
                 TMR0=0;
                 count02++;
                 if(TMR0=255)
                 {
                   if(count02==2)
                   {
                       TMR0=0;
                        count02=0;
                        count01=0;
                        disturb=1;
                        Led=~Led;
                   }
                 }
             }
        }
       *///delay 1.5s
        
        if(TMR0=255)
        {
            TMR0=0;  
            count01++;
             if(count01==25470)//0.7S delay to disable the sensor(32730)
             {
                  count01=0;
                  disturb=1;
                  Led=~Led;
             }
        }
    }
     //SLEEP();
    }
      
}

使用特权

评论回复
5
szyonggui|  楼主 | 2016-2-19 12:58 | 只看该作者
yewuyi 发表于 2016-2-4 08:22
通过比较定时器数值的前后两次状态即可以实现。

方法如下:

谢谢,后面我查询了下定时器的用法,跟你说的差不多;
----现在我需要控制产品在按键触发300ms后进入睡眠模式,1s后,按键再次触发才有效;
--- 我现在用定时器控制时间和产生PWM的波形,但进入睡眠模式后,定时器就没用了,所以想用看门狗来定时,比如1S后唤醒,发现看门狗的标志位(nTO)不起作用???
----这个标志位我在百度查的,PIC12F的可以用,没见过有人用在PIC10F的。
请问你在PIC10F使用过看门狗定时吗

使用特权

评论回复
6
szyonggui|  楼主 | 2016-2-19 13:09 | 只看该作者
#include<pic.h>
#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator
#pragma config WDTE = ON        // Watchdog Timer (WDT enabled)
#pragma config CP = OFF         // Code Protect (Code protection off)
#pragma config MCLRE = OFF      // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)
#define uchar unsigned char
#define uint unsigned int
#define LED1 GP0
#define LED2 GP1
#define KEY  GP3
bit   KEY_F;
uchar  count;
//uchar  GP3_F;
void Init()
{
   TRIS=0x08;  //GP3???????
    OPTION=0x1D; // ???????? ?????  ???????????18Ms*64=1.152S

}
void  main()
{  
Init();   
while(1)
{
    if((GPWUF==1)&&(KEY==0))   //?????????
   {
     LED2=~LED2;
     KEY=1;
   }
  
    if(nTO==0)      //????????
   {
      
      LED1=~LED1;
      KEY=0;
   }
         KEY_F=KEY;   //???????????
         SLEEP();
    }
}

使用特权

评论回复
7
szyonggui|  楼主 | 2016-2-23 08:50 | 只看该作者
顶。。。

使用特权

评论回复
8
szyonggui|  楼主 | 2016-2-23 08:57 | 只看该作者
谢谢,后面我查询了下定时器的用法,跟你说的差不多;
----现在我需要控制产品在按键触发300ms后进入睡眠模式,1s后,按键再次触发才有效;
--- 我现在用定时器控制时间和产生PWM的波形,但进入睡眠模式后,定时器就没用了,所以想用看门狗来定时,比如1S后唤醒,发现看门狗的标志位(nTO)不起作用???
----这个标志位我在百度查的,PIC12F的可以用,没见过有人用在PIC10F的。
请问你在PIC10F使用过看门狗定时吗

使用特权

评论回复
9
hayppy| | 2016-4-28 10:23 | 只看该作者

楼主,10F200 定时器你调好了吗?跟其它51单片机差别很大,看这个芯片资料没有定时器启动控制位,Timer0是上电就开始了吗?

使用特权

评论回复
10
lyjian| | 2016-4-28 12:35 | 只看该作者
hayppy 发表于 2016-4-28 10:23
楼主,10F200 定时器你调好了吗?跟其它51单片机差别很大,看这个芯片资料没有定时器启动控制位,Timer0 ...

使用特权

评论回复
11
szyonggui|  楼主 | 2016-5-4 09:54 | 只看该作者
hayppy 发表于 2016-4-28 10:23
楼主,10F200 定时器你调好了吗?跟其它51单片机差别很大,看这个芯片资料没有定时器启动控制位,Timer0 ...

我调试好了,应该是一上电后,你去定义TMR0后就开始运行了,执行SLEEP();语句就不会运行了。。而且定时器运行时,芯片的损耗电流会增大很多,所以做低功耗的时候要注意

使用特权

评论回复
12
ZIWU| | 2016-8-31 00:38 | 只看该作者
可以做呼吸灯吗

使用特权

评论回复
13
mcumail| | 2016-8-31 08:19 | 只看该作者
学习了,感谢分享。

使用特权

评论回复
14
michaellengleng| | 2016-10-8 18:17 | 只看该作者
找我们就没错

使用特权

评论回复
15
meng210515| | 2016-11-18 19:29 | 只看该作者
老芯片了,怎么连个完整的例程都不好找!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

194

帖子

2

粉丝