51单片机(STC15W408AS)映射printf函数 串口收发实现

前提:实现串口收发数据

/*************************************************
 *函数名称:char putchar(char c)                            
 *功    能:映射printf                                    
 *参    数:char c                                      
 *返 回 值:char                                      
 *************************************************/
char putchar(char c)
{
	UartPutc((uint8_t)c);//把自己实现的串口打印一字节数据的函数替换到这里
	return c;
}

串口收发数据实现

#include "uart.h"

bit UART1_Busy = 0;
uint8_t ReceiveBuf = 0;				//串口当前接收到的1字节
uint8_t BufferLocal = 0;			//缓冲区位置
uint8_t ReceiveDone = 0;			//串口消息接收完毕标志
uint8_t USART_Buffer[50] = {0};		//串口消息缓冲区	

/*************************************************
 *函数名称:void UART_ISR() interrupt 4 using 1                                  
 *功    能:串口中断处理函数                                      
 *参    数:void                                       
 *返 回 值:void                                       
 *************************************************/
void UART_ISR() interrupt 4 using 1
{
	/*接收中断标志*/
    if (RI)
    {
		RI = 0;                 //响应中断后 必须软件清零接收中断标志位
		
		ReceiveBuf = SBUF;
		if (0 == BufferLocal)
		{
			if (0x7e == ReceiveBuf)
				USART_Buffer[BufferLocal++] = ReceiveBuf;      
			else 
				BufferLocal = 0;	
		}
		else
		{
			USART_Buffer[BufferLocal++] = ReceiveBuf;
			if(0xe7 == ReceiveBuf)
			{
				ReceiveDone = 1;
				BufferLocal = 0;
			}	  
		} 
    }
	/*发送中断标志*/
    if (TI)						//8位数据发送结束 会请求中断
    {
        TI = 0;                 //响应中断后 必须软件清零接收中断标志位
		
        UART1_Busy = 0;         //清除串口忙标志
    }
}
#define FOSC 11059200L			
#define UART1_BAUD 9600
/*************************************************
 *函数名称:void UART_Init(void)                                  
 *功    能:串口初始化                                      
 *参    数:void                                       
 *返 回 值:void                                       
 *************************************************/
void UART_Init(void)
{
	SCON = 0x50;                 		//8位可变波特率

	AUXR1 |= AUXR1 & 0x3F;
	T2L = (65536 - (FOSC/4/UART1_BAUD));//设置波特率重装值
	T2H = (65536 - (FOSC/4/UART1_BAUD)) >> 8;
	AUXR |= 0x15;						//允许定时器2运行 选择定时器2作为串口1的波特率发生器
	TI = 1;
	ES = 1;                     		//允许串口中断
	EA = 1;								//允许CPU中断
}
/*************************************************
 *函数名称:void UartPutc(uint8_t dat)                                  
 *功    能:串口发送数据                                      
 *参    数:数据                                      
 *返 回 值:void                                       
 *************************************************/
void UartPutc(uint8_t Dat)
{
    while (UART1_Busy);             //串口忙检测
	
    UART1_Busy = 1;
    SBUF = Dat;                 	//????UART_ISR?????
}
/*************************************************
 *函数名称:void UartPuts(int8_t *s);                                  
 *功    能:串口发送字符串                                      
 *参    数:void                                       
 *返 回 值:void                                       
 *************************************************/
void UartPuts(int8_t *s)
{
	while(*s)
		UartPutc(*s++);
}
/*************************************************
 *函数名称:char putchar(char c)                            
 *功    能:映射printf                                    
 *参    数:char c                                      
 *返 回 值:char                                      
 *************************************************/
char putchar(char c)
{
	UartPutc((uint8_t)c);
	return c;
}

printf异常

调试过程中出现了好几次打印数据出错,格式错误,显示乱七八糟的数据.最终找到原因是变量超出了单片机的空间. 所以调试过程中要注意RAM和ROM不要超出限制.

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值