久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2985|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费看91 | 精品欧美一区二区三区久久久 | 日韩视频―中文字幕 | 中文字幕一区在线观看视频 | 日韩免费视频一区二区 | 蜜桃精品视频在线 | 亚欧洲精品在线视频免费观看 | 欧美男人天堂 | 综合久久av | 在线观看国产视频 | 毛片站 | 久久九 | 亚洲精品在线视频 | 麻豆久久久久久 | 嫩呦国产一区二区三区av | 丁香五月网久久综合 | 国产 欧美 日韩 一区 | 欧美日韩一区在线 | 欧美日韩综合视频 | 精品九九 | 久久99网站| 国产一区二区在线免费观看 | 91色视频在线观看 | 午夜爽爽爽男女免费观看影院 | 亚洲欧美在线视频 | 欧美日韩亚洲系列 | 99热在线播放| 免费一区二区 | 精品国产欧美一区二区三区成人 | 日日夜夜精品视频 | 欧美一区二区在线看 | 成年人在线观看 | 很黄很污的网站 | 国产在线精品区 | 午夜欧美a级理论片915影院 | 久久精品视频播放 | 欧美一级全黄 | 国产一区二区精 | 影音先锋久久 | 久久国产视频播放 | 国产一级免费视频 |