51单⽚机(STC15W408AS)映射printf函数串⼝收发实现前提:实现串⼝收发数据
/*************************************************
*函数名称:char putchar(char c)
*功能:映射printf
*参数:char c
*返回值:char
*************************************************/
char putchar(char c)
{
UartPutc((uint8_t)c);//把⾃⼰实现的串⼝打印⼀字节数据的函数替换到这⾥
return c;
}
串⼝收发数据实现
东风标致408论坛#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不要超出限制.