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

PIC定时闪烁问题

[复制链接]
907|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
解博|  楼主 | 2014-12-13 11:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 解博 于 2014-12-13 11:10 编辑

我的单片机型号是PIC12F629,我写的LED1 LED2闪烁程序,怎么好像定时器没有工作呀。

#include "pic.h"


__CONFIG(0x3194);//INTOSC震荡4MHZ, GP4,GP5 IO输入/出

//符号变量替换
#define  u8           unsigned char
#define  u16          unsigned int
#define  u32    unsigned long int

#define  LED1          GP1//指示灯1  红灯
#define  LED2          GP2//指示灯2  黄灯
#define  RST         GP0//复位按键
#define  KEY1        GP4//按键1
#define  KEY2   GP5//按键2

#define  WEEPROMT 200//30000  //记录时间间隔 默认5 = 30000/6000 分钟,减小一下这个值就可以加快速度

#define  Month6          6//51840         // 6个月=51840*5分钟;                 
#define  Month8          8//69120         // 8个月=619200*5分钟;
#define  Month10  10//86400  // 10个月=86400*5分钟;
#define  Month12  12//103680 // 12个月=103680*5分钟;

u16 Timer1IntCount = 0;        //定时器1中断计数
u8  SetTime = 0;                //设定指示时间
u32 RunTime = 0;                //运行时间
u8  RunTimeL8 = 0;                //运行时间低8位
u8  RunTimeM8 = 0;                //运行时间中8位
u8  RunTimeH8 = 0;                //运行时间高8位

void InitIO(void)
{        
        CMCON        = 0X07;//比较器关闭
        TRISIO        = 0x39;//GP0,GP3,GP4,GP5口设为输入;GP1,GP2设为输出
        GPIO        = 0x3f;//初始化所有IO为1
}

void InitTimer1(void)//10ms定时,定时时间S=(65536-(TMR1H:TMR1L))*4/FOSC(4MHZ);
{        
        TMR1H = 0xd8;//
          TMR1L = 0xf0;

        TMR1IF        = 0;     //清中断标志位        
        TMR1IE         = 1;     //中断允许位
        PEIE         = 1;     //开启外设中断
        GIE                = 1;         //开全局中断

        T1CON = 0x01;//16位计数器,不分频FOSC(4MHZ)/4,启动定时器1
}




void Delay(void)
{
        u8 i;
        for(i = 0;i < 200;i ++);
}


void interrupt ISR(void) //中断服务程序
{
        if(TMR1IF)//10ms
        {
                TMR1IF = 0;
                TMR1H = 0xd8;//重装初始值
                  TMR1L = 0xf0;
                Timer1IntCount ++;
        }        
}

void ReadSet(void)//读设置
{                                                                                                                //NO1  NO2
        if(KEY1 == 1 && KEY2 == 1)                        SetTime = 6;        //OFF  OFF
        else if(KEY1 == 0 && KEY2 == 1)                SetTime = 8;        //ON   OFF
        else if(KEY1 == 1 && KEY2 == 0)                SetTime = 10;        //OFF  ON
        else if(KEY1 == 0 && KEY2 == 0)                SetTime = 12;        //ON   ON
        if(RST == 0)//按下复位键清零计数
        {


        }
        
}


void main(void)
{
        InitIO();//初始化IO
        InitTimer1();//初始化定时器1
        


        while(1)
        {
           if(Timer1IntCount<300)//300*10ms=3S
        {
          LED1=1;
          LED2=1;
        }
      
       if((Timer1IntCount>300)&&(Timer1IntCount<600))
         {
          LED1=0;
          LED2=0;
         }

       if(Timer1IntCount>600)
         {
           Timer1IntCount=0;
         }

        }
        
}

QQ图片20141213110858.jpg (38.41 KB )

QQ图片20141213110858.jpg

QQ图片20141213110842.jpg (86.21 KB )

QQ图片20141213110842.jpg
沙发
解博|  楼主 | 2014-12-13 11:11 | 只看该作者
PIC12F629我不设计外围复位电路,可以吗?

使用特权

评论回复
板凳
yklstudent| | 2014-12-13 11:18 | 只看该作者
这种基础最好别搞硬件了

使用特权

评论回复
地板
NE5532| | 2014-12-13 22:56 | 只看该作者
3楼说得有点打击人了,不过按楼主的基础,步子确实太大了一点,建议读《程序调试黑宝书》,从基础开始研究。

使用特权

评论回复
5
宋业科| | 2014-12-14 11:15 | 只看该作者
不会吧,我没学过编程,看着手册花了两天的时间也写了一段代码,调试不通过,第2天改了下也过了。

使用特权

评论回复
6
hwt1990114| | 2014-12-14 20:51 | 只看该作者
单片机的最小系统你好像没有搭好吧

使用特权

评论回复
7
解博|  楼主 | 2014-12-14 23:04 | 只看该作者
我之前没用过PIC而已,这是第一次用,楼上没几个好好回答的,别没事打击别人。有本事解决问题

使用特权

评论回复
8
岳达| | 2014-12-30 15:59 | 只看该作者
解博 发表于 2014-12-13 11:11
PIC12F629我不设计外围复位电路,可以吗?

仿真的话 应该可以

使用特权

评论回复
9
suguibin02| | 2014-12-30 23:52 | 只看该作者
:

使用特权

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

本版积分规则

24

主题

147

帖子

2

粉丝