打印
[51单片机]

关于51单片机双机连接的问题,求解答

[复制链接]
1141|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
达0404|  楼主 | 2014-11-17 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是89C51的开发板,现在想进行双机连接,通过RS232进行,主机采集温度,从机进行接收数据在数码管上显示,但是为什么老是显示不出来数据,我用程序在电脑上运行了一下,可以用,但是为什么在两台单片机上上就是不行,求指导,下面是程序
主机:


#include<reg51.h>
#include"temp.h"

void LcdDisplay(int);
void UsartConfiguration();

void main()
{
        UsartConfiguration();
        while(1)
        {
                LcdDisplay(Ds18b20ReadTemp());
        }
}

      



void LcdDisplay(int temp)          //lcd显示
{
   
          unsigned datas[] = {0, 0, 0, 0, 0}; //定义数组
        float tp;  
        if(temp< 0)                                    //当温度值为负数
          {
                temp=temp-1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;       
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算由?.5,还是在小数点后面。

          }
        else
          {       
                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
                //如果温度是正的那么,那么正数的原码就是补码它本身
                temp=tp*0.0625*100+0.5;       
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算加上0.5,还是在小数点后面。
        }
        datas[0] = temp / 10000;
        datas[1] = temp % 10000 / 1000;
        datas[2] = temp % 1000 / 100;
        datas[3] = temp % 100 / 10;
        datas[4] = temp % 10;

        SBUF = datas[0];        //将接收到的数据放入到发送寄存器
        while (!TI);                            //等待发送数据完成
        TI = 0;
       
        SBUF = datas[1];        //将接收到的数据放入到发送寄存器
        while (!TI);                            //等待发送数据完成
        TI = 0;

        SBUF = datas[2];        //将接收到的数据放入到发送寄存器
        while (!TI);                            //等待发送数据完成
        TI = 0;
        SBUF = '.';             //将接收到的数据放入到发送寄存器
        while (!TI);                        //等待发送数据完成
        TI = 0;

        SBUF =datas[3];        //将接收到的数据放入到发送寄存器
        while (!TI);                            //等待发送数据完成
        TI = 0;

        SBUF =datas[4];        //将接收到的数据放入到发送寄存器
        while (!TI);                            //等待发送数据完成
        TI = 0;

         
}
/*******************************************************************************
* 函 数 名         : UsartConfiguration()
* 函数功能                   : 设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
//        ES=1;                                                //打开接收中断
//        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

从机:
#include<reg51.h>
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


unsigned char code DIG_CODE[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的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
unsigned char buffer[5];//定义接收缓冲区
//--声明全局函数--//
void DigDisplay();//动态显示函数
void UsartConfiguration();

void main()
{
unsigned char i;

UsartConfiguration();
while(1)
{  
    for(i=0;i<5;i++)
   {
           REN = 1;//接收允许
        while(RI==0);
        buffer[i]=SBUF;
        RI = 0;
   }
           DisplayData[1] = DIG_CODE[buffer[0]];
        DisplayData[2] = DIG_CODE[buffer[1]];
        DisplayData[3] = DIG_CODE[buffer[2]]|0x80;
        DisplayData[4] = DIG_CODE[buffer[3]];
        DisplayData[5] = DIG_CODE[buffer[4]];
}
DigDisplay();
}
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
TR1=1; //打开计数器
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
    case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
        case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
        case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
    case(3):
             LSA=1;LSB=1;LSC=0; break;//显示第3位
        case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
        case(5):
            LSA=1;LSB=0;LSC=1; break;//显示第5位
        case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
        case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位                       

}
GPIO_DIG=DisplayData[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}

相关帖子

沙发
airwill| | 2014-11-18 07:20 | 只看该作者
大体看了一下, 估计是协议问题
多个数据的发送, 接收方怎么知道在接收到的一大串数据中, 哪里开始是第一个数据呢?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
达0404 + 1 大概方向知道是这个,很简单的戳中要点了.
板凳
ningling_21| | 2014-11-18 09:23 | 只看该作者
串口接收部分的程序有点问题,不能接收完成再显示吗?

使用特权

评论回复
地板
达0404|  楼主 | 2014-11-18 21:07 | 只看该作者
ningling_21 发表于 2014-11-18 09:23
串口接收部分的程序有点问题,不能接收完成再显示吗?

可以告诉我要怎么改吗?我把后面的接收显示后移,但是试了之后还是不行,不知道是那一部分出了问题,可以将你所认为的怎么该的程序发给我看看吗?

使用特权

评论回复
5
达0404|  楼主 | 2014-11-18 21:35 | 只看该作者
ningling_21 发表于 2014-11-18 09:23
串口接收部分的程序有点问题,不能接收完成再显示吗?

能够再具体点吗?我改了之后还是不行呀

使用特权

评论回复
6
ningling_21| | 2014-11-19 09:05 | 只看该作者
达0404 发表于 2014-11-18 21:35
能够再具体点吗?我改了之后还是不行呀

用串口中断接收,接收完成刷新显示

使用特权

评论回复
7
joyme| | 2014-11-19 17:01 | 只看该作者
你的显示DigDisplay();在while(1)之后调用,能显示才怪呢

使用特权

评论回复
8
达0404|  楼主 | 2014-11-23 18:14 | 只看该作者
joyme 发表于 2014-11-19 17:01
你的显示DigDisplay();在while(1)之后调用,能显示才怪呢

这个应该是可以显示的吧

使用特权

评论回复
9
joyme| | 2014-12-9 09:57 | 只看该作者
while(1)是个死循环,后面的语句根本没有机会执行,你说能不能显示

使用特权

评论回复
10
wangch_sh| | 2014-12-9 10:00 | 只看该作者
DigDisplay();这条语句位置有问题。。。

使用特权

评论回复
11
hnkf118| | 2014-12-9 21:20 | 只看该作者
协议问题。

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