找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3893|回复: 10
打印 上一主题 下一主题
收起左侧

c52单片机多机通信 我的从机接收不到数据 有哪位大神帮我看下吗 十分感谢

[复制链接]
跳转到指定楼层
楼主
这个是我的主机代码



这个是我的从机:



不知道为什么 从机总是无法接收到数据,我也不知道是不是接线问题 我也把接线图po上来吧


十分希望有大神能够为我解决下这个问题 !跪谢!
代码.rar (850 Bytes, 下载次数: 10)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2018-7-16 08:09 | 只看该作者
我做过类似的实验,但只是双机。看了你的程序和接线照片,我认为有两点:
第一:程序中,主机的按键程序不对。按键这种器件,是需要消抖的,你好像有消抖的语句,但是不对嘛。
你用while是消不了抖的。你想啊:按下键,出现抖动,key1=0,但这个结果,可以有好多次的(抖动啊),所以,while是不能消抖的,应该用延时。
第二:硬件接线。应该去掉从机的USB线,这根线会占用串口,我做实验时就是这样的。应该用四根杜邦线连接VCC、GND、P30、P31。我的板子和你一模一样——普中的HC6800-ES-V2.0,下面是我的双机实验程序,你可以试试。双机实验比你的三机实验要简单很多。

/*
串口实验:单片机与单片机之间的通讯,这是主机程序
*/                                                                         

#include<reg51.h>

#define LED P2
#define JP P1

unsigned char JZ;
bit AJ;

void UsartConfiguration();
void Delay10ms(unsigned int c);
void KeyDown(void);

void main()//主函数
{
        UsartConfiguration();//设置串口
        Delay10ms(10);
        while(1)
        {
                KeyDown();
                if (AJ==1)
                {
                        AJ=0;
                        SBUF = JZ;
                        while (!TI);
                        TI = 0;
                }
        }
}

void UsartConfiguration()
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;//波特率是4800的
        TL1=0XF3;
        TR1=1;
        EA=1;
        ES=1;
}

void Delay10ms(unsigned int c)//延时10ms
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

void KeyDown(void)
{
        unsigned char a=0;
        JP=0x0f;
        if(JP!=0x0f)
        {
                Delay10ms(1);//此处按键消抖
                if(JP!=0x0f)
                {
                        AJ=1;
                        switch(JP)
                        {
                                case(0X07):        JZ=0;break;
                                case(0X0b):        JZ=1;break;
                                case(0X0d): JZ=2;break;
                                case(0X0e):        JZ=3;break;
                        }
                        JP=0Xf0;
                        switch(JP)
                        {
                                case(0X70):        JZ=JZ;break;
                                case(0Xb0):        JZ=JZ+4;break;
                                case(0Xd0): JZ=JZ+8;break;
                                case(0Xe0):        JZ=JZ+12;break;
                        }
                        for (a=0;(a<50)&&(JP!=0xf0);a++)//松手消抖
                        {
                                Delay10ms(1);
                        }
                }
        }
}

void FSSZ(void) interrupt 4
{
        RI=0;
        LED=~SBUF;
        Delay10ms(1);
}


/*
串口实验:实验单片机与单片机通讯,此为从机程序
*/                                                                         

#include<reg51.h>

#define SMG P0//数码管

unsigned char k;
unsigned char code XSM[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

void UsartConfiguration();
void Delay10ms(unsigned int c);

void main()
{
        UsartConfiguration();
        Delay10ms(10);
        while(1)
        {
        }
}

void UsartConfiguration()
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;//波特率是4800的
        TL1=0XF3;
        TR1=1;
        ES=1;
        EA=1;
}

void Delay10ms(unsigned int c)//延时10ms
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

void CKTX() interrupt 4
{
        RI=0;
        k=SBUF;
        SMG=XSM[k];
        SBUF=k;
        while (!TI);
        TI = 0;
}


程序功能是这样的:主机通过按下矩阵键盘,将键值发给从机,从机接收到后,数码管显示键值,并将键值发回主机,主机根据这个值以二进制方式显示LED灯。
回复

使用道具 举报

板凳
ID:7485 发表于 2018-7-16 08:32 | 只看该作者
void Init(void)                //9600bps@18.432MHz
{
        PCON &= 0x7f;                //波特率不倍速,清除最高位,其余保持不变
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0f;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式,设置T1,T0保持不变。
        TL1 = 0xFD;                //设定定时初值,11.0592晶振,9600波特率,根据你自己的波特率确定。
        TH1 = 0xFD;                //设定定时器重装值  
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}

PCON的最高位是SMOD,=1是波特率加倍,=0是不加倍

另外需要注意的是通信机之间的波特率必须相同。

你可以参考一下。
回复

使用道具 举报

地板
ID:164602 发表于 2018-7-16 08:57 | 只看该作者
补充一点:
算了你的波特率,好像不是4800,我还算不出你的初值FD对应什么波特率。
在晶振12M情况下,误差小的最大波特率就是4800,且要加倍,否则误差大了,接收和发送都会有较大的误差,就会接收不到或接收错误。
回复

使用道具 举报

5#
ID:303383 发表于 2018-7-16 10:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
ID:371473 发表于 2018-7-16 12:31 | 只看该作者
HC6800-ES-V2.0 发表于 2018-7-16 08:09
我做过类似的实验,但只是双机。看了你的程序和接线照片,我认为有两点:
第一:程序中,主机的按键程序不 ...

去掉从机的usb线是说 只有主机接usb吗
回复

使用道具 举报

7#
ID:371473 发表于 2018-7-16 12:56 | 只看该作者
ahshmj 发表于 2018-7-16 08:32
void Init(void)                //9600bps@18.432MHz
{
        PCON &= 0x7f;                //波特率不倍速,清除最高位,其余保持不变

哇!谢谢你的意见 我改了下波特率就好了 可能是我的波特率设置错了 谢谢蛤o(>ω<)o
回复

使用道具 举报

8#
ID:371473 发表于 2018-7-16 12:57 | 只看该作者
HC6800-ES-V2.0 发表于 2018-7-16 08:57
补充一点:
算了你的波特率,好像不是4800,我还算不出你的初值FD对应什么波特率。
在晶振12M情况下,误 ...

我波特率可能弄错了   我后来改了个波特率 再加上那个延时 程序就可以了 谢谢你的意见,嘿嘿嘿
回复

使用道具 举报

9#
ID:371473 发表于 2018-7-16 13:15 | 只看该作者
错误原因:
我把发送地址帧的按键设置成P3^0和P3^1,他们是单片机里面的接收和发送端,因为他们是控制输入输出的按钮,就产生了冲突,所以从机没有接收到信息;
后来我改了按键和波特率 从机就收到数据了,十分感谢上面的各位替我解决这个问题 谢谢!
回复

使用道具 举报

10#
ID:371473 发表于 2018-7-16 13:24 | 只看该作者
小猫猫爱吃鱼 发表于 2018-7-16 10:49
你好!你这是三机通讯吗?一个主机、两个从机?
主机发送数据,两个从机同时接收?

是三机通信没错,主机发送地址,然后从机判别是否是他的地址,然后从机向主机发送状态消息,最后接收数据。
回复

使用道具 举报

11#
ID:372442 发表于 2018-7-16 13:43 | 只看该作者
波特率的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表