打印
[STC单片机]

定时器中断问题

[复制链接]
1060|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
圣灵枫|  楼主 | 2015-5-6 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,最近我做一个简单的上位机程序,串口一直向外发送一串数据,同时,上位机如果接收到数据则点亮P25,P36为灭,数据不需要保存,判断接收到即可。数据接收到后打开定时器,如果过1S没有接收到数据,则熄灭P25,点亮P36。现在的问题是如果定时器中断函数不加,通信发送与接收都是正常的,加了定时器中断函数,整个程序都不运行了,不能发送了,也检测不到接收,第一次做定时器中断嵌套,不知道是什么问题,大家帮我看看,谢谢了。下面附程序:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
sbit P25=P2^5;
sbit P36=P3^6;
unsigned char i=0;
unsigned char code tab[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
/*****************************************************************************
                                  初始化
*****************************************************************************/
void UART_INIT(void)
{
  SCON=0x50;                         //工作方式1,接收使能
  TMOD|=0x21;                //定时器1,工作方式2,定时器0,工作方式1
  AUXR&=0x3F;                         //定时器0,1时钟为Fosc/12,即12T
  AUXR&=0xFE;                         //串口1选择定时器1为波特率发生器
  PCON&=0x7F;                         //波特率不加倍
  TH1=0xF0;                  //波特率2400,时钟频率14.7456MHz
  TL1=0xF0;
  TH0=0XD0;                  //定时长度10ms
  TL0=0X00;
  TR0=0;                     //定时器0关,数据接收完毕使能
  TR1=1;                     //定时器1使能
  PS=1;                      //串口中断设为高优先级
  EA=1;                      //打开总中断
  ET0=1;                     //打开定时器0中断
  ET1=0;                     //关定时器1中断
  ES=1;                      //打开串口中断
}
/*****************************************************************************
                                 软件延时1ms
*****************************************************************************/
void delay_1ms(unsigned int t)
{
  unsigned int a,b;
  for(a=0;a<t;a++);
  for(b=0;b<1167;b++);
}
/*****************************************************************************
                                  发送子函数
*****************************************************************************/
void sendchar(unsigned char ch)
{
  SBUF=ch;
  while(!TI);
  TI=0;
}
/*****************************************************************************
                                  主函数
*****************************************************************************/
void mian(void)
{
  unsigned char s;
  delay_1ms(100);                              //上电延时
  UART_INIT();
  while(1)
    {
          for(s=0;s<10;s++)
            {
          sendchar(tab[s]);
          delay_1ms(100);
            }
    }
}
/*****************************************************************************
                                  串口接收中断函数
*****************************************************************************/
void UART_Rountine(void) interrupt 4
{
  if(RI)
    {
      RI=0;
          i=0;
          P25=0;                                  //灯亮
          P36=1;                                  //灯灭
    }
  TR0=1;                                      //打开定时器
}
/*****************************************************************************
                                  定时器中断函数
*****************************************************************************/
void Timer0_Rountine(void) interrupt 1
{
  TH0=0XD0;             //定时长度10ms
  TL0=0X00;
  i++;                  //计数加1
  if(i>=100)            //超过1S没有进入接收中断
    {
      i=0;              //计数清零
          TR0=0;            //关定时器
          P25=1;            //灯灭
      P36=0;            //灯亮
    }
}

相关帖子

沙发
wx-share| | 2015-5-6 10:59 | 只看该作者
不是定时中断问题,应该是延时时间太长了,还没有再发送数据时,又进入定时中断了

使用特权

评论回复
板凳
wx-share| | 2015-5-6 11:01 | 只看该作者
你也可以用单步跟踪一下,就可以找到问题所在了

使用特权

评论回复
地板
ayb_ice| | 2015-5-6 16:54 | 只看该作者
发送字符时要关串口中断,发完再开,

使用特权

评论回复
5
圣灵枫|  楼主 | 2015-5-7 09:50 | 只看该作者
wx-share 发表于 2015-5-6 11:01
你也可以用单步跟踪一下,就可以找到问题所在了

单步跟踪正常 但实际我用灯来检测发送状态时 发现根本没有数据

使用特权

评论回复
6
圣灵枫|  楼主 | 2015-5-7 09:54 | 只看该作者
ayb_ice 发表于 2015-5-6 16:54
发送字符时要关串口中断,发完再开,

我这个不能关啊,关中断是在主循环外面发送一串字符,然后再开,我这个要求得上电之后单片机一直循环发送,永远不停的。

使用特权

评论回复
7
ayb_ice| | 2015-5-7 11:30 | 只看该作者
圣灵枫 发表于 2015-5-7 09:54
我这个不能关啊,关中断是在主循环外面发送一串字符,然后再开,我这个要求得上电之后单片机一直循环发送 ...

你中断都开了,发送居然还在用查询方式,一发完就进入中断程序了,请问会产生什么问题

使用特权

评论回复
8
简单是福112233| | 2015-5-9 09:03 | 只看该作者
你可以用单步跟踪

使用特权

评论回复
9
ningling_21| | 2015-5-9 09:19 | 只看该作者
圣灵枫 发表于 2015-5-7 09:54
我这个不能关啊,关中断是在主循环外面发送一串字符,然后再开,我这个要求得上电之后单片机一直循环发送 ...

不关串口中断就陷入死循环了

使用特权

评论回复
10
圣灵枫|  楼主 | 2015-5-9 17:17 | 只看该作者
ayb_ice 发表于 2015-5-7 11:30
你中断都开了,发送居然还在用查询方式,一发完就进入中断程序了,请问会产生什么问题 ...

我有研究了一天,你说的这个确实是对的,要关中断,不然可能会死循环,但是之前我调试时发送接收居然是正常的,就没考虑。现在还是那个问题,加了定时器中断函数之后,整个程序就不运行了,什么原因,我是在接收到数据之后才开的定时器,如果我外部不给它发送数据,那定时器永远不会开,主函数发送应该没有影响才对啊,不知道我这样理解对不对。

使用特权

评论回复
11
圣灵枫|  楼主 | 2015-5-9 17:18 | 只看该作者
ningling_21 发表于 2015-5-9 09:19
不关串口中断就陷入死循环了

恩 对 我关了中断了,但还是不行,加了定时器中断函数整个程序就不运行了,不加时都正常的,我又研究了一天,还是没进展

使用特权

评论回复
12
ningling_21| | 2015-5-9 17:52 | 只看该作者
圣灵枫 发表于 2015-5-9 17:18
恩 对 我关了中断了,但还是不行,加了定时器中断函数整个程序就不运行了,不加时都正常的,我又研究了一 ...

试试提高串口中断优先级

使用特权

评论回复
13
ayb_ice| | 2015-5-11 08:02 | 只看该作者
圣灵枫 发表于 2015-5-9 17:17
我有研究了一天,你说的这个确实是对的,要关中断,不然可能会死循环,但是之前我调试时发送接收居然是正 ...

不是死机,应该是循环一次时间很长了

使用特权

评论回复
14
ayb_ice| | 2015-5-11 08:10 | 只看该作者
理论上这样应该是可以的

#pragma disable
void sendchar(unsigned char ch)
{
        SBUF=ch;
        while(!TI);
        TI=0;
}

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