找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5252|回复: 3
收起左侧

关于stc15f2k60s2单片机串口printf函数的使用问题

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:244223 发表于 2018-10-23 17:37 | 显示全部楼层 |阅读模式

为什么调用printf在这个板子上输出中文会出现乱码,我拿不同的板子试了基本一样的代码就没乱码,板子应该没有问题,请赐教



1.png 2.png 3.png 4.png

单片机源码如下:

  1. #include<STC15F2K60S2.H>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int        
  5. uint a;
  6. bit flag=0;
  7. float b;
  8. void delayms(int ms);
  9. void allinit();
  10. void keyscan();
  11. void PCreceive();
  12. void UartInit(void); //串口初始化
  13. void main()
  14. {
  15.         a=100;       b=0.01;
  16.         UartInit();//串口初始化
  17.         EA=1; //打开总中断
  18.         ES=1; //串口1中断
  19.         allinit(); //初始化板子
  20.         while(1)
  21.         {
  22.                 if(flag==1)
  23.                 {
  24.                         flag=0;
  25.                         PCreceive();
  26.                 }
  27.                 keyscan();
  28.         }
  29. }
  30. void PCreceive()
  31. {                        
  32.         TI=1;
  33.         printf("  hello world!     \n"    );delayms(5);
  34.         printf("   总水量:%dL      \n"  ,a);delayms(5);
  35.         printf(" 瞬时速度:%.1fL/min\n\n",b);        delayms(5);                        
  36. }
  37. void UartInit(void)                //9600bps@11.0592MHz
  38. {
  39.         SCON = 0x50;                //8位数据,可变波特率
  40.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  41.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  42.         T2L = 0xE0;                //设定定时初值
  43.         T2H = 0xFE;                //设定定时初值
  44.         AUXR |= 0x10;                //启动定时器2
  45. }
  46. void keyscan()
  47. {
  48.         if(P33==0)
  49.         {
  50.                 delayms(5);
  51.                 if(P33==0)
  52.                 {
  53.                         flag=1;
  54.                 }
  55.                 while(!P33);
  56.         }
  57. }
  58. void delayms(int ms) //延时函数
  59. {
  60.         int i,j;
  61.         for(i=ms;i>0;i--)
  62.                 for(j=845;j>0;j--);
  63. }
  64. void allinit() //初始化板子的,不会有问题
  65. {
  66.         P2=0XA0;
  67.         P0=0X00;//关闭蜂鸣器,继电器
  68.         P2=0X80;
  69.         P0=0XFF;//关闭LED灯
  70.         P2=0XC0;
  71.         P0=0XFF;//选择所有数码管
  72.         P2=0XFF;
  73.         P0=0XFF;//关闭所有数码管
  74. }
复制代码




回复

使用道具 举报

ID:388197 发表于 2018-10-23 20:11 | 显示全部楼层
看下有问题的板子晶振是不是11.0592MHz

评分

参与人数 1黑币 +10 收起 理由
霍礼林 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:244223 发表于 2018-10-23 20:57 | 显示全部楼层
cjm82 发表于 2018-10-23 20:11
看下有问题的板子晶振是不是11.0592MHz

两个板子都是焊接的都是12M的晶振
回复

使用道具 举报

ID:387733 发表于 2018-10-24 06:53 | 显示全部楼层
霍礼林 发表于 2018-10-23 20:57
两个板子都是焊接的都是12M的晶振

12M晶振就要用12M晶振计算,否则误差太大了,自然容易出错:

void UartInit(void)                //9600bps@12.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xC7;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
}


这样与PC机串口通讯会失步。11.0592M计算的9600波特率误差为0,而12M计算的误差为0.16,所以还是建议用11.0592的晶振。

如果只是两个单片机之间串口通讯,那么晶振与波特率都无所谓,只要两边完全相同就可以了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表