自己编写STC15F2K60S2函数之串口1通信初始化

1.

#include      //包含STC15F2K60S2单片机寄存器定义文件


2./*****

函数名:串行口1初始化

调用:SerialIni();

参数:无

返回值:无

*****/

void SerialIni(){

    //SCON &= 0x2E;  //先对需要设置的位进行清零 0010 1110 因为SCON所有位都是用于设置串行口1,所以这句可省略。

    SCON = 0x50;   /* SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI 设置串行口的工作方式1(SM0 SM1  0 1)即8位可变波特率方式;允许接收)*/

    AUXR &= 0xBE;  //先对需要设置的位进行清零 1011 1110

    AUXR |= 0x00;    /* T0x12 | T1x12 | UART_M0x6 | T2R | T2_C/T(T上画) | T2x12 | EXTRAM | S1ST2 定时器1时钟为Focs/12,即12T;串口1选择定时器1为波特率发生器。S1ST2:串行口1波特率发生器选择位。0:选择定时器1作为串行口1波特率发生器。 1:选择定时器2作为串行口1的波特率发生器,此时定时器1得到释放,可以作为独立的定时器使用。*/

    TMOD &= 0x0F; //先清零定时器1的设置(高4位设置定时器1,低4位设置定时器0)

    TMOD |= 0x20;           /* GATE | C/T(T上画) | M1 | M0 | GATE | C/T(T上画) | M1 | M0 (定时器工作方式2)使用定时器1作为波特率发生器。*/

    TH1 = 0xfd;                 //8位自动重装方式,TH1用于重置TL1初值。2的SMOD次方/32*(定时器1的溢出率或定时器2的溢出率)

    TL1  = 0xfd;                 //晶振11.0592MHz,设置波特率为9600bps。SMOD属于PCON寄存器,为1时,波特率翻倍。

    TR1=1;                         //定时器1启动

    ES = 1;                         //开放串口中断

    EA = 1;                         //开放CPU中断

}

3.

void main(void)

{

    SerialIni();                    //运行串口初始化函数

    while(1){

}                                //等待中断()

}

4.

//中断函数

void Uart2(void) interrupt 4 using 1

{

    unsigned char mydata;

    if(RI)                           //如果是接收中断

    {

        RI=0;

        mydata = SBUF;    //将接收缓冲区的数据保存到mydata变量中

        SBUF = ~mydata; //将接收到的数据按位取反后发回

    }

    else                           //如果是发送中断,将TI清0

        TI = 0;

}




你可能感兴趣的:(嵌入式)