• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

定时器1闪个灯也这么难?

追梦的阿土哥 2016-06-20 浏览量:1472
最近碰到一个有趣的问题,想用PIC16F1828的定时器1来简单的记个时,到时间后让一个小灯翻转亮起来,现在问题就出现在这个小灯上~#include
__CONFIG(0x0182);
__CONFIG(0x38ff);
#define uint unsigned int
#define uchar unsigned char
#define LED1 RC0
#define LED2 RC5
#define LED_TRI TRISC=0x00

void interrupt tmer1(void);

char data1,data0,data2;

void main()
{
LED_TRI; //设灯的管脚为输出模式
GIE=1; //开总中断
PEIE=1; //开外部中断

TMR1IE=1; //开定时器1中断
TMR1GIE=0; //关定时器1门控中断
TMR1IF=0; //清除定时器1标志位
TMR1GIF=0;
TMR1H=0x3C;
TMR1L=0xAF;
T1CON=0x01; //开定时器1
T1GCON=0x00;

data1=0;
LED2=1;

while(1);
}

void interrupt tmer1(void)
{
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0x3C;
TMR1L=0xAF;
data1++;

if(data1==0x28)
{
data1=0;
data2++;
LED1=!LED1;
LED2=!LED2;
}
}
}


现在的现象是到时间后,LED2能正常的翻转闪烁,但是LED1却不能,感觉就是执行到那里后,直接跳过去了。LED1单独测试时没有问题的,如果把LED2放到while(1)里面翻转闪烁,LED1在中断里也是能正常的闪烁,真是奇了怪了,管脚的配置都没有问题,就是不能亮~
希望大神来解释一下这种现象。
3 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 本帖最后由 SingleYork 于 2016-6-20 20:32 编辑

    帮你找了下原因,应该是你没认真看数据手册,PORTC口(RC0)也复用了AD,而RC5没有复用AD:




    如果不设置ANSEL的话,PORTC口默认是AD输入。而你只是把TRISC全设为输出,但ANSEL的默认设置还是让PORTC口是AD输入状态。注意要把ANSEL的相关位清零。这应该是问题的关键,也是所有初学PIC单片机的人常犯的一个毛病,就是没认真看数据手册,没注意IO口的特性。



    申明一下,本菜本身是不会用这款单片机的,也是帮你找了下资料,分析了下,可能是这个原因,具体还得楼主自己多看手册,试下看是不是这个原因,呵呵……希望能帮到楼主……


    • 发布于 2016-06-20
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:12
  • 本帖最后由 LiuYang 于 2016-6-20 15:26 编辑

    根据描述的现象,怀疑是不是程序跑飞了,默认LED2是0,然后程序赋值LED2变成1才亮的。LED1没有操作所以没有变化,也就是说TIMER的中断没有起作用。设置断点跟踪一下就知道了。
    • 发布于2016-06-20
    • 举报
    • 评论 0
    • 1
    • 0

  • LiuYang 发表于 2016-6-20 15:19
    根据描述的现象,怀疑是不是程序跑飞了,默认LED2是0,然后程序赋值LED2变成1才亮的。LED1没有操作所以没有 ...

    我觉得不是跑飞了,LED2是能正常翻转闪烁的,而且通过PIC Kit3的debug模式是可以看到进入了中断的~
    • 发布于2016-06-20
    • 举报
    • 评论 0
    • 1
    • 0

  • SingleYork 发表于 2016-6-20 20:07
    帮你找了下原因,应该是你没认真看数据手册,PORTC口(RC0)也复用了AD,而RC5没有复用AD:



    把ANSELC设为0x00后,RC0确实是可以正常的翻转闪烁了,但是为啥同时开几个LED的时候,LED1才能正常工作,而且:
    • 发布于2016-06-20
    • 举报
    • 评论 0
    • 1
    • 0

  • 楼主在实践中碰到了挺多有意思的问题啊,支持一下~
    • 发布于2016-06-21
    • 举报
    • 评论 0
    • 1
    • 0

  • 追梦的阿土哥 发表于 2016-6-20 20:59
    把ANSELC设为0x00后,RC0确实是可以正常的翻转闪烁了,但是为啥同时开几个LED的时候,LED1才能正常工作, ...

    没用过这款单片机,不敢乱评论,楼主仔细看下手册吧,呵呵……
    • 发布于2016-06-22
    • 举报
    • 评论 0
    • 1
    • 0

  • 查了下手册, 楼主可以试试将LED1=!LED1改成LATC^=0x01试试~
    • 发布于2016-06-24
    • 举报
    • 评论 0
    • 1
    • 0

  • 在电子发烧友里面也看到了楼主的这个帖子;P
    • 发布于2016-06-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 支持一下,期待大神的解答~
    • 发布于2016-06-21
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

定时器1闪个灯也这么难?