STC12C5A60S2单片机-双串口通信

来源:互联网 发布:ios11蜂窝数据打不开 编辑:程序博客网 时间:2024/05/08 16:28

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
0 0
原创粉丝点击