[通用8051核FLASH系列] 【HC89S003P套件试用】printf()的使用之putchar函数重定向!

[复制链接]
2085|13
 楼主| hayden0 发表于 2019-3-22 14:20 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:37 编辑

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

其实就是重定向putchar函数:

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

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

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

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

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

  45.         EA = 1;
  46. }

  47. void UART_Send(u8 UART,u8 buf)
  48. {
  49.         if(UART==UART1)
  50.         {
  51.                 SBUF = buf;
  52.                 while(!TI);
  53.                 TI=0;
  54.         }
  55.         if(UART==UART2)
  56.         {
  57.                 S2BUF = buf;
  58.                 while(!(S2CON&0x02));
  59.                 S2CON&=~0x02;
  60.         }
  61. }

  62. void UART_Sends(u8 UART,u8 *buf)
  63. {
  64.                 while(*buf)
  65.                         {
  66.                                 UART_Send(UART,*buf++);
  67.                         }
  68. }

  69. //重定向putchar函数
  70. char putchar(char c)
  71. {
  72.         UART_Send(UART1,c);
  73.         return c;
  74. }



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

QQ截图20190322131051.png

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

gaoyang9992006 发表于 2019-3-22 21:08 | 显示全部楼层
楼主可以,认真。这简直是给圣心写库。呵呵,干的漂亮。
dqqqqqq 发表于 2019-3-27 15:58 | 显示全部楼层
学习了,谢谢分享
qgbgzp 发表于 2019-7-1 11:32 | 显示全部楼层
正在找,谢谢哈
jkl21 发表于 2019-7-4 17:26 | 显示全部楼层
putchar函数还需要重定向?     
iyoum 发表于 2019-7-4 17:26 | 显示全部楼层
c语言函数之一吧   
uytyu 发表于 2019-7-4 17:26 | 显示全部楼层
楼主是一个追求完美的人。         
myiclife 发表于 2019-7-4 17:27 | 显示全部楼层
这个使用keil吗?            
touser 发表于 2019-7-4 17:27 | 显示全部楼层
printf吧,简单可靠。     
uiint 发表于 2019-7-4 17:27 | 显示全部楼层
跟着楼主多多学习。      
htmlme 发表于 2019-7-4 17:27 | 显示全部楼层
可以添加到HC89S003P例程里面。   
yujielun 发表于 2019-7-4 17:28 | 显示全部楼层
感谢楼主的代码!!!               
typeof 发表于 2019-7-4 17:28 | 显示全部楼层
HC89S003P功耗怎么样?            
usysm 发表于 2019-7-4 17:28 | 显示全部楼层
支持两个串口输入和输出?      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

296

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部