打印
[51单片机]

串口2中断只执行一部分就不执行了?

[复制链接]
1736|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
austin丁|  楼主 | 2013-11-22 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 austin丁 于 2013-11-22 22:32 编辑

串口2工作在方式三,作为从机去响应主机,并把串口1得到的数据发给主机,可串口二的中断只执行一小段,大为疑惑,还请大家帮我看看程序的问题所在。
#include "12C5A60S2.h"
#include<stdio.h>

#define uchar unsigned char
#define uint unsigned int

#define S2SM2 0x20          //S2CON.5
#define S2REN 0x10          //S2CON.4
#define S2RI  0x01          //S2CON.0
#define S2TI  0x02          //S2CON.1
#define S2RB8 0x04          //S2CON.2
#define S2TB8 0x08          //S2CON.3

#define addr1 0x01

void uart1_init();
void uart2_init();
uchar master2(uchar addr);
void errst();

unsigned int i;
uchar place;
uchar p;
void main()
{
        uart1_init();
        uart2_init();
                p=master2(0x01);
                P0=p;
                place=p;
        while(1);
}

uchar master2(uchar addr)
{
        uchar radr,p=0,rec1;
        SBUF=addr;       //发送地址
        while(TI!=1);    //未发完则等待
                TI=0;
        while(RI!=1);    //等待从机回答
                RI=0;
        radr=SBUF;     //收到从机数据给radr
        if(radr!=addr)
        {
                errst();    //若地址错,发复位信号
                goto next;  //goto只用于函数内部跳转
        }
        else
        {
                SBUF=0xfe;
                while(TI!=1);
                  TI=0;
        }
        while(RI!=1);
                 RI=0;
        rec1=SBUF;
        while(RI!=1);
                 RI=0;
        p=SBUF;
        if(p==rec1)
                {
                        SBUF=0x00;    //校验和相同发00
                        while(TI!=1);
                    TI=0;                        
                }
        else
                {
                  errst();               
                }
                //                TB8=1;        //改为发送地址                        
   next:;
   return p;               
}

void errst()//reset function
{
         SBUF=0xff;
         while(TI!=1);
         TI=0;
}


/*-----串口1初始化-----*/
void uart1_init()  
{
        TMOD=0x20;      //定时器定义为方式2
        TL1=0xfd;
        TH1=0xfd;        //置初值9600波特率
        PCON=0x00;
        TR1=1;           //启动定时器1
        SCON=0xf8;         //串行口为方式3,SM2=TB8=1
}

/*-----串口2初始化-----*/
void uart2_init()  //9600bps@11.0592MHz
{
        AUXR &=0xF7;        //波特率不倍速,S2SMOD=0
        S2CON =0xf0;        //9位数据,可变波特率
        AUXR &=0xFB;        //独立波特率发生器时钟为Fosc/12,BRTx12=0
        BRT =0xFD;                //设定独立波特率发生器重装值
        AUXR |=0x11;        //启动独立波特率发生器,BRTR=1
        EA=1;           //开总中断
        IE2 |=0x01;     //开串口2中断
}

void UART2_INTR() interrupt 8
{
        uchar rec0;
        S2CON &= ~S2RI; //S2RI清零
        IE2 &= ~0x01;   //禁止串口中断
        if(S2BUF!=addr1)
        {
                IE2 |=0x01;  //串行口中断允许位
                goto reti;   //非本机地址,跳出中断,继续监听
        }
        else
                S2CON &=~S2SM2;    //取消监听状态,S2SM2=0
        S2BUF=addr1;     //发送本机地址
        while((S2CON & S2TI)!=1);//判断S2TI是否为1
    S2CON &= ~S2TI;     //S2TI清零
        
        while((S2CON & S2RI)!=1);//判断S2RI是否为1
                S2CON &= ~S2RI; //S2RI清零
        rec0=S2BUF;
        
        if((rec0&0xff)==0xff)
         {
                 S2CON |=0x20;
                 IE2 |=0x01;
                 goto reti;
         }
        do
        {
                S2BUF=place;
                while((S2CON & S2TI)!=1);
      S2CON &= ~S2TI;
         while((S2CON&S2RI)!=1);
                 S2CON &= ~S2RI;
        }while(S2BUF!=0);  //主机接收不正确,重新发送
        S2CON |=0x20;
        IE2 |=0x01;
  reti:;
}

相关帖子

沙发
austin丁|  楼主 | 2013-11-23 19:52 | 只看该作者
问题已解决,将 while((S2CON & S2TI)!=1);改为 while((S2CON & S2TI)!=2即可

使用特权

评论回复
评论
NE5532 2013-11-24 11:14 回复TA
一切奇怪的问题,都是低级错误。现象越奇怪,错误越低级。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

41

帖子

1

粉丝