打印

单片机双机通信为何从机接收不到数据?

[复制链接]
2305|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/********主机发送********/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar datt;
sbit LED=P1^0;
/**********************/
void delay_ms(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
        for(y=0;y<110;y++);
}
/**********************/
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速                                                           SMOD=0 波特率不加倍
        SCON = 0x50;                //8位数据,可变波特率                                           SM0=0 SM1=1 SM2=0 REN=1 TB8=0 RB8=0 TI=0 RI=0
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/*********************/
void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                SBUF=0X55;
                while(!TI);
                TI=0;
                delay_ms(100);
        }
}
/************************************************/
/********从机接收********/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar datt;
sbit LED=P1^0;
/**********************/
void delay_ms(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
        for(y=0;y<110;y++);
}
/**********************/
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速                                                           SMOD=0 波特率不加倍
        SCON = 0x50;                //8位数据,可变波特率                                           SM0=0 SM1=1 SM2=0 REN=1 TB8=0 RB8=0 TI=0 RI=0
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/*********************/
void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                while(!RI);
                RI=0;
                LED=~LED;
                P0=SBUF;
                delay_ms(100);
        }
}
LED端无波形输出,故认为是从机没能接收到信号。肯请指点一二。。。

相关帖子

沙发
狂奔的蜗牛哥|  楼主 | 2014-4-23 19:18 | 只看该作者

使用特权

评论回复
板凳
狂奔的蜗牛哥|  楼主 | 2014-4-23 19:52 | 只看该作者
跪求…………

使用特权

评论回复
地板
hgjinwei| | 2014-4-23 21:11 | 只看该作者
先用示波器看看主机是否发出了数据,数据波形是否正常。
若正常,查看芯片文档,看看外设配置对不对,尤其要注意管教是否要配置。

使用特权

评论回复
5
狂奔的蜗牛哥|  楼主 | 2014-4-23 21:34 | 只看该作者
hgjinwei 发表于 2014-4-23 21:11
先用示波器看看主机是否发出了数据,数据波形是否正常。
若正常,查看芯片文档,看看外设配置对不对,尤其 ...

问题找到了,不过不知道为何接收到然后再发送一次数据,另一端不能成功接收!

使用特权

评论回复
6
狂奔的蜗牛哥|  楼主 | 2014-4-23 21:40 | 只看该作者
/********A机代码********/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar a;
/**********************/
void delay_ms(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
        for(y=0;y<110;y++);
}
/**********************/
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速                                                           SMOD=0 波特率不加倍
        SCON = 0x50;                //8位数据,可变波特率                                           SM0=0 SM1=1 SM2=0 REN=1 TB8=0 RB8=0 TI=0 RI=0
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/*********************/
void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                SBUF=0Xf0;
                while(!TI);
                TI=0;
                delay_ms(100);                 
                while(!RI);
                RI=0;
                a=SBUF;
                P0=a;               
                delay_ms(100);          
        }
}

/********B机代码********/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar datt;
uchar a;
sbit LED=P1^0;
/**********************/
void delay_ms(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
        for(y=0;y<110;y++);
}
/**********************/
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速                                                           SMOD=0 波特率不加倍
        SCON = 0x50;                //8位数据,可变波特率                                           SM0=0 SM1=1 SM2=0 REN=1 TB8=0 RB8=0 TI=0 RI=0
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/*********************/
void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                while(!RI);
                RI=0;
                a=SBUF;
                P0=a;
                delay_ms(100);          
                SBUF=0X55;
                while(!TI);
                TI=0;          
                delay_ms(100);
        }
}
不知道为何B机在接收A机传来的数据后不能正常的发送自己的数据!

使用特权

评论回复
7
651927693| | 2014-4-24 00:44 | 只看该作者
不知道你是通过什么现象判断出你最后的结论的。
不过可以给你一些调试的思路。
根据你的说法,是B机给A机发送数据时出了问题。不过到底是B发送出了问题还是A接收出了问题呢?可以在while语句后面点亮个LED或者之类的操作。另外,也可以让A机或者B机单独和串口通信助手通信看看。

使用特权

评论回复
8
blust5| | 2014-4-24 08:33 | 只看该作者
为什么不用串口中断收发数据?

使用特权

评论回复
9
jinxihexi| | 2014-4-24 08:57 | 只看该作者
应该是发生了冲突,用串口中断应该就没有问题了,或者在程序里面加上标示符,以区分接收与发送。

使用特权

评论回复
10
yklstudent| | 2014-4-24 11:45 | 只看该作者
开启串口中断允许 你的串口中断函数呢
你当MCU是逗比?

使用特权

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

本版积分规则

15

主题

86

帖子

3

粉丝