找回密码
 立即注册

QQ登录

只需一步,快速开始

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

两个单片机485通信接收和显示只有一位数据正确

[复制链接]
跳转到指定楼层
楼主
两个单片机485通信,主机采集信号显示在数码管上 ,并通过485发送给从机,显示在数码管上,但是只能发过来一位,如何显示多位?

主机函数:
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include "XPT2046.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit RS485_DIR = P1^0;  //RS485方向选择引脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 disp[4];
u8 play[4];
u16 temp,dat,cnt;

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i)
{
        while(i--);       
}

void datapros()
{
        u16 temp;
        static u8 i;
        if(i==50)
        {
                i=0;
                temp = Read_AD_Data(0x94);                //   AIN2 光敏电阻
        }
        i++;
        disp[0]=smgduan[temp/1000];//千位
        disp[1]=smgduan[temp%1000/100];//百位
        disp[2]=smgduan[temp%1000%100/10];//个位
        disp[3]=smgduan[temp%1000%100%10];               
}

void datpros()
{
        u16 dat;
                static u8 i;
        if(i==50)
        {
                i=0;
                dat = Read_AD_Data(0x94);                //   AIN2 光敏电阻
        }
        i++;
        play[0]=dat/1000;
        play[1]=dat%1000/100;
        play[2]=dat%1000%100/10;
        play[3]=dat%1000%100%10;

}

void DigDisplay()
{
        u8 i;
        for(i=0;i<4;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位       
                }
                P0=disp[i];//发送数据
                delay(100); //间隔一段时间扫描       
                P0=0x00;//消隐
        }               
}

void UsartInit()
{
  RS485_DIR = 1;
  SCON  = 0x50;  //配置串口为模式1
        PCON|=0X80;                        //波特率加倍
  TMOD &= 0x0F;  //清零T1的控制位
  TMOD |= 0x20;  //配置T1为模式2
        TH1=0XF4;                                //计数器初始值设置,注意波特率是4800的
  TL1 = TH1;     //初值等于重载值
  ET1 = 0;       //禁止T1中断
        EA=1;                                                //打开总中断
  ES  = 1;       //使能串口中断
  TR1 = 1;       //启动T1
}


void main()
{
        while(1)
        {
                u8 i;
                RS485_DIR = 1;
          UsartInit();
          datapros();
                DigDisplay();//数码管显示函数
    datpros();
                for (i=0;i<4;i++)  //循环发送所有字节
                {
      cnt = play[i];   //发送一个字节数据
                }
                SBUF=cnt;
                delay(5);  //等待最后的停止位完成,延时时间由波特率决定
          while (!TI); //等待该字节发送完成
    TI = 0;   //清零发送中断标志位
        }
}

从机函数:
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit RS485_DIR = P1^0;  //RS485方向选择引脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 disp[4];
u16 temp;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i)
{
        while(i--);       
}

void UsartInit()
{
  RS485_DIR = 0;
  SCON  = 0x50;  //配置串口为模式1
        PCON|=0X80;                        //波特率加倍
  TMOD &= 0x0F;  //清零T1的控制位
  TMOD |= 0x20;  //配置T1为模式2
        TH1=0XF4;                                //计数器初始值设置,注意波特率是4800的
  TL1 = TH1;     //初值等于重载值
  ET1 = 0;       //禁止T1中断
        EA=1;                                                //打开总中断
  ES  = 1;       //使能串口中断
  TR1 = 1;       //启动T1
}

void main()
{
        UsartInit();
        RS485_DIR=0;
        EA=1;
        while(1);
}

void InterruptUART() interrupt 4
{
        if(RI)
        {
                u16 temp;
                u8 i;
                temp=SBUF;
                RI=0;
                disp[0]=smgduan[SBUF/1000];//千位
          disp[1]=smgduan[SBUF%1000/100];//百位
          disp[2]=smgduan[SBUF%1000%100/10];//个位
          disp[3]=smgduan[SBUF%1000%100%10];
                for(i=0;i<4;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位       
                }
                P0=disp[i];//发送数据
                delay(100); //间隔一段时间扫描       
                P0=0x00;//消隐
        }               
               
        }
}       




QQ图片20171129173301.jpg (82.13 KB, 下载次数: 47)

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

使用道具 举报

沙发
ID:255413 发表于 2017-11-29 21:46 | 只看该作者
这图片是啥
回复

使用道具 举报

板凳
ID:509827 发表于 2019-4-18 15:12 | 只看该作者
有没有proteus仿真图?
回复

使用道具 举报

地板
ID:337069 发表于 2019-4-18 21:31 | 只看该作者
从机:SBUF是u8类型的,显示数据你那样处理是不行的
主机:四个数据,FOR循环之后就play[3],被发送传出去了
回复

使用道具 举报

5#
ID:507641 发表于 2019-4-23 20:39 | 只看该作者
说明发送没发完,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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