打印
[通用8051核FLASH系列]

【HC89S003P套件试用】printf()的使用之putchar函数重定向!

[复制链接]
1654|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hayden0|  楼主 | 2019-3-22 14:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:37 编辑

上一篇我使用了简单的方法使用printf,但是只能用UART1,为了治好我的强迫症,这一篇我来完善printf的使用,让它全部支持两个串口!

其实就是重定向putchar函数:

/**********************************************************************/
//*串口1初始化函数,对HC89S003的两个串口进行初始化和波特率设置
//*参数:baud-1200,2400,4800,9600,19200,57600
//*无返回值
/**********************************************************************/
void UART1_Init(u16 baud)
{
        /**********************************UART配置初始化**************************************/
        P2M0 = P2M0&0x0F|0x80;                                //P21设置为推挽输出
        P0M1 = P0M1&0x0F|0x20;                                //P03设置为上拉输入

        TXD_MAP = 0x21;                                                //TXD映射P21
        RXD_MAP = 0x03;                                                //RXD映射P03               
        T4CON = 0x06;                                                //T4工作模式:UART1波特率发生器
  TH4 = (65536 - (1000000/baud))>>8;
        TL4 = (65536 - (1000000/baud));                                                //波特率9600
        SCON2 = 0x02;                                                //8位UART,波特率可变
        SCON = 0x10;                                                //允许串行接收
        IE |= 0X10;                                                        //使能串口中断
        
        EA = 1;
        TI = 1;        //使用printf需要发送标志位TI=1;
}
void UART2_Init(u16 baud)
{
        /**********************************UART配置初始化**************************************/
        P2M0 = P2M0&0x0F|0x80;                                //P21设置为推挽输出
        P0M1 = P0M1&0x0F|0x20;                                //P03设置为上拉输入

        TXD2_MAP = 0x21;                                        //TXD映射P21
        RXD2_MAP = 0x03;                                        //RXD映射P03               
        //波特率计算
        //波特率 = 1/16 * (T5时钟源频率 / 定时器5预分频比) / (65536 - 0xFF98)
        //       = 1/16 * ((16000000 / 1) / 104)
        //                 = 9615.38(误差0.16%)

        //波特率9600
        //反推初值 = (65536 - ((T5时钟源频率 / 定时器5预分频比) * (1 / 16)) / 波特率)
        //                   = (65536 - (16000000 * (1 / 16) / 9600))
        //                   = (65536 - 104.167)
        //         = FF98

        RCAP5H = (65536 - (1000000/baud))>>8;
        RCAP5L = (65536 - (1000000/baud));
        T5CON = 0x06;                                                //T5工作模式:UART2波特率发生器
        S2CON2 = 0x00;                                                //8位UART,波特率可变
        S2CON = 0x10;                                                //允许串行接收
        IE |= 0x40;                                                        //使能串口中断

        EA = 1;
}

void UART_Send(u8 UART,u8 buf)
{
        if(UART==UART1)
        {
                SBUF = buf;
                while(!TI);
                TI=0;
        }
        if(UART==UART2)
        {
                S2BUF = buf;
                while(!(S2CON&0x02));
                S2CON&=~0x02;
        }
}

void UART_Sends(u8 UART,u8 *buf)
{
                while(*buf)
                        {
                                UART_Send(UART,*buf++);
                        }
}

//重定向putchar函数
char putchar(char c)
{
        UART_Send(UART1,c);
        return c;
}



对于波特率HC89S003的串口似乎和其他单片机不同,根据数据手册,波特率的设置如下



通过表格可以发现,如果使用默认的内部16M时钟是无法使用115200或者更高速率的,实测会乱码。

沙发
gaoyang9992006| | 2019-3-22 21:08 | 只看该作者
楼主可以,认真。这简直是给圣心写库。呵呵,干的漂亮。

使用特权

评论回复
板凳
dqqqqqq| | 2019-3-27 15:58 | 只看该作者
学习了,谢谢分享

使用特权

评论回复
地板
qgbgzp| | 2019-7-1 11:32 | 只看该作者
正在找,谢谢哈

使用特权

评论回复
5
jkl21| | 2019-7-4 17:26 | 只看该作者
putchar函数还需要重定向?     

使用特权

评论回复
6
iyoum| | 2019-7-4 17:26 | 只看该作者
c语言函数之一吧   

使用特权

评论回复
7
uytyu| | 2019-7-4 17:26 | 只看该作者
楼主是一个追求完美的人。         

使用特权

评论回复
8
myiclife| | 2019-7-4 17:27 | 只看该作者
这个使用keil吗?            

使用特权

评论回复
9
touser| | 2019-7-4 17:27 | 只看该作者
printf吧,简单可靠。     

使用特权

评论回复
10
uiint| | 2019-7-4 17:27 | 只看该作者
跟着楼主多多学习。      

使用特权

评论回复
11
htmlme| | 2019-7-4 17:27 | 只看该作者
可以添加到HC89S003P例程里面。   

使用特权

评论回复
12
yujielun| | 2019-7-4 17:28 | 只看该作者
感谢楼主的代码!!!               

使用特权

评论回复
13
typeof| | 2019-7-4 17:28 | 只看该作者
HC89S003P功耗怎么样?            

使用特权

评论回复
14
usysm| | 2019-7-4 17:28 | 只看该作者
支持两个串口输入和输出?      

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

284

帖子

3

粉丝