打印

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

[复制链接]
3709|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

使用特权

评论回复
5
Jinss|  楼主 | 2014-9-10 10:56 | 只看该作者
怎么算的呀

使用特权

评论回复
6
Jinss|  楼主 | 2014-9-10 11:23 | 只看该作者
有没有大神教下我这个菜鸟

使用特权

评论回复
7
匿名  2014-9-10 13:42
你这代码太乱了

使用特权

评论回复
8
coody| | 2014-9-10 13:57 | 只看该作者
发送大写字符U或十六进制0x55,发出的是方波,示波器看高低电平时间,计算实际波特率是否对。

使用特权

评论回复
9
ningling_21| | 2014-9-10 14:11 | 只看该作者
怎么不用STC的例程试试...

使用特权

评论回复
10
Jinss|  楼主 | 2014-9-10 14:17 | 只看该作者
ningling_21 发表于 2014-9-10 14:11
怎么不用STC的例程试试...

例程太多宏定义,搞不清楚他用的是什么模式。

使用特权

评论回复
11
Jinss|  楼主 | 2014-9-10 14:17 | 只看该作者
coody 发表于 2014-9-10 13:57
发送大写字符U或十六进制0x55,发出的是方波,示波器看高低电平时间,计算实际波特率是否对。 ...

身边没有示波器

使用特权

评论回复
12
Jinss|  楼主 | 2014-9-10 14:37 | 只看该作者
弄出来了。波特率算错了。初值是ffdc。谢谢ningling_21的提示。
#include <stc89c5xRC.h>

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

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

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

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

        PCON = 0x0;
    SCON=0x40;//SM01=01;REN=0

    RI=0x00;
    TI=0x00;
    IE=0x90;
}

void SendData(unsigned char i)
{
    //ES=0;//关闭串口中断
        //TI = 0;
     SBUF=dat[i];
    while (!TI);
        TI = 0;
    //ES=1;//开启串口中断

使用特权

评论回复
13
Jinss|  楼主 | 2014-9-10 14:38 | 只看该作者
谢谢各位大神给我的帮助。

使用特权

评论回复
14
Jinss|  楼主 | 2014-9-10 15:08 | 只看该作者
高手解惑下:为什么在加了while(1);之后反而不正常了。本来应该输出hello,结果却出来hhello
有没有人知道为什么呀?

使用特权

评论回复
15
Jinss|  楼主 | 2014-9-10 15:10 | 只看该作者
是因为时钟不准吗

使用特权

评论回复
16
Jinss|  楼主 | 2014-9-10 16:09 | 只看该作者
我找到了,发送数据之前要把串口中断屏蔽掉。退出之前再打开中断。

使用特权

评论回复
17
coody| | 2014-9-10 16:27 | 只看该作者
你开了串口中断又没有串口中断服务函数?

使用特权

评论回复
18
Jinss|  楼主 | 2014-9-10 16:46 | 只看该作者
另外问下keilC语言多文件全局字符串变量如何定义和使用?在此谢过各位前辈了。

使用特权

评论回复
19
Jinss|  楼主 | 2014-9-10 16:51 | 只看该作者
各位前辈:我现在知道了为什么开始出现有时6对零有时7对零。最开始的问题包括串口中断和多文件全局变量定义使用的问题。

使用特权

评论回复
20
wangch_sh| | 2014-9-10 16:51 | 只看该作者
在一个文件中定义,在其他文件中用extern声明。

使用特权

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

本版积分规则

4

主题

166

帖子

1

粉丝