找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1151|回复: 5
收起左侧

PC机与51单片机的通信程序 显示出来的是乱码

[复制链接]
ID:781656 发表于 2021-5-6 16:17 | 显示全部楼层 |阅读模式
这个是pc机和单片机的通信,程序没问题,但显示出来的是乱码,使用VSPD虚拟串口软件调试。望各位大侠帮忙指导!
51hei截图_20210506160734.jpg 51hei截图_20210506160813.jpg
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define FREQ 11059200       //振荡器频率11.0592Mhz
  7. uchar code SEG_CODE[]=  //共阴数码管数字段码表,最后为“-”的段码
  8. {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};
  9. uchar R[]={10,10,10,10}; //保存接收到的四位数字(初始时为4个“-”)
  10. //延时程序
  11. void delay_ms(uint x)
  12. {
  13. uchar t;
  14. while(x--)
  15. {
  16.   for(t=0;t<120;t++);
  17. }
  18. }
  19. //初始化串口(使用time1定时器)
  20. void init_usart_ut1()
  21. {
  22. SCON=0X50;    //串口方式1
  23. TMOD=0X20;    //t1工作于方式2(8位自动重装)
  24. PCON=0X80;        //波特率不倍增
  25. TH1=TL1=-FREQ/384/9600;      //波特率配置(TH1=TL1=0XFD)
  26. //或:TH1=TL1=256-FREQ/384/9600;
  27. TR1=1;            //启动定时器1
  28. }
  29. //串口初始化(使用t2定时器)(当T2CON寄存器的RCLK,TCLK二者之一置位
  30. //t2即工作于波特率发生器模式,TH2-TL2溢出时,RCAP2H-RCAP2L重装TH2-TL2)
  31. void init_usart_ut2()
  32. {
  33. RCAP2H=0XFF;         //波特率配置(RCAP2H=0XFF)
  34. RCAP2L=-FREQ/32/9600;    //波特率配置(RCAP2L=0XDC)
  35. //或:RCAP2L=256-FREQ/32/9600;
  36. SCON=0X50;       //串口方式1
  37. T2CON=0X30;      //收/发时钟位:RCLK,TCLK同时置位
  38. PCON=0X00;       //波特率不倍增
  39. TR2=1;           //启动定时器t2
  40. }
  41. //主程序
  42. main()
  43. {
  44. uchar i;
  45. init_usart_ut2();   //串口初始化(使用timer2定时器)
  46. //或:init_usart_ut1();  //串口初始化(使用timer1定时器)
  47. EX0=1; IT0=1;               //允许外部中断0,下降沿触发
  48. ES=1;            //允许串口中断
  49. EA=1;            //开中断
  50. while(1)
  51. {
  52.   for(i=0;i<4;i++)  //循环先扫描显示4个数字字符
  53.   {
  54.    P0=0X00;            //先暂时关闭段码
  55.    P2=~(1<<i);         //发送位码
  56.    P0=SEG_CODE[R[i]];   //发送段码
  57.    delay_ms(4);   //位间短暂延时
  58.   }
  59. }
  60. }
  61. //串口接收中断
  62. void receive_4_digit() interrupt 4
  63. {
  64. static uchar i=0;         //接收缓冲索引(静态变量)
  65. uchar c;      //当前接收的字符
  66. if(RI)       //接收中断标志位判断
  67. {
  68.   RI=0;      //软件清零中断标志位
  69.   c=SBUF;               //从SBUF寄存器读取字符
  70.   if(c=='#')     //接收时遇到‘#’则将接收索引清零
  71.   {
  72.    i=0;     
  73.   }
  74.   else
  75.   {
  76.    if(c>='0'&&c<='9')  //遇到数字0-9时从当前位置循环存放
  77.    {
  78.     R[i++]=c-'0';  //存入R数组当前位置,索引递增
  79.     if(i==4)   //索引范围限于0-3
  80.     {
  81.      i=0;
  82.     }
  83.    }
  84.   }
  85. }
  86. }
  87. //INT0中断发送字符串
  88. void EX_INT0() interrupt 0
  89. {
  90. uchar *s="这是由8051单片机发送的字符串!!!\r\n";
  91. uchar i=0;
  92. while(s[i]!='\0')
  93. {
  94.   SBUF=s[i++];         //发送1字节,索引递增
  95.   while(TI==0)   //等待发送完毕
  96.   {
  97.    TI=0;            //软件清零中断标志位TI
  98.   }
  99. }
  100. }
复制代码

回复

使用道具 举报

ID:781656 发表于 2021-5-6 16:23 | 显示全部楼层

全运行状态下,都是乱码,
51hei截图_20210506162107.png
回复

使用道具 举报

ID:390416 发表于 2021-5-6 20:02 | 显示全部楼层
串口1打印程序 可以打印3个十六位的变量 波特率9600 http://www.51hei.com/bbs/dpj-201660-1.html
回复

使用道具 举报

ID:401564 发表于 2021-5-6 21:35 | 显示全部楼层
STC官方下载器有串口助手,下载程序到单片机上运行就可以
有的串口通讯软件是会乱码,STC下载的是相对比较好用的
回复

使用道具 举报

ID:889094 发表于 2021-5-6 22:18 | 显示全部楼层
看了两个串口初始化函数,串口2的初始化函数中怎么和1中的一样都是SCON=0X50
虽然我不知道楼主用的什么芯片,但两个串口设置模式1肯定不是一个寄存器,因为我的芯片两个串口各有设置的寄存器。我的是串口1用SCON串口2用S2CON
回复

使用道具 举报

ID:781656 发表于 2021-5-7 15:01 | 显示全部楼层
用的是89c52芯片,现在的问题是,串口调试发出的信号,单片机数码管不显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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