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

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

试试,定义一个字符数组,用数组名发送...
 楼主| 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);

}
我把它改成了这样,显示出来的是┒爢诧瓲  ┒爢诧瓲 ┒爢诧瓲 ┒爢诧瓲 ····
 楼主| baindym 发表于 2014-6-23 16:33 | 显示全部楼层
原野之狼 发表于 2014-6-23 16:05
循环发一个简单的十六进制:0xaa
然后用示波器看波形

看哪里的波形?P3.1? P3.0?
原野之狼 发表于 2014-6-23 17:36 | 显示全部楼层
baindym 发表于 2014-6-23 16:33
看哪里的波形?P3.1? P3.0?

看信号上上的波形啊  TTL电平和转换后的电平都需要查看  然后根据波形检查器波特率是否如你设置的那样  以及数据是否是0xaa
coody 发表于 2014-6-23 17:51 | 显示全部楼层
原野之狼 发表于 2014-6-23 16:05
循环发一个简单的十六进制:0xaa
然后用示波器看波形

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

哈哈  受教了  以后我也改用0X55
NE5532 发表于 2014-6-23 20:48 | 显示全部楼层
楼主先用串口助手看发送HEX数据是否正确,然后再研究是不是超级终端对发来的数据格式有什么要求(没有用过超级终端,但是有可能他不认GBK码)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

1

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