求助,单片机串口全双工

2019-07-15 19:53发布

一个单片机串口同时接收、发送数据,为什么不能实现?程序如下:
#include<reg51.h>
#include"type.h"

uint8 SigNum[100];
int i;

void USART_Init(void)
{
        TMOD = 0x20;//将定时器1设置为方式2,8位自动重装模式
        SCON = 0x50;//串口控制寄存器,使串口工作在方式1,并且接受使能
        PCON = 0x00;//该寄存器第一位为串口波特率倍速控制位,这里不倍速
        TH1 = 0xfd;  //11.0592M晶振,波特率9600
        TL1 = 0xfd;
        TR1 = 1;//开启定时器1
        ES = 1;//开启串口中断
        EA = 1;//开启总中断
}

void Send_Dat(uint8 dat)
{       
        SBUF = dat;
        while(ti==0);
        TI=0;
}

void main()
{
        uint8 a=0;
        USART_Init();
        while(1)
        {         
                   for (i=0;i<100;i++)
        {  
                  SBUF= SigNum[i];
                  
                         while(TI==0);
                 TI=0;
                        }
                i=0;       
        }
}

void USART_INTR() interrupt 4        //串口中断
{
        if(RI)
        {
                RI = 0;
        for(i=0;i<100;i++)
        {       
        SigNum[i]=SBUF;       
                }               
        i=0;
               
          }
}

本人新手,请大神们指教
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
依然落叶飘零
1楼-- · 2019-07-15 23:25
程序只有一半,串口通信不工作多数都是波特率不对。例外串口中断的时候要对发送触发的中断和接收触发的中断都处理。
lifekiller
2楼-- · 2019-07-16 03:31
依然落叶飘零 发表于 2014-5-7 11:27
程序只有一半,串口通信不工作多数都是波特率不对。例外串口中断的时候要对发送触发的中断和接收触发的中断 ...

不好意思,不知道怎么就发了半段,void main(){
        uint8 a=0;
        USART_Init();
        while(1)
        {         
                   for (i=0;i<100;i++)
        {  
                  SBUF= SigNum;
                  
                         while(TI==0);
                 TI=0;
                        }
                i=0;
      }
}
void USART_INTR() interrupt 4        //串口中断
{
        if(RI)
        {
                RI = 0;
        for(i=0;i<100;i++)
        {       
        SigNum=SBUF;        SBUF= SigNum; while(TI==0);
                TI=0;
                }
                       
        i=0;
               
          }
}



依然落叶飘零
3楼-- · 2019-07-16 04:02
本帖最后由 依然落叶飘零 于 2014-5-7 14:06 编辑

你就犯了我说的错误了,串口没有对发送中断处理。你可以在发送函数Send_Dat中把中断关了,或者在中断函数里面加
  1. if(TI )
  2. {
  3.     TI = 0;
  4. }
复制代码
否则TI=1的时候不断触发中断。
lifekiller
4楼-- · 2019-07-16 09:20
依然落叶飘零 发表于 2014-5-7 12:42
你就犯了我说的错误了,串口没有对发送中断处理。你可以在发送函数Send_Dat中把中断关了,或者在中断函数里 ...

谢谢,明白了,我再试试
票源
5楼-- · 2019-07-16 10:53
 精彩回答 2  元偷偷看……

一周热门 更多>