[其它应用] 51 UART配置流程

[复制链接]
636|1
Zhiniaocun 发表于 2025-9-5 16:26 | 显示全部楼层 |阅读模式
Step1: 设置TXD、RXD pin的输入输出属性,根据各芯片定义设置

例:P2CR &= 0xFB;//P2^1:UART_TXD, P2^2:UART_RXD


Step2: 设置UART工作方式

设置SCON寄存器。例,SH88F02设置为工作方式1,SCON = 0x40;

在SH88F02应用中发现,必须先配置SCON在配置定时器,如果顺序颠倒UART不工作。

正常顺序见最后例程。

设置PCON的bit7可以设置波特率加不加倍。


Step3: 选择产生波特率的定时器

例,SH88F02选择定时器2为波特率发生器。

T2CON = 0x30;     //(TCLK=1, RCLK=1)


Step4: 设置产生波特率定时器的工作方式及定时器重载值

一般产生波特率的定时器都工作在重载方式下。在这步就根据各芯片设置对应的定时器工作,设置完毕后注意要启动定时器:TRx = 1;

例, SH88F02定时器2设置如下:

        T2CON = 0x30;                //UART波特率由定时器2产生
        T2MOD = 0x00;                //定时器2时钟源为系统时钟
        RCAP2L = 0xD8;                //波特率为9600
        RCAP2H = 0xFF;
        TL2 = 0xD8;
        TH2 = 0xFF;
       
        TR2 = 1;



Step5: 启动UART

向SBUF中写入数据即启动了UART的发送。

REN = 1; // 允许接收
REN设置后,接收数据线RXD上侦测到低电平的起始信号即会开始接收数据。



TI = 1; //特别强调一下

其中TI = 1的设置与printf的使用有关。在实际测试中,如果在初始化中没有这句,用printf()语句不能正常输出,但是给SBUF赋值还是能正常输出的。


Step6: 中断设置:

EADC = 1;

EA  = 1;

设置后当发送数据完毕,或接收数据完毕即会进入中断

void interruptUART() interrupt 4  using        3
{
        if(TI)
                TI = 0;
        if(RI)
        {
                RI = 0;
                rDataUart = SBUF;
                uartReadFlag =1;
        }
}




例,SH88F02 UART配置工作例程:


void Init_Port()
{
        P0CR &= 0xDC;        //P0^5为ADC input
        P1CR &= 0x00;        //P1端口配置为输入模式
        P2CR &= 0xFB;        //P2^1:UART_TXD, P2^2:UART_RXD
}


void Init_Uart()            //串口通信初始化  
{       
        SCON=0x40;                  //串口通信工作方式1
       
        T2CON = 0x30;                //UART波特率由定时器2产生
        T2MOD = 0x00;                //定时器2时钟源为系统时钟
        RCAP2L = 0xD8;                //波特率为9600
        RCAP2H = 0xFF;
        TL2 = 0xD8;
        TH2 = 0xFF;
       
        TR2 = 1;

        TI = 1;                                //很重要
        REN=1;              //允许接收      
}



void main(void)  
{  
        Init_System();
        while(1)  
       {
            if(uartReadFlag)
                {
                        uartReadFlag = 0;
//                        printf("Get the valule is: %d \r\n", rDataUart);
                        SBUF = rDataUart;
                }
            }
}



bit uartReadFlag = 0;                        //UART读到值标志
unsigned int rDataUart = 0;                //UART接收buffer

void interruptUART() interrupt 4  using        3
{
        if(TI)
                TI = 0;
        if(RI)
        {
                RI = 0;
                rDataUart = SBUF;
                uartReadFlag =1;
        }
}





上述配置后,用printf即可与串口助手通信。
————————————————
版权声明:本文为CSDN博主「Phenixyf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/phenixyf/article/details/53896676

穷得响叮当侠 发表于 2025-9-6 09:32 | 显示全部楼层
在设置波特率的时候,需要注意定时器的配置,否则波特率可能会不正确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

260

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部