打印
[51单片机]

单片机向主机发送字符串,但显出来的是其他。

[复制链接]
1632|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baindym|  楼主 | 2014-6-23 15:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
/*        名称:单片机向主机发送字符串
        说明:单片机按一定的时间间隔向主机发送字符串,发送内容在虚拟终端显示。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint ms)
{
        uchar i;
        while(ms--) for(i=0;i<120;i++);
}
//向串口发送字符
void Putc_to_SerialPort(uchar c)
{
        SBUF=c;
        while(TI==0);
        TI=0;
}
//向串口发送字符串
void Puts_to_SerialPort(uchar *s)
{
        while(*s!='\0')
        {       
                Putc_to_SerialPort(*s);
                s++;
                DelayMS(5);
        }
}
//主程序
void main()
{
        uchar c=0;
        SCON=0x40;                //串口模式1
        TMOD=0x20;                //T1工作模式2
        TH1=0xfd;                //波特率9600
        TL1=0xfd;
        PCON=0x00;                //波特率不倍增
        TI=0;
        TR1=1;
        DelayMS(200);
        //向主机发送数据
        Puts_to_SerialPort("Receiving From 8051...\r\n");
        Puts_to_SerialPort("-------------------------------\r\n");
        DelayMS(50);
        while(1)
        {
                Putc_to_SerialPort(c+'A');
                DelayMS(100);
                Putc_to_SerialPort(' ');
                DelayMS(100);
                if(c==25)        //每输出一遍后加横线
                {
                        Puts_to_SerialPort("\r\n-------------------------------\r\n");
                        DelayMS(100);
                }
                c=(c+1)%26;
                if(c%10==0)                //每输出10个字符后换行
                {
                        Puts_to_SerialPort("\r\n");
                        DelayMS(100);       
                }
        }
}
求各位大师帮帮忙。

相关帖子

沙发
baindym|  楼主 | 2014-6-23 16:02 | 只看该作者
十六进制显示的是A0 8D 8A 8B A0 8C A0 8D A0 8E A0 8F A0 90 A0 91 A0 92 A0 93 A0 94 A0 8D 8A 95 A0 96 A0 97 ····

使用特权

评论回复
板凳
原野之狼| | 2014-6-23 16:05 | 只看该作者
循环发一个简单的十六进制:0xaa
然后用示波器看波形

使用特权

评论回复
地板
ningling_21| | 2014-6-23 16:16 | 只看该作者
baindym 发表于 2014-6-23 16:02
十六进制显示的是A0 8D 8A 8B A0 8C A0 8D A0 8E A0 8F A0 90 A0 91 A0 92 A0 93 A0 94 A0 8D 8A 95 A0 96  ...

试试,定义一个字符数组,用数组名发送...

使用特权

评论回复
5
baindym|  楼主 | 2014-6-23 16:27 | 只看该作者
ningling_21 发表于 2014-6-23 16:16
试试,定义一个字符数组,用数组名发送...

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char inbuf[]={"Receiving From 8051"};
//延时
void DelayMS(uint ms)
{
        uchar i;
        while(ms--) for(i=0;i<120;i++);
}
//向串口发送字符
void Putc_to_SerialPort(uchar c)
{
        SBUF=c;
        while(TI==0);
        TI=0;
}
//向串口发送字符串
void Puts_to_SerialPort(uchar *s)
{
        while(*s!='\0')
        {       
                Putc_to_SerialPort(*s);
                s++;
                DelayMS(5);
        }
}
//主程序
void main()
{
        uchar c=0;
        SCON=0x40;                //串口模式1
        TMOD=0x20;                //T1工作模式2
        TH1=0xfd;                //波特率9600
        TL1=0xfd;
        PCON=0x00;                //波特率不倍增
        TI=0;
        TR1=1;
        DelayMS(200);
        //向主机发送数据
        Puts_to_SerialPort(inbuf);
        DelayMS(50);

}
我把它改成了这样,显示出来的是┒爢诧瓲  ┒爢诧瓲 ┒爢诧瓲 ┒爢诧瓲 ····

使用特权

评论回复
6
baindym|  楼主 | 2014-6-23 16:33 | 只看该作者
原野之狼 发表于 2014-6-23 16:05
循环发一个简单的十六进制:0xaa
然后用示波器看波形

看哪里的波形?P3.1? P3.0?

使用特权

评论回复
7
原野之狼| | 2014-6-23 17:36 | 只看该作者
baindym 发表于 2014-6-23 16:33
看哪里的波形?P3.1? P3.0?

看信号上上的波形啊  TTL电平和转换后的电平都需要查看  然后根据波形检查器波特率是否如你设置的那样  以及数据是否是0xaa

使用特权

评论回复
8
coody| | 2014-6-23 17:51 | 只看该作者
原野之狼 发表于 2014-6-23 16:05
循环发一个简单的十六进制:0xaa
然后用示波器看波形

支持3楼,我一般用的是0x55,刚好是字符U,示波器可以看到漂亮的方波,同时可看到一个位的时间。

使用特权

评论回复
9
原野之狼| | 2014-6-23 20:15 | 只看该作者
coody 发表于 2014-6-23 17:51
支持3楼,我一般用的是0x55,刚好是字符U,示波器可以看到漂亮的方波,同时可看到一个位的时间。 ...

哈哈  受教了  以后我也改用0X55

使用特权

评论回复
10
NE5532| | 2014-6-23 20:48 | 只看该作者
楼主先用串口助手看发送HEX数据是否正确,然后再研究是不是超级终端对发来的数据格式有什么要求(没有用过超级终端,但是有可能他不认GBK码)

使用特权

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

本版积分规则

3

主题

10

帖子

1

粉丝