STC12C5A60S2单片机双串口通信,互相发送

STC12C5A60S2单片机双串口通信,互相发送

STC12C5A60S2单片机拥有两个全双工串行通信接口,
串口1的功能及操作与传统51单片机串行相同;
特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,
串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;
而串口2只能使用独立波特率发生器作为波特率发生器。

/*-----------------------------------------------
名称:STC12C5A60S2双串口通信,单片机后缀s2意思就是双串口
内容:9600波特率 双串口收发
接线:串口1 发送P3.1,接收P3.0
     串口2 发送P1.3,接收P1.2
     串口2具体引脚是可修改的。
  STC12CSA60S2系列单片机串行口1对应的硬件部分是TxD/P3.1和RxD/P3.0引脚,串行口2对应的硬件部分是TxD2和RxD2。通过设置特殊功能寄存AUXR1中的S2_P4/AUXR1.4位,串行口2(UART2)功能可以在P1口和P4口之间任意切换。当串行口2功能在P1口实现时,对应的管脚是P1.2/RxD2和P1.3/IxD2。当串行口2功能在P4口实现时,对应的管脚是P4.2/RxD2和P4.3/TxD2。
------------------------------------------------*/

#include"stc12c5a60s2.h"
#include"delay.h"

#define S2RI 0x01   //串口2接收中断中断请求标志位
#define S2TI 0x02   //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
/*------------------------------------------------
                   函数声明
------------------------------------------------*/
//void SendStr(unsigned char *s);
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;       // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;       // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;       // TH1:  重装值 9600 波特率 
                        // 晶振 11.0592MHz  
    TR1   = 1;          // TR1:  timer 1 打开                    
    EA    = 1;           //打开总中断
    ES    = 1;         //打开串口中断
      
    S2CON = 0x50; //串口2工作在方式1  10位异步收发
                  // S2REN=1允许接收
    BRT = 0xFD;    //  9600 
    AUXR = 0x10;  //BRTR=1 独立波特率发生器开始计数
    IE2 =0x01;   //开串口2中断  ES2=1
}                           
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{

  InitUART();
  DelayMs(100);
  uart1SendStr("串口1初始化成功");
  DelayMs(100);
  uart2SendStr("串口2初始化成功");
  while (1)                       
    {
       if(flag1==1)  
        {  
            flag1=0;             
        // uart2SendStr("串口1中断,串口2发送串口1接收的数据:");                               
            uart1SendStr(uart1Receive);
          for(i=0;i<=100;i++)
         {
             uart1Receive[i]=0;
         }
       }  
	     if(flag2==1)  
	     {  
	       flag2=0;   
	     //  uart1SendStr("串口2中断,串口1发送串口2接收的数据:");
	       uart2SendStr(uart2Receive);  
	       for(i=0;i<=100;i++)
	       {  
	            uart2Receive[i]=0;                                                           
	       }
	     }  
    }
}

/*------------------------------------------------
                    1发送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,
                //通过检测是否字符串末尾
  {
  UART_1SendOneByte(*s);
  s++;
  }
}
/*------------------------------------------------
                    2发送字符串
------------------------------------------------*/

void uart2SendStr(unsigned char *s)
{
    while(*s!='\0')    // \0 表示字符串结束标志,
                   //通过检测是否字符串末尾
    {
	  UART_2SendOneByte(*s);
	  s++;
    }
}

void UART_1SendOneByte(unsigned char c)  
{  
    SBUF = c;  
    while(!TI);    //?TI=0,????  
    TI = 0;   
}


/****************串口2发送一个字符****************/  
void UART_2SendOneByte(unsigned char c)  
{  
    S2BUF = c;  
    while(!(S2CON&S2TI));  //?S2TI=0,????  
    S2CON&=~S2TI;     //S2TI=0  
}  
/************串口1中断函数*************/  
void UART_1Interrupt(void) interrupt 4  
{  
    if(RI==1)  
    {  
        RI=0;  
        flag1=1;  
        temp1=SBUF;
                                uart1Receive[point1++]=temp1;
                        if(temp1=='\n')
                        {
                                flag1=1;
                                point1=0;
                        }
                        if(point1==100)
                        {
                                point1=0;
      }
    }  
}  
/************串口2中断函数*************/  
void UART_2Interrupt(void) interrupt 8  
{  
         EA    = 0;                  //打开总中断
    if(S2CON&S2RI)  
    {  
        S2CON&=~S2RI;         
        temp2=S2BUF;
        uart2Receive[point2++]=temp2;
        if(temp2=='\n')
        {
                point2=0;
                flag2=1;
        }
        if(point2==100)
        {
                point2=0;
      }
    }
EA    = 1;                  //打开总中断               
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值