C51 - 串口UART_接收

UART_接收

  • 1> 目标
  • 2> 工作原理
    • 2.1> 硬件框图
    • 2.2> 逻辑分析仪 测试RXD波形
  • 3> 程序设计
  • 4> 实验验证
  • 5> 复盘总结


B站视频 - 串口接收


1> 目标

51单片机接收电脑端发送的一个字符,或一个字符串;


2> 工作原理


2.1> 硬件框图

C51 - 串口UART_接收_第1张图片

接收简化框图:
C51 - 串口UART_接收_第2张图片

接收时序图:
C51 - 串口UART_接收_第3张图片



2.2> 逻辑分析仪 测试RXD波形

电脑端发送:0x0F;
C51 - 串口UART_接收_第4张图片

看来电脑端是遵守协议的
换作你是单片机,如何接收这串数据;


3> 程序设计

串口初始化:

/**
 * @brief UART initialization
 * @note 8N1, 115200
 */ 
void UART_Init(void)
{
	ES = 0;					// 禁止串口中断;
	ET1 = 0;				// 禁止定时器1中断 
	RI = 0;					// 清零接收中断请求标志
	
	/* UART Config */
	SCON = 0x50;    		// 串口工作模式:8位数据位, 0101  0000
	PCON |=  0x80;			// 串口波特率加倍;1000 0000

	/* Tim1 Config */
    TMOD &= 0x0F;
    TMOD |= 0x20;			// 定时器1工作模式2:8位自动重装载
	
    TH1 = 0x100 - (SYS_CLK / 12 * 2 / 32 / 115200);   
    TL1 = TH1;				// 定时器1初始值
	
    TR1 = 1;				// 启动定时器1
	ES = 1;
	EA = 1;
}

发送一个字符:

/**
 * @brief printf() call this function 
 */ 
char putchar (char c)
{
	/*----- '\n'处理 --------*/
    if (c == '\n') {			
        ES = 0;    
		
        SBUF = '\r';            // windows中换行 \r + \n;
        while(!TI);	            // 因为串口速度较慢,等待发送完成 
        TI = 0;                 // 清除发送标志
		
        ES = 1;                 // 发送完毕,开启串口中断,以响应串口接收
    }
    
	/*----- 字符处理 --------*/
    ES = 0;                      
    SBUF = c;                    
	
    while (!TI) {
		/* Nothing */ ;
	}
    TI = 0;
	
    ES = 1;

	
    return 1;               	
}

接收中断服务函数:

/**
 * @brief This function handles UART interrupt
 */ 
void UART_Handler(void) interrupt 4
{
    RI = 0;
	
	P0 = SBUF;
	UART_Putchar(SBUF);  // 接收的数据回发,回去;
}

4> 实验验证

串口工具发送0x0F:逻辑分析仪
C51 - 串口UART_接收_第5张图片


串口工具发送0x55:逻辑分析仪
C51 - 串口UART_接收_第6张图片



5> 复盘总结

1> 51单片机内部,有串口的硬件模块,大概明白工作原来后,重点放在应用上;
2> 实验过程中,用示波器,或逻辑分析仪观察波形,更有feeling;

你可能感兴趣的:(51单片机开发-DAYi,51单片机,DAYi)