×
嵌入式 > 技术百科 > 详情

STC12C5A16S2双串口的使用

发布时间:2020-06-03 发布时间:
|
stc双串口的使用:

MCU:STC15C5A16S2

时钟:11.0592

S2SMOD=1,BRTX12=1;

串口波特率:9600

 

#include
#define uint8 unsigned char
#define uint16 unsigned int

#define Fclk      11059200UL   /*使用22.1184M晶体*/
#define BitRate   9600UL       /*波特率定义为9600*/
#define RELOAD_COUNT   0Xb8

volatile uint8 Buf[4]={0x00,0x00,0x00,0x00};//
volatile uint8 BufBack[4]={0x00,0x00,0x00,0x00};
uint8 Num=4;


void UartInit()
{
     SCON=0X50; //8位可变波特率,无奇偶校验
  TMOD=0X21; //设置定时器1,自动重装数
  TH1=256-Fclk/(BitRate*12*16);  //计算定时器重装值
     TL1=256-Fclk/(BitRate*12*16);
  PCON|=0X80; //波特率加倍
  TR1=1;      //开定时器1
  REN=1;      //允许接收
  ES=1;   // 允许串口1中断
  EA=1;   // 开总中断
}
void UartSendByte(unsigned char i)
{
      ES=0;
   TI=0;
   SBUF=i;
   while(TI==0);
   TI=0;
   ES=1;
}


/********************************************************************
函数功能:串口中断处理。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void UartISR(void) interrupt 4
{
 if(RI)    //收到数据
  {
       if(Num>0)
    {
       Buf[4-Num]=SBUF;
    Num--;
  }
       RI=0;   //清中断请求
  }
}

/********************以上为串口1收发程序***********************/
/********************以下为串口2收发程序***********************/
void UartInit2()
{
     S2CON=0X50;     //8位可变波特率,无奇偶校验
  BRT=RELOAD_COUNT;//波特率发生器装载
  AUXR=0X1c;

  IE2=0X01;         //允许串口2中断
  EA=1;
}


void UartSendByte2(unsigned char i)
{
     uint8 temp=0;
  IE2=0X00;
  S2CON=S2CON&0XFD;
  S2BUF=i;
  do{
       temp=S2CON;
    temp=temp&0x02;
  }while(temp==0);
  S2CON=S2CON&0XFD;
  IE2=0X01;
}

void UartISR2(void) interrupt 8
{
      unsigned char k=0;
   k=S2CON;
   k=k&0X01;
   if(k==1)
   {
         S2CON=S2CON&0XFE;
   if(Num>0)
   {
       BufBack[4-Num]=S2BUF;//
    Num--;
    }
   }
   else
   {
         S2CON=S2CON&0XFD;
   }
}


void main()
{
    UartInit();
 UartInit2();
 //接收电脑发来的数组
 while(Num>0);
 //把接收到的数组发给从机

 UartSendByte2(Buf[0]);
 UartSendByte2(Buf[1]);
 UartSendByte2(Buf[2]);
 UartSendByte2(Buf[3]);

 //接收从机回来的数据
 Num=4;
 while(Num>0);
 //把从机回来的数据发回给电脑 
 UartSendByte(BufBack[0]);
 UartSendByte(BufBack[1]);
 UartSendByte(BufBack[2]);
 UartSendByte(BufBack[3]);
    while(1);
}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
示波器使用时要注意的19个问题