找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手求指点关于单片机多机通信问题

[复制链接]
跳转到指定楼层
楼主
ID:86686 发表于 2015-7-28 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
思路是 主机通过扫描按键 在数码管上显示1,要与1号通信,1号机收到主机发来的地址若相同则led灯由亮变灭,回传地址给主机,主机收到地址后数码管显示2,下载到开发板上时,从机接收到主机发的地址led灯变灭,但是主机收不到从机发来的地址数码管还是显示1,没有变化。求大神指点程序如下:
主机
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define  addr1 0x01


void master_addr(uchar addr);              //发送地址

uchar code table[]={
                        0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,  
                        0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71            //显示数字
                   };


void delay(uint x)
{                                                                                                                                          
   uint i,j;                                                                              / /延时函数
   for(i=x;i>0;i--)
      for(j=110;j>0;j--);
}                              

void display(uchar num)
{
                                                                                                                                            //显示数码管
   P0=table[num];
   delay(10);

   P1=0xfe;
}

void err()
{
    SBUF=0xff;
        while(TI==0);                                                                                         //发送错误
        TI=0;

}

uchar  key_scan()
{
  uchar temp,temp2;
  P2=0xf0;                                                                                 //P2输出11110000
  temp=P2;                                                                                 //扫描按键
  if(temp!=0xf0)
    {
          delay(5);                                                                         //若有按键按下则延时5毫秒消抖
           temp=P2;                                                                         //再次扫描
           if(temp!=0xf0)
           {
              temp2=temp&0xf0;                                                 //保留高四位含有按键列的值
                  P2=0x0f;                                                                 //P2输出00001111
                  delay(1);                                                                 //延时1毫秒确保temp能读到输出值
                  temp=P2;
                  temp2|=temp;                                                            //扫描按键将按键值所在的列与行合在一起
                  
           }
//            while(P2!=0x0f);                                         //如果按键未松掉,则不等于0x0f则程序在此等待按键松
        }
        return temp2;
}

void master_addr(uchar addr)
{

            SBUF=addr;                                                                         //发送呼叫地址
            while(TI==0);
         TI=0;       
         while(RI==0);
         RI=0;
          display(2);

            if(SBUF!=addr)
            err();

}
void main()
{
  uchar  keyval;
   TMOD=0x20;
   TL1=0xfd;
   TH1=TL1;
   PCON=0x00;
   TR1=1;
   SCON=0xf8;
   EA=1;

          
        while(1)
        {
         keyval=key_scan();
       
    switch(keyval)
        {
          case 0x7b:
                   display(1);
                           master_addr(addr1);
                           break;

                 default:
                           break;
         }
          }
}

从机程序
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define  addr1 0x01

sbit led1=P0^0;

bit tready;
bit rready;


void main()
{
         
     TMOD=0x20;
         TL1=0xfd;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
         TH1=TL1;
         PCON=0x00;
         TR1=1;
         SCON=0xf0;
         ES=1;
         EA=1;
         while(1)
         {
         tready=1;
         rready=1;
         }
}

void ssio()interrupt 4
{

            while(RI==0);
                RI=0;
                ES=0;
                if(SBUF!=addr1)
                {
                  ES=1;
                  goto reti;
               
                }
                 SM2=0;
                 led1=~led1;
                 SBUF=0x01;         
                 while(TI==0);
                 TI=0;

  reti:;
}


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

使用道具 举报

沙发
ID:84652 发表于 2015-7-28 18:06 | 只看该作者
本帖最后由 王朗的诱惑 于 2015-7-28 20:24 编辑

两个程序的SCON怎么不一样?还有,按了按键的时候,display(2)执行完以后回到循环开始,keyval并没有变,所以又立刻执行了display(1),然后执行master_addr(addr1)发送,然后会停在while(RI==0)那里等数据,然后……这样循环,但是display(2)显示后停留的时间太短,然后就到display(1)了,可能根本看不到2……然后就不知道了。
回复

使用道具 举报

板凳
ID:86686 发表于 2015-7-29 01:34 | 只看该作者
王朗的诱惑 发表于 2015-7-28 18:06
两个程序的SCON怎么不一样?还有,按了按键的时候,display(2)执行完以后回到循环开始,keyval并没有变,所 ...

十分感谢你的回复 我在调试一下·····
回复

使用道具 举报

地板
ID:86686 发表于 2015-7-29 09:41 | 只看该作者
Fututain 发表于 2015-7-29 01:34
十分感谢你的回复 我在调试一下·····

真的十分感谢,一语惊醒梦中人,找到原因了,主机的SM2应该在接时将此位置0,或者在主机的SCON里面改为0xd8;初始化这点是按照书上copy过去的一直以为没有错,就没去查,一直卡了好几天,总之感谢之情,临屏涕零······
回复

使用道具 举报

5#
ID:86686 发表于 2015-7-29 09:42 | 只看该作者
Fututain 发表于 2015-7-29 01:34
十分感谢你的回复 我在调试一下·····


真的十分感谢,一语惊醒梦中人,找到原因了,主机的SM2应该在接时将此位置0,或者在主机的SCON里面改为0xd8;初始化这点是按照书上copy过去的一直以为没有错,就没去查,一直卡了好几天,总之感谢之情,临屏涕零······
回复

使用道具 举报

6#
ID:84652 发表于 2015-7-29 19:45 | 只看该作者
Fututain 发表于 2015-7-29 09:42
真的十分感谢,一语惊醒梦中人,找到原因了,主机的SM2应该在接时将此位置0,或者在主机的SCON里面改为 ...

哈哈,解决了就好。等经验越来越多了,就不会出错了。
回复

使用道具 举报

7#
ID:89045 发表于 2015-9-10 21:25 | 只看该作者
还有主机没有串口中断,无法检测从机上传数据,根据你这个程序是主机操作从机,主机让从机传数据,向从机发数据,从机不能主动上传
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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