微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC单片机串口通信问题/独立波特率发生器,每次文件烧录后数据显示都不一样

STC单片机串口通信问题/独立波特率发生器,每次文件烧录后数据显示都不一样

时间:10-02 整理:3721RD 点击:
//----------------------------------------------------------------------------------------------- 串口初始化
void UARTInit(void)                                                                                                                                                                                                                                                                                                                                //@11.0592MHz
{
        SCON=0X50;
        WAKE_CLKO |= 0x40;
        BRT = 0xFD;                                                                                                                                                                                                                                                                                                                                                        //设置定时初值
        AUXR |= 0x11;                                                                                                                                                                                                                                                                                                                                                //定时器时钟12T模式
        ES=1;                                                                                                                                                                                                                                                                                                                                                                                //串口中断打开
}
void UART(void) interrupt 4 using 3
{
//        uint8 dat;
        ES=0;                                                                                                                                                                                                                                                                                                                                                        //关串口中断,防止中断的嵌套
        if(TI)                                                                                                                                                                                                                                                                                                                                                //如果是串口1发送中断(TI)不进行处理
        {
                TI=0;                                                                                                                                                                                                                                                                                                                                                                  //TI清0
                busy=0;                                                                                                                                                                                                                                                                                                                                  //传送标识复位
        }
        if(RI)
        {
                RI = 0;                                                                                                                                                                                                                                                                                                                                                          //RI清0
                CmdWord=SBUF;
//                dat = SBUF;
//                CmdWord=dat;
                ReceiveFlag=1;
                Send_Dat(CmdWord);
        }        
        ES=1;                                                                                                                                                                                                                                                                                                                                                                                //开启串口中断
}
结果是:乱码



给你一个串口初始化的函数吧 ,你那个好像不全。
void init_uart(void)                //115200bps@11.0592MHz
{
    PCON&=0x7F;
        SCON = 0x50;   
        AUXR |= 0x40;
        AUXR &=0xFE;
        TMOD &= 0x0F;
        TMOD |= 0x21;
        TH1 =TL1 = 0xFD;          //0.000558S
        TH0 =0Xfd;
        TH0 =0Xc0;
        ET1 =0;
        TR0 =1;
        TR1 =1;
        ET0 =1;
       
}

谢谢,如果用独立波特率发生器该怎么初始化呢?我用t0显示,t1发脉冲控制电机,独立发生器做通信

还有,为什么我烧录一次源程序(程序不变),结果数据会变?

给你改一下
void UARTInit(void)    //@11.0592MHz                                                                                                                                                                                                                                                                                                                        
{
        TMOD=0X20;         //定时器1工作模式
        TH1=0XFD;         //timer high 1
        TL1=0XFD;         //timer low  1
        TR1=1;             //定时器T1的运行控制位
        SCON=0X50;         //串行控制寄存器
        EA=1;                //CPU的总中断允许控制位
        ES=1;                //串行口中断允许位                                                                                                                                                                                                                                                                                                                                                                            //串口中断打开
}
void UART(void) interrupt 4 using 3
{
//  uint8 dat;
    ES=0;              //关串口中断,防止中断的嵌套
        RI=0;        //接收中断请求标志位清0
        CmdWord=SBUF;//获取SBUF接收到的数据
//  dat = SBUF;
//  CmdWord=dat;
        ReceiveFlag=1;
        Send_Dat(CmdWord);
  
        SBUF=CmdWord;//把收到的数据发送回去
        while(!TI);         //等待发送中断请求标志位为1
        TI=0;                 //发送中断请求标志位清0
        ES=1;              //开串口中断
}

独立波特率发生器只有12和11系列才有,系列没有,用stc软件直接生成就可以了

void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xFB;                //独立波特率发生器时钟为Fosc/12,即12T
        BRT = 0xFD;                //设定独立波特率发生器重装值
        AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
        AUXR |= 0x10;                //启动独立波特率发生器
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top