0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

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

/********主机发送********/

#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        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        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端无波形输出,故认为是从机没能接收到信号。肯请指点一二。。。

提问者:mvuywerw 地点:- 浏览次数:1354 提问时间:10-22 17:31
我有更好的答案
提 交
4条回答
lxmlau 01-17 03:48
先用示波器看看主机是否发出了数据,数据波形是否正常。
若正常,查看芯片文档,看看外设配置对不对,尤其要注意管教是否要配置。
5616asaqwq 01-12 14:15
/********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        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        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机传来的数据后不能正常的发送自己的数据!
BEONEWENHUI 01-12 06:15
不知道你是通过什么现象判断出你最后的结论的。
不过可以给你一些调试的思路。
根据你的说法,是B机给A机发送数据时出了问题。不过到底是B发送出了问题还是A接收出了问题呢?可以在while语句后面点亮个LED或者之类的操作。另外,也可以让A机或者B机单独和串口通信助手通信看看。
ickey_feng 01-17 22:59
应该是发生了冲突,用串口中断应该就没有问题了,或者在程序里面加上标示符,以区分接收与发送。
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航