发新帖我要提问
12
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

有朋友能否帮忙看一下PIC12F675定时程序问题

[复制链接]
楼主: xpl129
手机看帖
扫描二维码
随时随地手机跟帖
21
zhouthat| | 2014-7-18 17:21 | 只看该作者 回帖奖励 |倒序浏览
如果烤了程序进去了,上电后GP0有1秒输出(接个LED灯什么的)的话再把T0IE=0,改为T0IE=1,记得PEIE也要置1.打开定时器中断,再看看GP0是否输出连续脉冲。
我一般都是这样调程序的,我也是学了没多久,相互探讨咯~~~

使用特权

评论回复
22
逍遥派掌门| | 2014-7-18 18:15 | 只看该作者
建议使用CCS来写代码吧,简单。

如果楼主只是简单输出高低电平,完全可以不用定时器。

CCS代码如下:

#include <12F675.h>


#define PPY   PIN_A0

#use delay(clock=10000000)     // 根据晶振来改变,和 delay_ms() 有重大关系

void main()
{
    set_tris_a(0xFE);

    while(1)
    {
       output_high(PPY);        // 输出高电平
       delay_ms(1);             // 延时1ms
       output_low(PPY);         // 输出低电平
       delay_ms(999);           // 延时999ms
    }
}

以上所有函数为CCS自带,够简洁吧?

另外,在烧写芯片的时候要注意配置,晶振类型要选择正确。

使用特权

评论回复
23
yklstudent| | 2014-7-19 08:59 | 只看该作者
#include <pic.h>

__CONFIG(HS & WDTDIS & PWRTDIS & MCLREN & BORDIS);

#define true                        1
#define false                        0

#define Enable_AllInt()                        PEIE=1;GIE=1;
#define Disable_AllInt()                PEIE=0;GIE=0;

#ifndef _XTAL_FREQ
#define _XTAL_FREQ                        4000000ul
#endif

volatile bit LED_Port        @ (unsigned)&GPIO*8+0;

typedef struct
{
        unsigned char t0_overflow        :1;
        unsigned char led_status        :1;
        unsigned char direction                :1;
        unsigned char blank                        :5;
}SysStatys_T;

SysStatys_T SysStatus;

extern void Init_Sys(void);
extern void Init_Port(void);
extern void Init_Timer0(void);
extern void Task_Run_Led(void);

void main(void)
{
        unsigned int rti_cnt = 0;
        unsigned int count = 0;
        Init_Sys();
        Enable_AllInt();
        while( true )
        {
                if( SysStatus.t0_overflow )
                {
                        SysStatus.t0_overflow = 0;
                        if( SysStatus.led_status )
                                count = 1;
                        else
                                count = 999;
                        if(rti_cnt >= (count-1))
                        {
                                rti_cnt = 0;
                                Task_Run_Led();
                        }
                        else
                        {
                                rti_cnt++;
                        }
                }
        }
}

void interrupt ISR(void)
{
        if( T0IE && T0IF )
        {
                T0IF = 0;
                TMR0 = 0x85;
                SysStatus.t0_overflow = 1;
        }
}

void Init_Sys(void)
{
        Init_Port();
        Init_Timer0();
}

void Init_Port(void)
{
        TRISIO = 0x00;
        GPIO = 0x00;
}

//1ms interrupt
void Init_Timer0(void)
{
        T0IF = 0;
        T0IE = 1;
        TMR0 = 0x83;
        OPTION = 0b10000010;        //1:8       
}

void Task_Run_Led(void)
{
        SysStatus.led_status ^= 1;
        LED_Port = (SysStatus.led_status)?1:0;
}

使用特权

评论回复
24
Rain_King| | 2014-7-19 09:52 | 只看该作者
都是大神级别的任务啊...............

使用特权

评论回复
25
MOn51| | 2014-7-19 11:11 | 只看该作者
1:软件模拟运行,看是否正确。2:烧片运行。这类片子烧片要注意啊!要用PIC的专用编程器!

使用特权

评论回复
26
dogglove| | 2014-7-19 11:12 | 只看该作者
我觉得大家已经解释的很清楚啦,楼上各位已经给你了一个编写程序,开发过程的一个思路,及例程.你当整理思路,认真研读DATASHEET.

使用特权

评论回复
27
阳光的味道3121| | 2014-7-19 11:42 | 只看该作者
你把你的程序这块调整下
if(count==999)
{
   count=0;
   bFlag=0;
}
if里面更改为if(count>=999)就可以了。
更改后就好了。

使用特权

评论回复
28
zhaor| | 2014-7-19 17:34 | 只看该作者
1ms亮或者暗你是看不出来的。应该加大些,先验证程序下载了,并且能运行。然后再1ms,999ms。

使用特权

评论回复
29
xpl129|  楼主 | 2014-7-20 19:23 | 只看该作者
zhouthat 发表于 2014-7-18 17:21
如果烤了程序进去了,上电后GP0有1秒输出(接个LED灯什么的)的话再把T0IE=0,改为T0IE=1,记得PEIE也要置1 ...

谢谢朋友,我试试

使用特权

评论回复
30
xpl129|  楼主 | 2014-7-20 19:25 | 只看该作者
逍遥派掌门 发表于 2014-7-18 18:15
建议使用CCS来写代码吧,简单。

如果楼主只是简单输出高低电平,完全可以不用定时器。

感谢层主指导:handshake

使用特权

评论回复
31
xpl129|  楼主 | 2014-7-20 19:26 | 只看该作者
yklstudent 发表于 2014-7-19 08:59
#include

__CONFIG(HS & WDTDIS & PWRTDIS & MCLREN & BORDIS);

谢谢朋友

使用特权

评论回复
32
xpl129|  楼主 | 2014-7-20 19:27 | 只看该作者
阳光的味道3121 发表于 2014-7-19 11:42
你把你的程序这块调整下
if(count==999)
{

我试试,朋友

使用特权

评论回复
33
阳光的味道3121| | 2014-7-20 19:40 | 只看该作者
xpl129 发表于 2014-7-20 19:27
我试试,朋友

那个解决了没有?

使用特权

评论回复
34
xpl129|  楼主 | 2014-7-20 19:45 | 只看该作者
阳光的味道3121 发表于 2014-7-20 19:40
那个解决了没有?

没呢,朋友,感觉问题还是出在编译和烧制上,无论程序如何改,单片机都没有信号,所以感觉还是编译和烧纸的问题

使用特权

评论回复
35
逍遥派掌门| | 2014-7-21 12:04 | 只看该作者
本帖最后由 逍遥派掌门 于 2014-7-21 12:07 编辑
xpl129 发表于 2014-7-20 19:25
感谢层主指导

1、用示波器看看有没有输出。

2、用仿真软件proteus来看编程的效果。

3、将亮的时间和暗的时间均分,看看有没有效果。

使用特权

评论回复
36
panchunjiang| | 2014-10-14 22:34 | 只看该作者
我用的汇编,也在用PIC12F675教你个小技术 365495130

使用特权

评论回复
37
十月风城| | 2014-10-15 12:41 | 只看该作者
先测试定时器中断有没有问题,然后再调时间长短。

使用特权

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

本版积分规则