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不要超出限制.

你可能感兴趣的:(51单片机)