打印

[求助]串行发送时,为什么无法进入定时器0中断函数?

[复制链接]
2952|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kukucat|  楼主 | 2007-8-27 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define    uint    unsigned int
#define    uchar    unsigned char
#define TMAX 122
#define CONT 253          //0xfd
#define NOP _nop_();_nop_();_nop_();
sbit LED=P0^0;

uchar time_flag=0;
/*********************************************************************
* 函 数 名: 延迟模块
* 功能描述:delay_ms(uint x)    延迟1*x毫秒
* 函数说明: delay_100us(uint x) 延迟10*x微秒
* 调用函数:
* 输 入:    uint x
* 返 回:
***********************************************************************/
void delay(uint x)
{
    uchar j;
    while(x--)
    {
        for(j=0;j<TMAX;j++);
    }
}

/*********************************************************************
* 函 数 名: time0()
* 功能描述:定时器0中断
* 返 回:    无
***********************************************************************/
void time0() interrupt 1 using 2
{
    TL0=0xb0;
    TH0=0x3c;
    time_flag++;
    if(time_flag>=10)
        {
            time_flag=0;
            LED=~LED;
        }
    TF0=0;
}
/*********************************************************************
* 函 数 名: init_serialcomm();
* 功能描述:串行初始化
* 函数说明:
***********************************************************************/
void init_serialcomm(void)
{
  SCON=0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
  TMOD=0x20|(TMOD&0x0f);       //TMOD: timer 1, mode 2, 8-bit reload
  PCON=0x00;          //SMOD=0;
  TL1=CONT;        //Baud:9600  fosc=11.0592MHz
  TH1=TL1;
  ES=1;            //Enable Serial Interrupt
  EA=1;
  TR1=1;           // timer 1 run
  // TI=1;
}
/*********************************************************************
* 函 数 名: send_char_com(uchar ch)
* 功能描述:向串口发送一个字符
* 函数说明:
***********************************************************************/
void send_char_com(uchar ch)
{
    TI=0;
    SBUF=ch;
    while(TI==0);
    TI=0;
}
/*********************************************************************
* 函 数 名: 主函数
* 功能描述:send_char_com(uchar ch)中的ch==1,   3,   5,   7,   9,   11
* 函数说明:                              启动 停止  左转 右转 减速 加速
***********************************************************************/
void main(void)
{
    TMOD=0x01;
    TL0=0xb0;
    TH0=0x3c;
    ET0=1;
//    PS=1;
    init_serialcomm();        //TMOD,EA=1,ES=1
    TR0=1;
    LED=1;                    //指示灯-已加上拉
    while(1)
    {

        send_char_com(1);    /*此函数用于测试,当我用此句循环串行发送时,无法进入定时器0中断使LED闪烁(P00已加上拉),在中断函数中加断点无法进入!*/
        delay(100);
        //while(1);                 /*当此句加入时,即做死循环后,能进中断--LED能实现闪烁!
    }
}

//大家帮忙看看,哪里出问题了啊?谢谢各位!

相关帖子

沙发
gjg191| | 2007-8-27 14:40 | 只看该作者

dd

倒塌,你没用串口中断发送 你开串口中断干什么把es=1 屏蔽掉就好了

使用特权

评论回复
板凳
kukucat|  楼主 | 2007-8-27 14:52 | 只看该作者

是啊,没有使用串行中断发送!

    不过这样怎么会和定时器0相关的啊?
    去试试,感谢指教!

使用特权

评论回复
地板
kukucat|  楼主 | 2007-8-27 15:41 | 只看该作者

感谢 gjg191

    关了串行中断ES后,果然就行了,不过我还想问下,为什么不关ES就不行了啊?
而且我试了另中办法,ES=1,但是加入下面的空中断函数:
void serial() interrupt 4 using 1
{
;
}
这样也行的呢,能进入定时0中断函数,这是怎么一回事啊?为什么开串行中断而无中断函数就无法进入其他的中断,是不是由于串行中断和定时0中断是同一优先级,而使定时中断无法嵌套,不过void send_char_com(uchar ch)
函数中我有清TI的啊(TI=0)?望指教!

使用特权

评论回复
5
jxyhome| | 2007-8-27 16:38 | 只看该作者

服了

程序跳转的时候根据的是后面的中断向量号的……没有中断函数怎么跳转……

使用特权

评论回复
6
gjg191| | 2007-8-27 16:49 | 只看该作者

dd

你这样做的结果只有一个导致程序混乱。没有返回函数程序都不知道跑到哪里去了,你加了空的中断函数就有了返回地址,还是多看看汇编好些。

使用特权

评论回复
7
kukucat|  楼主 | 2007-8-27 20:58 | 只看该作者

哈哈,了解了!谢谢各位!又学到了一些知识

使用特权

评论回复
8
zibaihe231| | 2007-8-28 10:04 | 只看该作者

俺还要多学习学习,还没用过串口。

使用特权

评论回复
9
gjg191| | 2007-8-28 10:14 | 只看该作者

dd

妹妹也来了!!

使用特权

评论回复
10
osesemi| | 2011-12-29 14:58 | 只看该作者
:),学了

使用特权

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

本版积分规则

38

主题

206

帖子

0

粉丝