Rayne_Hwang 发表于 2014-7-3 15:25:08

向各位请教一个51串口通信的问题

本帖最后由 Rayne_Hwang 于 2014-7-3 15:26 编辑

【型号】:STC89C51RC
【编译环境】:Keil uv4
【问题】:主程序就一个任务,不停地向串口发送字符a。主要是为了测试串口中断有没有问题。结果现在如果在主程序开中断,每次复位之后输出2个a就死机了。关闭ES之后一切正常.
                麻烦各位帮我看看串口中断有没有问题。
void    UART_Init()
{   
    TMOD = 0x20;       //定时器T1为8位自动重载模式, 用于产生波特率
    SCON = 0x50;       //串口工作方式1,允许接收。相当于这三句:SM0=0; SM1=1; REN=1;
    TH1 = 0xfd;
    TL1 =0xfd;       //设定T1初值
    PCON = 0x00;       //波特率不倍增
    EA = 1;       //使能总中断
    ES = 1;       //使能串口中断
    TR1 = 1;       //启动定时器T1
}

void UART_PutByte(UINT8 c)
{
    SBUF = c;
    while(!TI);       // 等待数据发送结束(TI==1代表发送结束)
    TI = 0;       // 清除发送结束标志
}
void UART_ISR(void) interrupt 4
{
   if(RI)       //对于接收中断
   {   
         RI = 0;       //清中断
         RxData = SBUF;       //将本次数据存入RxData
         if(RxPtr<RX_BUF_LEN) RxBuf = SBUF;        //将本次数据追加存入RxBuf[]
      }
else       //对于发送中断,不作处理
   {
         TI = 0;
   }
}

//变量定义:

static xdata volatile unsigned char RxData = 0;
static xdata volatile unsigned char RxBuf = {0};
Static xdata volatile unsigned char RxPtr = 0;
//主程序
void main()
{
   UART_Init();
   while(1)
   {   
          UART_PutByte('a');
   }   
}

takashiki 发表于 2014-7-3 15:31:21

从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗

qlb1234 发表于 2014-7-3 15:41:00

本帖最后由 qlb1234 于 2014-7-3 15:42 编辑

关闭ES之后一切正常
那是不是說明中斷有某箇地方在搗亂?

else         //对于发送中断,不作处理
   {
         TI = 0;
   }
不是說不作處理嗎?怎麼會有代碼?

void UART_PutByte(UINT8 c)
{
    SBUF = c;
    while(!TI);         // 等待数据发送结束(TI==1代表发送结束)
    TI = 0;         // 清除发送结束标志
}

1. 發送中,TI == 0。
2. 發送完,產生中斷,並且TI = 1。
3. 中斷中,TI = 0。
4. while(!TI),卡住了吧?

Rayne_Hwang 发表于 2014-7-3 15:44:38

takashiki 发表于 2014-7-3 15:31
从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗 ...

是想查询发送来着

Rayne_Hwang 发表于 2014-7-3 15:45:49

qlb1234 发表于 2014-7-3 15:41
那是不是說明中斷有某箇地方在搗亂?




好的,我改改试试。刚刚学完微机原理,虽说卷面成绩不错,一到做东西脑子还是有点昏啊

lgg88 发表于 2014-7-3 15:45:49

采用中断的话,一般只要把值传送给SBUF就好了 ,其他的去掉
页: [1]
查看完整版本: 向各位请教一个51串口通信的问题