1. 程式人生 > >STC12C5A60S2微控制器-雙串列埠通訊

STC12C5A60S2微控制器-雙串列埠通訊

STC12C5A60S2微控制器是一款功能比較強大的微控制器,它擁有兩個全雙工序列通訊介面,串列埠1的功能及操作與傳統51微控制器序列口相同;特殊的是STC12C5A60S2微控制器內部有一個獨立波特率發生器,串列埠1可以使用定時器1作為波特率發生器,也可以使用獨立波特率發生器作為波特率發生器;而串列埠2只能使用獨立波特率發生器作為波特率發生器。

晶片:STC12C5A60S2

晶振:22.1184MHz      波特率:9600bps
C


引腳定義:序列口1:    傳送————TxD/P3.1; 接收————RxD/P3.0
      序列口2:    傳送————TxD2/P1.3;接收————RxD2/P1.2
功能描述:STC12雙串列埠通訊(中斷方式)
          當序列口1接收資料後,將此資料由序列口2傳送出去
          當序列口2接收資料後,將此資料由序列口1傳送出去

***********************************************************************/


#include<12C5A60S2.h>
#define S2RI 0x01    //串列埠2接收中斷請求標誌位
#define S2TI 0x02    //串列埠2傳送中斷請求標誌位
unsigned char flag1,flag2,temp1,temp2;
/****************序列口初始化函式****************/
void InitUART(void)
{
    TMOD = 0x20;    //定時器1工作在方式2  8位自動重灌
    SCON = 0x50;    //串列埠1工作在方式1  10位非同步收發 REN=1允許接收
    TH1 = 0xFA;       //定時器1初值
    TL1 = TH1;
    TR1 = 1;       //定時器1開始計數
    EA =1;    //開總中斷
    ES =1;    //開串列埠1中斷

    S2CON = 0x50;   //串列埠2工作在方式1  10位非同步收發 S2REN=1允許接收
    BRT = 0xFA;       //獨立波特率發生器初值
    AUXR = 0x10;    //BRTR=1 獨立波特率發生器開始計數
    IE2 =0x01;    //開串列埠2中斷  ES2=1
}
/****************序列口1傳送****************/
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
}
/*****************主函式******************/
void main(void)
{
        InitUART();    //序列口初始化
while(1)
{
//如果串列埠1接收到資料,將此資料由串列埠2傳送
if(flag1==1)
{
flag1=0;
UART_2SendOneByte(temp1);
}
//如果串列埠2接收到資料,將此資料由串列埠1傳送
if(flag2==1)
{
flag2=0;
UART_1SendOneByte(temp2);
}
}
}
/************序列口1中斷處理函式*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
}
}
/************序列口2中斷處理函式*************/
void UART_2Interrupt(void) interrupt 8
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
}

}

PS: 原文來自 http://www.51hei.com/mcu/1729.html