找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1140|回复: 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. }
复制代码

回复

使用道具 举报

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 单片机教程网

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