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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1435|回復: 2
打印 上一主題 下一主題
收起左側

關于單片機+RS485雙機通信接收機編程問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:548414 發表于 2019-7-29 14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如何把接受過來的AD值在從機lcd顯示呢??求指點!!!!!!
主機單片機程序
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include <stdio.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. void delay4us()
  7. {   
  8.     _nop_();
  9.         _nop_();
  10.         _nop_();
  11.         _nop_();
  12. }

  13. sbit RS485E=P3^7;   //定義485的使能腳

  14. sbit CLK  = P3^6;          //時鐘         
  15. sbit CS   = P3^5;          //片選
  16. sbit DIN  = P3^4;          //輸入
  17. sbit DOUT = P3^3;          //輸出

  18. sbit LCD1602_E=P2^7;
  19. sbit LCD1602_RW=P2^5;
  20. sbit LCD1602_RS=P2^6;

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

  23. void delayms(uint ms){
  24.      uchar t;
  25.      while(ms--)
  26.      for(t=0;t<120;t++);
  27. }
  28. bit LCD_BUSY_CHECK(){
  29. bit result;

  30.     LCD1602_RS=0;
  31.     LCD1602_RW=1;
  32.     LCD1602_E=1;
  33.     delay4us();
  34.     result=(bit)(P0&0x80);
  35.     LCD1602_E=0;
  36.     return result;
  37. }
  38. void lcdwrc(uchar cmd)
  39. {
  40.            while(LCD_BUSY_CHECK());
  41.         LCD1602_RS=0;
  42.         LCD1602_RW=0;
  43.         LCD1602_E=0;
  44.         _nop_();_nop_();
  45.         P0=cmd;
  46.         delay4us();
  47.         LCD1602_E=1;
  48.         delay4us();
  49.         LCD1602_E=0;
  50. }

  51. void set_disp_pos(uchar pos)
  52. {
  53.     lcdwrc(pos|0x80);
  54. }

  55. void lcdwrd(uchar dat)
  56. {
  57.     while(LCD_BUSY_CHECK());
  58.         LCD1602_RS=1;
  59.         LCD1602_RW=0;
  60.         LCD1602_E=0;
  61.         P0=dat;
  62.         delay4us();
  63.         LCD1602_E=1;
  64.         delay4us();
  65.         LCD1602_E=0;
  66. }
  67. void LCD_init()
  68. {
  69.    lcdwrc(0x38);
  70.    delayms(1);
  71.    lcdwrc(0x0c);
  72.    delayms(1);
  73.    lcdwrc(0x06);
  74.    delayms(1);
  75.    lcdwrc(0x01);
  76.    delayms(1);
  77. }

  78. void SPI_Write(uchar moshi)
  79. {                         //寫模式函數
  80.      uint i;
  81.      CS = 0;
  82.       for(i = 0; i < 8; i++){   
  83.           CLK = 0;
  84.          DIN = moshi>>7;
  85.          CLK = 1;
  86.          moshi <<= 1;
  87.     }
  88.      CLK = 0;
  89. }

  90. uint GetValue()
  91. {                     //讀取DOUT管腳,得到最終數字量函數
  92.      uint i, ans = 0;
  93.      for(i = 0; i < 12; i++){
  94.          CLK = 0;
  95.          ans <<= 1;
  96.          ans |= DOUT;
  97.          CLK = 1;
  98.     }
  99.      CLK = 0;
  100.      return ans;
  101. }

  102. uint Read_AD_Data(uchar moshi)
  103. {                             //讀取最終的數字量函數
  104.       uint i, ans;
  105.      SPI_Write(moshi);   
  106.      for(i = 0; i < 5; i++);

  107.       CLK = 1;
  108.       _nop_();
  109.      _nop_();
  110.       CLK = 0;
  111.      _nop_();
  112.       _nop_();

  113.      ans = GetValue();
  114.      CS = 1;
  115.      return ans;
  116. }


  117. void delay(unsigned char i)
  118. {
  119.         unsigned char j;
  120.         for(i; i > 0; i--)
  121.                 for(j = 200; j > 0; j--);
  122. }



  123. void main()
  124. {
  125.        uchar i;
  126.            uint j;
  127.        uint d,temp,count=50;
  128.        LCD_init();
  129.        delayms(10);

  130.        SCON = 0x50;      //REN=1允許串行接受狀態,串口工作模式1                              
  131.            TMOD|= 0x20;      //定時器工作方式2                    
  132.            PCON|= 0x80;                                                         
  133.                
  134.            TH1  = 0xFD;     //baud*2  /* reload value 19200、數據位8、停止位1。效驗位無                  
  135.            TR1  = 1;                                                            
  136.        ES   = 1;        //開串口中斷                  
  137.            EA   = 1;        // 開總中斷

  138.        while(1){
  139.        if(count == 50)
  140.            {                           //每50下讀取轉換值,避免數字跳動太快
  141.            temp = Read_AD_Data(0xE4);
  142.            count = 0;

  143.        }
  144.       count++;

  145.           RS485E=1;           //RS5485E=0為接收狀態  RS5485E=1為發送狀態  // max485(半雙工通信) RE/DE定義 RE=0為接受狀態  DE=1為發送狀態(參考MAX485芯片管腳)  
  146.           for(j=0;j<5;j++){
  147.                   SBUF=disp[j];
  148.            }           //發送數據
  149.            delay(40);

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

  155.           set_disp_pos(0x01);
  156.           i=0;
  157.           while(line1[i]!='\0')
  158.           lcdwrd(line1[i++]);

  159.           set_disp_pos(0x46);
  160.           i=0;
  161.           while(disp[i]!='\0')
  162.           lcdwrd(disp[i++]);
  163.           }
  164. }
