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

关于PIC16单片机的定时器1的问题

[复制链接]
1392|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布丁奶茶|  楼主 | 2016-4-8 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想用定时器1设置两个定时时间,分别是1s和10s,并且这两个时间分别对应两个时间,但是为什么在主程序的死循环里处理这两个时间就出错

程序如下:
#include <pic.h>           //调用PIC16F87XA单片机的头文件

__CONFIG(HS&WDTDIS&LVPDIS);

#define uchar unsigned char
#define uint unsigned int

#define LED PORTD
char counter1=0;
char counter2=0;
int 1s_flag=0;
int  10s_flag=0;
void timer1_int();
void interrupt ISR();


void timer1_init(void)
{
OPTION=0x31;
TMR1H=0xFB;  //设置10ms
TMR1L=0x1E;
TMR1IF =0;
GIE=1;
PEIE=1;
TMR1IE=1;
}

void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{
   
    TRISD=0X00;//初始化RD7-RD0为输出方向
    LED=0X00;
    timer1_init();
   
    while(1)               //死循环,单片机初始化后,将一直运行这个死循环
    {
      if(1s_flag==1)
      {
        事件1;
    }
     else if(10s_flag==1)
  {
    事件2;
  }
}


void interrupt ISR(void)
{
  if(TMR1IF==1)
  {
   counter++;
   TMR1H=0xFB;
   TMR1L=0x1E;
   TMR1IF=0;
   if(counter==100)
   {
    1s_flag=1;
    counter1=0;
   
   if(counter2==10)
   {
    10s_flag=1;
     counter2=0;
   }
  }

求指教啊?
沙发
布丁奶茶|  楼主 | 2016-4-8 16:21 | 只看该作者
我就是想问一般这种问题是怎么处理的呢?我现在是用了两个全局变量,通过判断这两个全局变量的值,但是不知道哪里不对

使用特权

评论回复
板凳
JY-DX-JY| | 2016-4-8 16:57 | 只看该作者
你的程序有大问题啊
void interrupt ISR(void)
{
  if(TMR1IF==1)
  {
   counter++;
   TMR1H=0xFB;
   TMR1L=0x1E;
   TMR1IF=0;
   if(counter==100)
   {
    1s_flag=1;
    counter=0;
   counter2++;
   if(counter2==10)
   {
    10s_flag=1;
     counter2=0;
   }
  }

使用特权

评论回复
地板
布丁奶茶|  楼主 | 2016-4-8 17:10 | 只看该作者
JY-DX-JY 发表于 2016-4-8 16:57
你的程序有大问题啊
void interrupt ISR(void)
{

哪里有问题?

使用特权

评论回复
5
JY-DX-JY| | 2016-4-8 17:13 | 只看该作者
我都给你改好了呀。我给你回的帖子和你的代码不一样。
你counter没有清零。清的是counter1
counter2没有自加

使用特权

评论回复
6
布丁奶茶|  楼主 | 2016-4-8 17:20 | 只看该作者
之前可能我程序贴的有问题,再贴一遍
#include <pic.h>           //调用PIC16F87XA单片机的头文件

//实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
__CONFIG(HS&WDTDIS&LVPDIS);

#define uchar unsigned char
#define uint unsigned int

#define LED PORTD
char counter1=0;
char counter2=0;
int 1s_flag=0;
int 10s_flag=0;

void timer1_int();
void interrupt ISR();

void timer1_init(void)
{
OPTION=0x31;
TMR1H=0xFB;
TMR1L=0x1E;
TMR1IF =0;
GIE=1;
PEIE=1;
TMR1IE=1;
}


void main(void)            
{
   
//        TRISD=0X00;//初始化RD7-RD0为输出方向
//    LED=0X00;
    timer1_init();
    while(1)               
    {
     if(1s_flag==1)
     {事件1
      if(10S_flag==1)
      {事件2}
     }
    }
}


void interrupt ISR(void)
{
  if(TMR1IF==1)
  {
   counter++;
   TMR1H=0xFB;
   TMR1L=0x1E;
   TMR1IF=0;
   if(counter1==100)
   {
    1s_flag=1;
    counter1=0;
    if(counter2==10)
     {
     10s_flag=1;
     counter2=0;
    }
  }
}
}

使用特权

评论回复
7
阿飞507| | 2016-4-8 17:24 | 只看该作者
你的1s_flag,和10s_flag,在第一次定时到1S和和10s后被置1后就一直是1的,就回一直执行那两个事件的,你要分别在两个事件结束后将变量清零。

使用特权

评论回复
8
布丁奶茶|  楼主 | 2016-4-8 17:26 | 只看该作者
阿飞507 发表于 2016-4-8 17:24
你的1s_flag,和10s_flag,在第一次定时到1S和和10s后被置1后就一直是1的,就回一直执行那两个事件的,你要 ...

我的意思是我的这种处理方法有问题吗?

使用特权

评论回复
9
布丁奶茶|  楼主 | 2016-4-8 17:26 | 只看该作者
JY-DX-JY 发表于 2016-4-8 17:13
我都给你改好了呀。我给你回的帖子和你的代码不一样。
你counter没有清零。清的是counter1
counter2没有自 ...

谢谢你啊,不过这些是因为我开始程序贴的时候贴乱了,不是这些问题

使用特权

评论回复
10
JY-DX-JY| | 2016-4-8 17:30 | 只看该作者
布丁奶茶 发表于 2016-4-8 17:26
谢谢你啊,不过这些是因为我开始程序贴的时候贴乱了,不是这些问题

你还没有说你在主程序里处理的时候到底有什么错。

使用特权

评论回复
11
阿飞507| | 2016-4-8 17:36 | 只看该作者
没理解你的意思,你的程序counter1和conter2一直就是0,怎么会进入到你的事件1和2里面去呢?你现在出现的是什么问题,想问的是什么?说清楚一点

使用特权

评论回复
12
Latin_newday| | 2016-4-8 21:22 | 只看该作者
看来都没明白到底有啥问题!

使用特权

评论回复
13
洛理小子| | 2016-4-8 22:25 | 只看该作者
楼主可以把问题说的更清楚一些~~

使用特权

评论回复
14
布丁奶茶|  楼主 | 2016-4-9 09:39 | 只看该作者
阿飞507 发表于 2016-4-8 17:36
没理解你的意思,你的程序counter1和conter2一直就是0,怎么会进入到你的事件1和2里面去呢?你现在出现的是 ...

你的意思是我的counter1和counter2不能在中断里置0?

使用特权

评论回复
15
布丁奶茶|  楼主 | 2016-4-9 09:45 | 只看该作者
JY-DX-JY 发表于 2016-4-8 17:30
你还没有说你在主程序里处理的时候到底有什么错。

是我编译的时候,提示出现语法错误,指向if(1s_flag==1)这里

使用特权

评论回复
16
JY-DX-JY| | 2016-4-9 09:51 | 只看该作者
你换个变量名,比如不用数字开头的。

使用特权

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

本版积分规则

44

主题

180

帖子

1

粉丝