微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12C5A60S2单片机的串行口2数据发发送问题

STC12C5A60S2单片机的串行口2数据发发送问题

时间:10-02 整理:3721RD 点击:

想实现的功能呢就是:使用串口调试助手的文本格式发送字符1,单片机通过串口2接收后验证通过,发送一次数组Str1[5]内5个的字符数据,通过串口调试助手接收查看发送出来的数据。
目前的状态就是:每次复位后发送字符1,接收到一个大写打字母L,别的都没有了,而且每次复位后才能发送出来一个L,否则不管发多少次字符1,都不发出数据。
一下是本人改写的程序:
/*************** 用户定义参数 *****************************/
#define MAIN_Fosc                22118400L        //define main clock
#define Baudrate1                9600                //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
                                                                        //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
#define Baudrate2                9600                //define the baudrate2,
                                                                        //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
#define                BUF_LENTH        128                //定义串口接收缓冲长度
/**********************************************************/
#include        <reg51.h>
sfr AUXR1 = 0xA2;
sfr        AUXR = 0x8E;
sfr S2CON = 0x9A;        //12C5A60S2双串口系列
sfr S2BUF = 0x9B;        //12C5A60S2双串口系列
sfr IE2   = 0xAF;        //STC12C5A60S2系列
sfr BRT   = 0x9C;

unsigned char         uart2_wr;                //写指针
unsigned char         uart2_rd;                //读指针
unsigned char         xdata RX2_Buffer[BUF_LENTH];
bit                B_TI2;

/****************** 编译器自动生成,用户请勿修改 ************************************/
#define T1_TimerReload        (256 - MAIN_Fosc / 192 / Baudrate1)                        //Calculate the timer1 reload value        at 12T mode
#define BRT_Reload                (256 - MAIN_Fosc / 12 / 16 / Baudrate2)                //Calculate BRT reload value
#define        TimeOut1                (28800 / (unsigned long)Baudrate1 + 2)
#define        TimeOut2                (28800 / (unsigned long)Baudrate2 + 2)
#define        TI2                                (S2CON & 0x02) != 0
#define        RI2                                (S2CON & 0x01) != 0
#define        CLR_TI2()                S2CON &= ~0x02
#define        CLR_RI2()                S2CON &= ~0x01
/**********************************************************/
unsigned char addr;
unsigned char Str1[5]={"LFA01"};
/******************** 本地函数声明 ***************/
void        uart2_init(void);
void        UART2_TxByte(unsigned char dat);
void        PrintString2(unsigned char code *puts);
/****************延时函数****************/
void Delay_Ms(unsigned int ms)
{
       unsigned int i;
       while(ms--)
       for(i=0;i<550;i++);
}
/*********从机编号判断和数据发送********/
//如果串口1接收到主机发来的寻址从机编号,才将本从机的数据发送给主机,否则等待
//void Send_Data(void)
//{
//  int i;
////  uchar b;               
//if(addr=='1') //不同的从机,这里必须修改
//  {   
//        for(i=0;i<5;i++)
//           {
//             UART2_TxByte(Str1);
//                 Delay_Ms(10);
//           }
//  }
//         
//}
void        main(void)
{
        int i;
        uart2_rd = 0;
        uart2_wr = 0;
        AUXR1 |= (1<<4);        //将UART2从P1口切换到 RXD2--P1.2切换到P4.2   TXD2---P1.3切换到P4.3
        
        uart2_init();
        
        while(1)
        {
//                if(addr=='1')
//                {
//                        for(i=0;i<5;i++)
//                        {
//                         UART2_TxByte(str);
//                         Delay_Ms(5);
//                        }
//                }

        }
}

void        UART2_TxByte(unsigned char dat)
{
        B_TI2 = 0;
        S2BUF = dat;
        while(!B_TI2);
        B_TI2 = 0;
}

void PrintString2(unsigned char code *puts)                //发送一串字符串
{
    for (; *puts != 0;        puts++)  UART2_TxByte(*puts);         //遇到停止符0结束
}

/**********************************************/
void        uart2_init(void)
{
        AUXR |=  (1 << 3);                //串口2波特率加倍
        S2CON  = (S2CON & 0x3f) | (1<<6);        //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率
        S2CON |= 1 << 4;                //允许串2接收
        AUXR |=  1 << 4;        //baudrate use BRT
        BRT = BRT_Reload;
        IE2 |=  1;                        //允许串口2中断
        //本来在uart1_init(void)中有定义,只是用串口2时必须有以下两条才行
        ES  = 1;
        EA = 1;
}
/**********************************************/
void UART2_RCV (void) interrupt 8
{        int a;
        int i;
        if(RI2)
        {
                CLR_RI2();
                a=S2BUF;
                addr=a;
        }
               
if(addr=='1') //不同的从机,这里必须修改
  {   
        for(i=0;i<5;i++)
           {
             UART2_TxByte(Str1);
                 Delay_Ms(10);
           }
  }
        if(TI2)
        {
                CLR_TI2();
                B_TI2 = 1;
        }
}


把这以下语在主函数的while(1)中接触屏蔽,发送一次1后就一直能收到单片机发出的数据,没有任何问题,换一个字符发送给单片机后才停止,再发1,单片机仍然能持续发送数据,但是只要是放到串口中断或是写到子函数中,在中断中调用,就每次复位只能发送一次,且只发一个L
if(addr=='1')
    {                       for(i=0;i<5;i++)
                       {
                         UART2_TxByte(str);
                         Delay_Ms(5);
                        }
                }

UART2_TxByte();这个函数不行吧,试试print那个函数

tainanle      啊                               啊                       啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

因为放在中断里,发送了L之后,写标志位没有清零哦!

这句CLR_TI2();就是写标志位清零吧,我这样写   
for(i=0;i<5;i++)
{
UART2_TxByte(str);
CLR_TI2();
Delay_Ms(5);
}
还是一样的效果,请问有什么好的办法能详细给我讲讲做么做吗?

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

网站地图

Top