大神求救:51单片机发送字符串显示零

[复制链接]
4998|56
 楼主| Jinss 发表于 2014-9-10 10:23 | 显示全部楼层 |阅读模式
代码如下:
#include <stc89c5xRC.h>

unsigned char dat[] = {"hello"};
unsigned char i;                                               
void Init();
void SendData(unsigned char i);
void main()
{
    //初始化
    //死循环
     Init();
    while (1)
    {
        for(i=0; i<5; i++)
        {
            SendData(i);
        }
    }
}

void Init()
{
    //全部设定完再开启中断

    //定时器2设定
    RCAP2L=0xa0;//载入初值9600
    RCAP2H=0xff;
    T2CON=0x34;//定时器2设定
    //串口设定SCON
    SCON=0x40;//SM01=01;REN=0
    //开启定时器2,串口中断,es,串口中断,et2,定时器2
    RI=0x00;
    TI=0x00;
    IE=0x90;
}

void SendData(unsigned char i)
{
    ES=0;//关闭串口中断
        TI = 0;
     SBUF=dat[i];
    while (!TI);
    ES=1;//开启串口中断
}
最后在串口助手里面显示00,而且有时6个,有时7个
wangch_sh 发表于 2014-9-10 10:41 | 显示全部楼层
波特率一致吗?晶振多少?
 楼主| Jinss 发表于 2014-9-10 10:48 | 显示全部楼层
11.0592Mhz,用的是16为定时器,波特率9600,算的应该没错呀
ayb_ice 发表于 2014-9-10 10:52 | 显示全部楼层
本帖最后由 ayb_ice 于 2014-9-10 10:57 编辑

应该是波特率不对

波特率是定时器溢出率的16或32倍

9600*16

9600*32
 楼主| Jinss 发表于 2014-9-10 10:56 | 显示全部楼层
怎么算的呀
 楼主| Jinss 发表于 2014-9-10 11:23 | 显示全部楼层
有没有大神教下我这个菜鸟
匿名  发表于 2014-9-10 13:42
你这代码太乱了
coody 发表于 2014-9-10 13:57 | 显示全部楼层
发送大写字符U或十六进制0x55,发出的是方波,示波器看高低电平时间,计算实际波特率是否对。
ningling_21 发表于 2014-9-10 14:11 | 显示全部楼层
怎么不用STC的例程试试...
 楼主| Jinss 发表于 2014-9-10 14:17 | 显示全部楼层
ningling_21 发表于 2014-9-10 14:11
怎么不用STC的例程试试...

例程太多宏定义,搞不清楚他用的是什么模式。
 楼主| Jinss 发表于 2014-9-10 14:17 | 显示全部楼层
coody 发表于 2014-9-10 13:57
发送大写字符U或十六进制0x55,发出的是方波,示波器看高低电平时间,计算实际波特率是否对。 ...

身边没有示波器
 楼主| Jinss 发表于 2014-9-10 14:37 | 显示全部楼层
弄出来了。波特率算错了。初值是ffdc。谢谢ningling_21的提示。
  1. #include <stc89c5xRC.h>

  2. unsigned char dat[] = {"hello"};
  3. unsigned char i;                                               
  4. void Init();
  5. void SendData(unsigned char i);
  6. void main()
  7. {
  8.     //初始化
  9.     //死循环
  10.      Init();
  11.         for(i=0; i<5; i++)
  12.         {
  13.             SendData(i);
  14.         }
  15. }

  16. void Init()
  17. {
  18.     //全部设定完再开启中断

  19.     //定时器2设定
  20.     RCAP2L=0xdc;        //载入初值9600
  21.     RCAP2H=0xff;

  22.     T2CON=0x34;                //定时器2设定

  23.         PCON = 0x0;
  24.     SCON=0x40;//SM01=01;REN=0

  25.     RI=0x00;
  26.     TI=0x00;
  27.     IE=0x90;
  28. }

  29. void SendData(unsigned char i)
  30. {
  31.     //ES=0;//关闭串口中断
  32.         //TI = 0;
  33.      SBUF=dat[i];
  34.     while (!TI);
  35.         TI = 0;
  36.     //ES=1;//开启串口中断
 楼主| Jinss 发表于 2014-9-10 14:38 | 显示全部楼层
谢谢各位大神给我的帮助。
 楼主| Jinss 发表于 2014-9-10 15:08 | 显示全部楼层
高手解惑下:为什么在加了while(1);之后反而不正常了。本来应该输出hello,结果却出来hhello
有没有人知道为什么呀?
 楼主| Jinss 发表于 2014-9-10 15:10 | 显示全部楼层
是因为时钟不准吗
 楼主| Jinss 发表于 2014-9-10 16:09 | 显示全部楼层
我找到了,发送数据之前要把串口中断屏蔽掉。退出之前再打开中断。
coody 发表于 2014-9-10 16:27 | 显示全部楼层
你开了串口中断又没有串口中断服务函数?
 楼主| Jinss 发表于 2014-9-10 16:46 | 显示全部楼层
另外问下keilC语言多文件全局字符串变量如何定义和使用?在此谢过各位前辈了。
 楼主| Jinss 发表于 2014-9-10 16:51 | 显示全部楼层
各位前辈:我现在知道了为什么开始出现有时6对零有时7对零。最开始的问题包括串口中断和多文件全局变量定义使用的问题。
wangch_sh 发表于 2014-9-10 16:51 | 显示全部楼层
在一个文件中定义,在其他文件中用extern声明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

167

帖子

1

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