找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机+RS485双机通信接收机编程问题

[复制链接]
跳转到指定楼层
楼主
ID:548414 发表于 2019-7-29 19:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
16黑币
如何把接受过来的AD值在从机lcd显示呢??求指点!!!!!!
主机单片机程序:
#include<reg52.h>
#include<intrins.h>
#include <stdio.h>

#define uint unsigned int
#define uchar unsigned char
void delay4us()
{   
    _nop_();
        _nop_();
        _nop_();
        _nop_();
}

sbit RS485E=P3^7;   //定义485的使能脚

sbit CLK  = P3^6;          //时钟         
sbit CS   = P3^5;          //片选
sbit DIN  = P3^4;          //输入
sbit DOUT = P3^3;          //输出

sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

uchar disp[]="0.00V";
uchar code line1[]="NOW VOL:";

void delayms(uint ms){
     uchar t;
     while(ms--)
     for(t=0;t<120;t++);
}
bit LCD_BUSY_CHECK(){
bit result;

    LCD1602_RS=0;
    LCD1602_RW=1;
    LCD1602_E=1;
    delay4us();
    result=(bit)(P0&0x80);
    LCD1602_E=0;
    return result;
}
void lcdwrc(uchar cmd)
{
           while(LCD_BUSY_CHECK());
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_E=0;
        _nop_();_nop_();
        P0=cmd;
        delay4us();
        LCD1602_E=1;
        delay4us();
        LCD1602_E=0;
}

void set_disp_pos(uchar pos)
{
    lcdwrc(pos|0x80);
}

void lcdwrd(uchar dat)
{
    while(LCD_BUSY_CHECK());
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_E=0;
        P0=dat;
        delay4us();
        LCD1602_E=1;
        delay4us();
        LCD1602_E=0;
}
void LCD_init()
{
   lcdwrc(0x38);
   delayms(1);
   lcdwrc(0x0c);
   delayms(1);
   lcdwrc(0x06);
   delayms(1);
   lcdwrc(0x01);
   delayms(1);
}

void SPI_Write(uchar moshi)
{                         //写模式函数
     uint i;
     CS = 0;
      for(i = 0; i < 8; i++){   
          CLK = 0;
         DIN = moshi>>7;
         CLK = 1;
         moshi <<= 1;
    }
     CLK = 0;
}

uint GetValue()
{                     //读取DOUT管脚,得到最终数字量函数
     uint i, ans = 0;
     for(i = 0; i < 12; i++){
         CLK = 0;
         ans <<= 1;
         ans |= DOUT;
         CLK = 1;
    }
     CLK = 0;
     return ans;
}

uint Read_AD_Data(uchar moshi)
{                             //读取最终的数字量函数
      uint i, ans;
     SPI_Write(moshi);   
     for(i = 0; i < 5; i++);

      CLK = 1;
      _nop_();
     _nop_();
      CLK = 0;
     _nop_();
      _nop_();

     ans = GetValue();
     CS = 1;
     return ans;
}


void delay(unsigned char i)
{
        unsigned char j;
        for(i; i > 0; i--)
                for(j = 200; j > 0; j--);
}



void main()
{
       uchar i;
           uint j;
       uint d,temp,count=50;
       LCD_init();
       delayms(10);

       SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                             
           TMOD|= 0x20;      //定时器工作方式2                    
           PCON|= 0x80;                                                         
               
           TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无                 
           TR1  = 1;                                                            
       ES   = 1;        //开串口中断                  
           EA   = 1;        // 开总中断

       while(1){
       if(count == 50)
           {                           //每50下读取转换值,避免数字跳动太快
           temp = Read_AD_Data(0xE4);
           count = 0;

       }
      count++;

          RS485E=1;           //RS5485E=0为接收状态  RS5485E=1为发送状态  // max485(半双工通信) RE/DE定义 RE=0为接受状态  DE=1为发送状态(参考MAX485芯片管脚)  
          for(j=0;j<5;j++){
                  SBUF=disp[j];
           }           //发送数据
           delay(40);

          d=(double)temp*0.122;
          disp[0]=d/100+'0';
          disp[1]='.';
          disp[2]=d%100/10+'0';
          disp[3]=d%100%10+'0';         

          set_disp_pos(0x01);
          i=0;
          while(line1[i]!='\0')
          lcdwrd(line1[i++]);

          set_disp_pos(0x46);
          i=0;
          while(disp[i]!='\0')
          lcdwrd(disp[i++]);
          }
}

