找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3021|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)+RS485雙機(jī)通信接收機(jī)編程問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:548414 發(fā)表于 2019-7-29 19:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
16黑幣
如何把接受過來的AD值在從機(jī)lcd顯示呢??求指點(diǎn)。。。。!
主機(jī)單片機(jī)程序:
#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;          //時(shí)鐘         
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)
{                         //寫模式函數(shù)
     uint i;
     CS = 0;
      for(i = 0; i < 8; i++){   
          CLK = 0;
         DIN = moshi>>7;
         CLK = 1;
         moshi <<= 1;
    }
     CLK = 0;
}

uint GetValue()
{                     //讀取DOUT管腳,得到最終數(shù)字量函數(shù)
     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)
{                             //讀取最終的數(shù)字量函數(shù)
      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允許串行接受狀態(tài),串口工作模式1                             
           TMOD|= 0x20;      //定時(shí)器工作方式2                    
           PCON|= 0x80;                                                         
               
           TH1  = 0xFD;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無                 
           TR1  = 1;                                                            
       ES   = 1;        //開串口中斷                  
           EA   = 1;        // 開總中斷

       while(1){
       if(count == 50)
           {                           //每50下讀取轉(zhuǎn)換值,避免數(shù)字跳動(dòng)太快
           temp = Read_AD_Data(0xE4);
           count = 0;

       }
      count++;

          RS485E=1;           //RS5485E=0為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)  // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài)  DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)  
          for(j=0;j<5;j++){
                  SBUF=disp[j];
           }           //發(fā)送數(shù)據(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++]);
          }
}

從機(jī)程序:
#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允許串行接受狀態(tài),串口工作模式1                             
        TMOD|= 0x20;      //定時(shí)器工作方式2                    
    PCON|= 0x80;                                                         
               
        TH1  = 0xFD;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無         
               
        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為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)
              delay(20);
        }
                               
}


void ser_int (void) interrupt 4 using 1
{

if(RI == 1)        //RI接受中斷標(biāo)志
{
        RI = 0;                    //清除RI接受中斷標(biāo)志
        ReData = SBUF;  //SUBF接受/發(fā)送緩沖器
}
}









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-7-30 08:08 | 只看該作者
方法,先完成下面兩道題目:
1、把一個(gè)指定位置中的數(shù),在LCD上顯示出來。
2、給你一個(gè)數(shù),你把它到一個(gè)指定的位置上。

回復(fù)

使用道具 舉報(bào)

板凳
ID:548414 發(fā)表于 2019-7-30 09:09 | 只看該作者
yzwzfyz 發(fā)表于 2019-7-30 08:08
方法,先完成下面兩道題目:
1、把一個(gè)指定位置中的數(shù),在LCD上顯示出來。
2、給你一個(gè)數(shù),你把它到一個(gè) ...

它每一位都在循環(huán)顯示傳過來的數(shù)
回復(fù)

使用道具 舉報(bào)

地板
ID:548414 發(fā)表于 2019-7-30 14:37 | 只看該作者
自己解決了
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2019-7-30 17:02 | 只看該作者
先不要急于忙著做你的通訊,先做我給你布置的兩道題。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表