功能描述

使用STC8H单片机的串口2进行收发通讯。

注意:要和外部设备通信,stc单片机最好用外部晶振,内部IRC时钟波特率不准,无法正常通信。

接线说明:

STC8A单片机-->USB转TTL&电源模块

P10-->UTXD

P11-->URXD

注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ

程序源码


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

接线说明:         1:STC8A单片机-->USB转TTL&电源模块
						   P10-->UTXD       
                           P11-->URXD
                  
                  
注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ                                                                                                                                                                  
***************************************************************************************/


#include "STC8.H"
#include "intrins.h"


#define MAIN_Fosc                11059200L        //定义主时钟
#define  uint32   unsigned long
#define  uint16   unsigned int  
#define  uint8    unsigned char
#define  uchar    unsigned char  



/*************        本地变量声明        **************/
#define  TRUE    1
#define  FALSE   0

#define Buf_Max 50
#define S2_S 0x01       
#define S2RI 0x01
#define S2TI 0x02

volatile uint8 Flag=FALSE;

uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;
                 


bit busy;

uchar table2[3]={0x04,0x04,0x04};          //串口2循环发送指令
uchar rec2[14];                         //接收数组
uchar rec1[14];



/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{  
        uint16 j,i;   
        for(j=0;j<x;j++)   
        {   
                for(i=0;i<1100;i++);   
        }  
}



/***************************************************************************
* 描  述 : 串口2初始化函数
* 入  参 : 无
* 返回值 : 无
备注:波特率9600bps   晶振11.0592MHz
**************************************************************************/
void Uart2_Init(void)
{       
        S2CON = 0x50;                //8位数据,可变波特率,启动串行接收器       
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                    //设定定时初值
        T2H = 0xFE;         //设定定时初值
        AUXR |= 0x10;       //启动定时器2
        IE2 |= 0x01;        // 串口2中断打开
        EA = 1;             // 总中断打开
}




/***************************************************************************
* 描  述 : 串口1初始化函数
* 入  参 : 无
* 返回值 : 无
备注:波特率9600bps   晶振11.0592MHz
**************************************************************************/
void Uart1_Init(void)
{               
        PCON &= 0x3f;                //波特率不倍速,串行口工作方式由SM0、SM1决定
        SCON = 0x50;                //8位数据,可变波特率,启动串行接收器
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0f;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xDC;                    //设定定时初值
        TH1 = 0xDC;                    //设定定时器重装值
        ET1 = 0;                    //禁止定时器1中断
        TR1 = 1;                    //启动定时器1
        ES = 1;             // 串口1中断打开
        EA = 1;             // 总中断打开
}


/***************************************************************************
* 描  述 : 串口2发送数据函数
* 入  参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart2()
{
    S2BUF =table2[3] ;            //写数据到UART数据寄存器
	while(!(S2CON&S2TI));        //在停止位没有发送时,S2TI为0即一直等待
    S2CON&=~S2TI;                //清除S2CON寄存器对应S2TI位(该位必须软件清零)
}

/**************************************************************************************
* 描  述 : USART2接收到数据后串口发送出去
* 入  参 : 无
* 返回值 : 无
**************************************************************************************/
void USART2_Tx_Puts(void)
{
        if(Flag)      //有新数据通过串口被接收到
        {
            IE2 &= 0xFE;                           // 串口2中断关闭       
            rec1[14]=rec2[14];                       
            IE2 |= 0x01;                           // 串口2中断打开                                                                                                       
            Flag=FALSE;                            //清除接收标识符
        }
}

/***************************************************************************
* 描  述 : 串口1发送数据函数
* 入  参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart1(void)
{
    rec1[14]=S2BUF ;                 //写数据到UART数据寄存器
        while(TI == 0);             //在停止位没有发送时,TI为0即一直等待
        TI = 0;                     //清除TI位(该位必须软件清零)
}


/**************************************************************************************
* 描  述 : USART1接收到数据后串口发送出去
* 入  参 : 无
* 返回值 : 无
**************************************************************************************/
void USART1_Tx_Puts(void)
{
          if(Flag)                //有新数据通过串口被接收到
        {       
                ES = 0;                                             //串口1中断关闭                  
            SendDataByUart1();                 //发送字符                                                
                ES = 1;                                  //串口1中断打开                       
                Flag=FALSE;                       //清除接收标识符
          }
}


/***************************************************************************
* 描  述 : 串口2中断服务函数
* 入  参 : 无
* 返回值 : 无
**************************************************************************/
void Uart2() interrupt 8 using 1
{
        IE2 &= 0xFE;                                        // 串口2中断关闭
        Flag=TRUE;                       //接收到数据,接收标识符有效
        if (S2CON & S2RI)                //串行接收到停止位的中间时刻时,该位置1
          {
              S2CON &= ~S2RI;              //清除S2CON寄存器对应S2RI位(该位必须软件清零)
                rec2[14] = S2BUF;      
           }
          if (S2CON & S2TI)                //在停止位开始发送时,该位置1
           {
              S2CON &= ~S2TI;                                //清除S2CON寄存器对应S2TI位(该位必须软件清零)
           }
        IE2 |= 0x01;                    // 串口2中断打开       
}


/***********************
功能描述:主函数
入口参数:无
返回值:无
************************/
int main()
{
        P1M1 &= 0xFE;        P1M0 &= 0xFE;                          //设置P1.0为准双向口
        P1M1 &= 0xFD;        P1M0 |= 0x02;                          //设置P1.1为推挽输出
        P3M1 &= 0xFE;        P3M0 &= 0xFE;                          //设置P3.0为准双向口
        P3M1 &= 0xFD;        P3M0 |= 0x02;                          //设置P3.1为推挽输出

        Uart2_Init();
        Uart1_Init();

        while(1);
       
}



///***************************************************************************
// * 描  述 : 串口1中断服务函数
// * 入  参 : 无
// * 返回值 : 无
// **************************************************************************/
//void Uart1() interrupt 4 using 1
//{
//        ES = 0;                            // 串口1中断关闭
//        Flag=TRUE;                  //接收到数据,接收标识符有效
//        if (RI)                     //串行接收到停止位的中间时刻时,该位置1
//          {
//              RI = 0;                 //清除RI位 (该位必须软件清零)
//    SBUF=S2BUF;      
//           }
//           if (TI)                    //在停止位开始发送时,该位置1
//           {
//              TI = 0;                 //清除TI位(该位必须软件清零)
//           }
//        ES =  1;                   // 串口1中断打开
//}