从机程序:
#include<reg51.h>
#include <stdio.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char       

//--定义全局变量--//
unsigned int ReData;
sbit RS485E=P3^7;   //定义485的使能脚
unsigned int ReData;

sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

uchar disp[]="0.00V";
uchar code line1[]="NOW VOL:";

void delay4us()
{   
    _nop_();
        _nop_();
        _nop_();
        _nop_();
}

void delayms(uint ms){
     uchar t;
     while(ms--)
     for(t=0;t<120;t++);
}
bit LCD_BUSY_CHECK(){
bit result;

    LCD1602_RS=0;
    LCD1602_RW=1;
    LCD1602_E=1;
    delay4us();
    result=(bit)(P0&0x80);
    LCD1602_E=0;
    return result;
}
void lcdwrc(uchar cmd)
{
           while(LCD_BUSY_CHECK());
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_E=0;
        _nop_();_nop_();
        P0=cmd;
        delay4us();
        LCD1602_E=1;
        delay4us();
        LCD1602_E=0;
}

void set_disp_pos(uchar pos)
{
    lcdwrc(pos|0x80);
}

void lcdwrd(uchar dat)
{
    while(LCD_BUSY_CHECK());
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_E=0;
        P0=dat;
        delay4us();
        LCD1602_E=1;
        delay4us();
        LCD1602_E=0;
}
void LCD_init()
{
   lcdwrc(0x38);
   delayms(1);
   lcdwrc(0x0c);
   delayms(1);
   lcdwrc(0x06);
   delayms(1);
   lcdwrc(0x01);
   delayms(1);
}


void delay(unsigned char i)
{
        unsigned char j;
        for(i; i > 0; i--)
                for(j = 200; j > 0; j--);
}


void main(void)
{
        uchar i;
        SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                             
        TMOD|= 0x20;      //定时器工作方式2                    
    PCON|= 0x80;                                                         
               
        TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无         
               
        TR1  = 1;                                                            
        ES   = 1;        //开串口中断                  
        EA   = 1;        // 开总中断

        LCD_init();
    delayms(10);

        while(1)
        {
                  set_disp_pos(0x01);
              i=0;
              while(line1[i]!='\0')
              lcdwrd(line1[i++]);
              set_disp_pos(0x46);
              i=0;
              while(disp[i]!='\0')
              lcdwrd(ReData);
                  RS485E=0;                    // RS5485E=0为接收状态  RS5485E=1为发送状态
              delay(20);
        }
                               
}


void ser_int (void) interrupt 4 using 1
{

if(RI == 1)        //RI接受中断标志
{
        RI = 0;                    //清除RI接受中断标志
        ReData = SBUF;  //SUBF接受/发送缓冲器
}
}









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

使用道具 举报

沙发
ID:123289 发表于 2019-7-30 08:08 | 只看该作者
方法,先完成下面两道题目:
1、把一个指定位置中的数,在LCD上显示出来。
2、给你一个数,你把它到一个指定的位置上。

回复

使用道具 举报

板凳
ID:548414 发表于 2019-7-30 09:09 | 只看该作者
yzwzfyz 发表于 2019-7-30 08:08
方法,先完成下面两道题目:
1、把一个指定位置中的数,在LCD上显示出来。
2、给你一个数,你把它到一个 ...

它每一位都在循环显示传过来的数
回复

使用道具 举报

地板
ID:548414 发表于 2019-7-30 14:37 | 只看该作者
自己解决了
回复

使用道具 举报

5#
ID:123289 发表于 2019-7-30 17:02 | 只看该作者
先不要急于忙着做你的通讯,先做我给你布置的两道题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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