51单片机 - 串口UART_接收



1> 目标

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


2> 工作原理


2.1> 硬件框图

2.1

接收简化框图:
2.2

接收时序图:
2.3



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

电脑端发送:0x0F;
2.2

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


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:逻辑分析仪
11


串口工具发送0x55:逻辑分析仪
2



5> 复盘总结

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


6> 视频链接🔗

🔗B站视频 - 串口接收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值