STC12C5A60S2双串口程序。串口1P3.0和P3.1、串口2P1.3和P1.2。

/***********************************************************************
时间:2012.11.24
芯片:STC12C5A60S2
晶振:22.1184MHz  波特率:9600bps
引脚定义:串行口1:发送————TxD/P3.1; 接收———.000—RxD/P3
          串行口2:        发送————TxD2/P1.3;接收————RxD2/P1.2
功能描述:STC12双串口通信(中断方式)
          当串行口1接收数据后,将此数据由串行口2发送出去
          当串行口2接收数据后,将此数据由串行口1发送出去
***********************************************************************/
#include<STC12C5A60S2.h>


#define S2RI 0x01        //串口2接收中断请求标志位
#define S2TI 0x02        //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1=0xaa,temp2=0x55;
/****************串行口初始化函数****************/
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 delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=600;y>0;y--);
}
/*****************主函数******************/
void main(void)
{
    InitUART();        //串行口初始化
        
        while(1)
        {P0=temp2;
//如果串口1接收到数据,将此数据由串口2发送
                if(flag1==1)
                {
                        
                        flag1=0;
                        UART_2SendOneByte(temp1);
                        
                }
                delay(300);
                P0=temp1;
//如果串口2接收到数据,将此数据由串口1发送
                if(flag2==1)
                {
                        
                        flag2=0;
                        UART_1SendOneByte(temp2);
                }
                delay(300);
        }
}
/************串行口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;
        } 
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值