打印
[国产单片机]

着急求助啊,关于stc的串口通信

[复制链接]
2759|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yourenzou 于 2010-10-8 15:56 编辑

我采用的是12C5A16S2单片机 晶振32MHz  波特率设置为1200
串口助手接收到的数据是乱码,如下图所示
发送数据出去通过串口助手接收数据
请教各位帮助了
着急啊

万分感谢
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
sfr  S2CON    = 0x9A;
//sfr  SCON    = 0x98;
sfr  IE2    = 0xAF;
sfr  S2BUF    = 0x9B;
sfr  AUXR    = 0x8e;
sfr  BRT = 0x9c;
sfr  IAP_CONTR =  0xC7;
sfr  CCON    = 0xD8;
sfr  CMOD    = 0xD9;
sfr  CL      = 0xE9;
sfr  CH      = 0xF9;
sfr  CCAP0L  = 0xEA;
sfr  CCAP0H  = 0xFA;
sfr  CCAPM0  = 0xDA;
sfr  CCAPM1  = 0xDB;
sbit CR      = 0xDE;
sfr ADC_CONTR   =   0xBC;           
sfr ADC_RES     =   0xBD;           
sfr ADC_RESL    =   0xBE;           
sfr P1ASF       =   0x9D;
//sfr SBUF        =   0x99;
//sfr TL0        =   0x8A;
//sfr TL1        =   0x8B;
//sfr TH0        =   0x8C;
//sfr TH1        =   0x8D;
//sfr PCON       =   0x87;
//sfr TCON= 0x88;
//sfr TMOD= 0x89;
//sbit TI=SCON^1;
//sbit RI=SCON^0;
//sbit TR1=TCON^6;

//    晶振 32.MHz
char t=0;
char temp[20];
char temp1[20];
void delay(char k)
{
    int i,j;
    for (i=0;i<k;i++)
    {

        for (j=0;j<1;j++)
        {
            ;
        }
    }
}

void sendchar(char k) //串口发送单字符
{

SBUF=k;
while(!TI)
{
  ;
}
TI=0;



}
void sendstr() //串口发送字符串
{char i=0;
while(1)
{
  sendchar(temp);
  i++;
  if(temp=='\0')
  {
   break;
  }
}
}
void AD_init()
{
      P1ASF=0x01;
    ADC_RES = 0;
    ADC_CONTR=0xe0;
    delay(20);
   }

void getADresult( )
{
    ADC_CONTR = 0xe8;  //开启ad转换 设置最高速度,P1.0口为转换口
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (ADC_CONTR==0xF8);//当转换完成
    ADC_CONTR =0x08;         //关闭AD
   //return ADC_RES;                 //返回结果
}
void main()
{double Vin,result,ADresult;
char j,i,h;
  char shiwei,gewei,xiaoshu1,xiaoshu2,xiaoshu3;
//  char i,j;
//  temp[2]='.';
//temp[6]=' ';

  TMOD=0x22;      // 定时器T1工作在方式2 ,8位自动重装
  TL1=0XB9;      // 装载值  波特率设置为1200
  TH1=0XB9;
  TR1=1;
  SCON=0X50;     //  8位数据位,无奇偶校验位
  PCON=0X00;     //  SMOD=0.波特率不加倍
AD_init();
while(1)
{

/*    getADresult();                     从P1.0口取电压值
    ADresult=ADC_RES*4+ADC_RESL;
     Vin=5.0*ADresult/256;                                          
    result=2.5*Vin;   
   
      i=result;                         数据处理,按位显示
  shiwei=i/10;
  gewei=i%10;
      result=(result-i)*1000;
  j=result;
  xiaoshu1=j/100;
  xiaoshu3=j%10;
  xiaoshu2=(j%100-xiaoshu3)/10;
   
      temp1[0]=shiwei;
    temp1[1]=gewei;
    temp1[3]=xiaoshu1;
    temp1[4]=xiaoshu2;
    temp1[5]=xiaoshu3;

    for(h=0;h<6;h++)
  {
    temp[h]=temp1[h]+32;
    }
*/
/*****************测试串口情况,试图发送数012345**************/
    temp[0]=48;
  temp[1]=49;
  temp[2]=50;
  temp[3]=51;
  temp[4]=52;
  temp[5]=55;
    sendstr();


}

}

未命名.jpg (73.12 KB )

未命名.jpg

相关帖子

沙发
McuPlayer| | 2010-10-7 18:14 | 只看该作者
示波器能看到波形吗?

使用特权

评论回复
板凳
zhuyjgh| | 2010-10-9 09:35 | 只看该作者
不愿看程序了,,先把串口助手的“十六进制显示”勾上吧,,容易检查~~
先发一个字节,,成功了再发两个,,接着发串,,

使用特权

评论回复
地板
zhuyjgh| | 2010-10-9 09:45 | 只看该作者
本帖最后由 zhuyjgh 于 2010-10-9 10:00 编辑

看错了,,是文字排版问题,,
看图片怀疑是波特率的问题~~

使用特权

评论回复
5
laoliang3064| | 2010-10-11 09:32 | 只看该作者
你用那个串口调试助手有问题,我试过,建议换一个调试助手。

使用特权

评论回复
6
murex| | 2010-10-14 11:15 | 只看该作者
显示方式不同缘故的了,选上16进制即可的

使用特权

评论回复
7
ABCDELF| | 2013-1-28 23:25 | 只看该作者
换换串口助手吧

使用特权

评论回复
8
Ketose| | 2013-1-31 09:21 | 只看该作者
STC的下载程序自带串口助手。建议楼主用最新的STC下载程序,里面带有各种串口的例子,各种晶振。

使用特权

评论回复
9
autopccopy| | 2013-1-31 13:47 | 只看该作者
本帖最后由 autopccopy 于 2013-1-31 13:48 编辑

LS 说的不错,STC-ISP自带串口助手等工具和波特率计算器。(下载地址为:http://www.****ducst/datasheet/s ... -isp-15xx-v6.24.exe )

刚用STC-ISP V6.24试计算了一下,32M 下无法生成1200BPS的波特率(因误差太大了), 如果使用4800BPS,自动生成的C代码如下:


void UartInit(void)                //4800bps@32MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0x30;                //设定定时初值
        TH1 = 0x30;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}


:lol

使用特权

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

本版积分规则

0

主题

4

帖子

2

粉丝