復制代碼


從機程序:

  1. #include<reg51.h>
  2. #include <stdio.h>
  3. #include<intrins.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char        

  6. //--定義全局變量--//
  7. unsigned int ReData;
  8. sbit RS485E=P3^7;   //定義485的使能腳
  9. unsigned int ReData;

  10. sbit LCD1602_E=P2^7;
  11. sbit LCD1602_RW=P2^5;
  12. sbit LCD1602_RS=P2^6;

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

  15. void delay4us()
  16. {   
  17.     _nop_();
  18.         _nop_();
  19.         _nop_();
  20.         _nop_();
  21. }

  22. void delayms(uint ms){
  23.      uchar t;
  24.      while(ms--)
  25.      for(t=0;t<120;t++);
  26. }
  27. bit LCD_BUSY_CHECK(){
  28. bit result;

  29.     LCD1602_RS=0;
  30.     LCD1602_RW=1;
  31.     LCD1602_E=1;
  32.     delay4us();
  33.     result=(bit)(P0&0x80);
  34.     LCD1602_E=0;
  35.     return result;
  36. }
  37. void lcdwrc(uchar cmd)
  38. {
  39.            while(LCD_BUSY_CHECK());
  40.         LCD1602_RS=0;
  41.         LCD1602_RW=0;
  42.         LCD1602_E=0;
  43.         _nop_();_nop_();
  44.         P0=cmd;
  45.         delay4us();
  46.         LCD1602_E=1;
  47.         delay4us();
  48.         LCD1602_E=0;
  49. }

  50. void set_disp_pos(uchar pos)
  51. {
  52.     lcdwrc(pos|0x80);
  53. }

  54. void lcdwrd(uchar dat)
  55. {
  56.     while(LCD_BUSY_CHECK());
  57.         LCD1602_RS=1;
  58.         LCD1602_RW=0;
  59.         LCD1602_E=0;
  60.         P0=dat;
  61.         delay4us();
  62.         LCD1602_E=1;
  63.         delay4us();
  64.         LCD1602_E=0;
  65. }
  66. void LCD_init()
  67. {
  68.    lcdwrc(0x38);
  69.    delayms(1);
  70.    lcdwrc(0x0c);
  71.    delayms(1);
  72.    lcdwrc(0x06);
  73.    delayms(1);
  74.    lcdwrc(0x01);
  75.    delayms(1);
  76. }


  77. void delay(unsigned char i)
  78. {
  79.         unsigned char j;
  80.         for(i; i > 0; i--)
  81.                 for(j = 200; j > 0; j--);
  82. }


  83. void main(void)
  84. {
  85.         uchar i;
  86.         SCON = 0x50;      //REN=1允許串行接受狀態,串口工作模式1                              
  87.         TMOD|= 0x20;      //定時器工作方式2                    
  88.     PCON|= 0x80;                                                         
  89.                
  90.         TH1  = 0xFD;     //baud*2  /* reload value 19200、數據位8、停止位1。效驗位無         
  91.                
  92.         TR1  = 1;                                                            
  93.         ES   = 1;        //開串口中斷                  
  94.         EA   = 1;        // 開總中斷

  95.         LCD_init();
  96.     delayms(10);

  97.         while(1)
  98.         {
  99.                   set_disp_pos(0x01);
  100.               i=0;
  101.               while(line1[i]!='\0')
  102.               lcdwrd(line1[i++]);
  103.               set_disp_pos(0x46);
  104.               i=0;
  105.               while(disp[i]!='\0')
  106.               lcdwrd(ReData);
  107.                   RS485E=0;                    // RS5485E=0為接收狀態  RS5485E=1為發送狀態
  108.               delay(20);
  109.         }
  110.                                 
  111. }


  112. void ser_int (void) interrupt 4 using 1
  113. {

  114. if(RI == 1)        //RI接受中斷標志
  115. {
  116.          RI = 0;                    //清除RI接受中斷標志
  117.         ReData = SBUF;  //SUBF接受/發送緩沖器
  118. }
  119. }
復制代碼

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

使用道具 舉報

沙發
ID:548414 發表于 2019-7-29 19:48 | 只看該作者
從ReData怎么取出?詳細
回復

使用道具 舉報

板凳
ID:482138 發表于 2019-7-29 22:32 | 只看該作者
講詳細一點
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 尤物在线精品视频 | 岛国av在线免费观看 | 51ⅴ精品国产91久久久久久 | 国产精品亚洲欧美日韩一区在线 | 精品欧美一区二区三区精品久久 | 日日噜噜噜夜夜爽爽狠狠视频97 | 自拍偷拍中文字幕 | 国产乱一区二区三区视频 | 91性高湖久久久久久久久_久久99 | 国产精品1区2区3区 国产在线观看一区 | 中文字幕亚洲欧美 | 成人免费观看男女羞羞视频 | 亚洲精品一区二区三区蜜桃久 | 欧美片网站免费 | 搞黄视频免费看 | 国产成人一区在线 | h视频在线播放 | 成人一区二区三区在线观看 | 婷婷久久网 | 91视频91 | 久久国产精品视频 | 日韩视频二区 | 一级久久久久久 | 免费观看一级视频 | 黄免费观看视频 | 95国产精品| 久久精品亚洲 | 亚洲综合区 | 国产午夜精品视频 | 亚洲人在线 | 一级毛片成人免费看a | 亚洲中字在线 | 91在线观看免费视频 | 亚洲欧美精 | 日韩精品人成在线播放 | 国产视频二区 | 国产在线一区二区三区 | 欧美激情视频一区二区三区在线播放 | 日韩精品视频网 | 亚洲成人一区 | 81精品国产乱码久久久久久 |