打印

新手报到,问问前辈串口通信乱码是什么问题

[复制链接]
1839|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abbccc308|  楼主 | 2012-10-28 00:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
因为笔记本没有串口,所以我买的单片机板子用USB下载程序的(是用PL2303HX芯片),但是做串口通信总是乱码,是什么原因啊?
程序如下:
#include<reg52.h>
#include<stdio.h>  //用于调用puts函数
#define FOSC 12000000 //所用的晶振
#define BAUD 9600  //波特率
unsigned char a,flag_uart,flag_on;
void init()
{  TMOD=0x20;  //定时器T1 方式2
   TH1=TL1=-(FOSC/BAUD/32/12);  
   TR1=1;  //启动T1
   SM0=0;  
   SM1=1;    //串口工作方式1
   REN=1;   //串口允许接收数据
   EA=1;   //开总中断
   ES=1;   //开串口中断
}  
void ser() interrupt 4
{  RI=0;    //串口中断标志,接收完成时置1,要由软件清零
   a=SBUF;    //接收到的数据给a
   flag_uart=1;    //接收到数据的标志,在主函数中查询用
   if(a==1)     
      flag_on=1;   
   else if (a==2)   
      flag_on=2;  
   else   
      flag_on=3;
}
void main(void)
{  init();  
   while(1)  
   {   if(flag_uart==1)   //flag_uart为1中断接收到数据
     {  flag_uart=0;   
     ES=0;   //关串口中断,防止发送数据时接到数据进入中断
  TI=1;   //发送中断标志位,发送到停止位时置1,软件清零,因为下面的puts检查到为1时才会发送数据
  switch(flag_on)   
  {  case 1:puts("You input 1\n");     
     break;     
     case 2:puts("You input 2\n");     
     break;   
     case 3:puts("Error\n");   
     break;   
   }  
   while(!TI);  //等待数据发送完成,就是TI置1
   TI=0;    //软件清零
   ES=1;      //打开串口中断
   }
}
}  
现象如图:

KWU]XO@IV]BBI9ZI]P6`7UU.jpg (188.23 KB )

KWU]XO@IV]BBI9ZI]P6`7UU.jpg

相关帖子

沙发
wkshengren| | 2012-10-28 07:10 | 只看该作者
晶振换了吧,这样算出来的波特率不是9600

使用特权

评论回复
板凳
NE5532| | 2012-10-28 08:49 | 只看该作者
串口助手没有选择“16进制显示”

使用特权

评论回复
地板
abbccc308|  楼主 | 2012-10-28 17:59 | 只看该作者
2# wkshengren [/
换了11.0592Mhz的晶振确实好了  谢谢啊

使用特权

评论回复
5
abbccc308|  楼主 | 2012-10-28 18:01 | 只看该作者
3# NE5532
就是想让他显示字符啊  是晶振问题 现在好了

使用特权

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

本版积分规则

1

主题

90

帖子

1

粉丝