找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机双机Rs485通信问题,求前辈指点!

  [复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:574524 发表于 2020-2-8 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一主机,用STC8A8K64S4,一从机,用STC89C52,用开发板上的MAX485模块(两个),进行通信,一直无法实现,以下是主机和从机的程序,求指点。
主机程序:
  1. #include "stc8.h"
  2. #include "intrins.h"
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. #define FOSC 11059200L         
  6. #define BAUD 4800              
  7. #define BN 8
  8. bit busy;
  9. sbit RS485_DIR = P0^4;

  10. uchar rebuf[8];
  11. uchar trbuf[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x66,0xf8};

  12. void delay(unsigned int ms)
  13. {                                                
  14.         unsigned char i;
  15.         while(ms--)
  16.         {
  17.                 for(i=0;i<110;i++);
  18.         }
  19. }

  20. void master(uchar command)
  21. {
  22. uchar aa,i;
  23. RS485_DIR=1;
  24. S3BUF=command;
  25. while(S3TI==0);
  26.         delay(5);
  27.         S3CON &=  ~S3TI;
  28.         RS485_DIR=0;
  29.    while(!S3RI);
  30.    S3CON &= ~S3RI;        
  31.    aa=S3BUF;
  32. if(aa==0x02)
  33.   {
  34.   for(i=0;i<BN;i++)
  35.     {
  36.     while(!S3RI);
  37.     S3CON &= ~S3RI;        
  38.     rebuf[i]=S3BUF;
  39.     }
  40.   }
  41. if(aa==0x01)
  42.   {
  43.         RS485_DIR=1;
  44.   for(i=0;i<BN;i++)
  45.     {
  46.     S3BUF=trbuf[i];
  47.                  while(!S3TI);
  48.     S3CON &= ~S3TI;         
  49.     }
  50.   }        
  51. }
  52. void ConfigUART(uint Baud)
  53. {
  54.           RS485_DIR=1;
  55.     S3CON = 0x10;               
  56.     AUXR = 0x10;                              
  57.     T2L = (65536 - (FOSC/4/Baud/12));   
  58.     T2H = (65536 - (FOSC/4/Baud/12))>>8;
  59.          
  60. }

  61. void main()
  62. {
  63.   uchar j;
  64.     P_SW2 =0x00;            //(P0.0/RxD3, P0.1/TxD3)
  65.                    ConfigUART(BAUD);
  66. //                         EA = 1;
  67.      while(1)
  68.                  {
  69.                          master(0x01);
  70.                         master(0x02);
  71.                 for(j=0;j<BN;j++)
  72.                 {
  73.                         P2=rebuf[j];
  74.                         delay(10000);
  75.                 }        
  76.         }
  77. }
复制代码

从机程序:
  1. #include "reg52.h"                        
  2. typedef unsigned int uint;         
  3. typedef unsigned char uchar;
  4. sbit RS485DIR=P1^0;         
  5. uchar trbuf[8]={0x00,0xa4,0xf9,0x90,0xb0,0x92,0x66,0xff};
  6. uchar rebuf[8];

  7. void delay(uint i)
  8. {
  9.         int j;
  10.         while(i--)
  11.         {
  12. for(j=110;j>0;j--);
  13.         }               
  14. }


  15. void UsartInit()
  16. {        RS485DIR=0;
  17.         SCON=0X50;                        
  18.         TMOD=0X20;                        
  19.         PCON|=0X00;                        
  20.         TH1=0Xfa;                                
  21.         TL1=0Xfa;
  22.         TR1=1;                                       
  23.         EA=1;                                                
  24. }


  25. void main()
  26. {        
  27.         uchar j;
  28.         UsartInit();  
  29.         while(1)
  30.         {
  31.                 ES=1;                                                
  32.                 for(j=0;j<8;j++)
  33.                 {
  34.         P0=rebuf[j];
  35.         delay(1000);
  36.         }
  37. }
  38. }

  39. void Usart() interrupt 4
  40. {
  41.         uchar a,j,i;


  42.         RI = 0;
  43.         ES=0;
  44.         a=SBUF;
  45.         delay(100);
  46.   if(a==0x02)
  47.         {
  48.                 RS485DIR=1;
  49.         SBUF=0x02;
  50.         while(!TI);                          
  51.                 TI=0;                                                  
  52.         for(j=0;j<8;j++)
  53.         {
  54.         SBUF=trbuf[j];
  55.         while(!TI);
  56.         TI=0;               
  57.         }
  58.   }
  59.         if(a==0x01)
  60.         {
  61.                 RS485DIR=1;
  62.         SBUF=0x01;
  63.         while(!TI);                        
  64.                 TI=0;                                                
  65.         for(i=0;i<8;i++)
  66.         {
  67.         RS485DIR=0;
  68.         while(!RI);
  69.         RI=0;        
  70.         rebuf[i]=SBUF;
  71.                 }
  72.   }
  73. RS485DIR=0;
  74. ES=1;
  75. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-2-9 00:32 | 只看该作者
对于程序来说,只要波特率一致就可以了,重点检查两者配置的波特率是否一致
回复

使用道具 举报

板凳
ID:648281 发表于 2020-2-9 09:16 | 只看该作者
你好!
1、晶振和波特率要一致
2、485收发控制要做好
3、从简到繁逐步去调试
回复

使用道具 举报

地板
ID:574524 发表于 2020-2-9 11:41 | 只看该作者
波特率都是4800,STC8单片机P2收到的数据全是00,STC89C52,P0数据也是00
回复

使用道具 举报

5#
ID:77479 发表于 2020-2-10 12:37 | 只看该作者
第一步,晶振和波特率要匹配。 第二步,两块单片机板各自独立用 ttl to usb 与串口助手进行通信,先调通单片机与串口助手能通畅通信。第三步,在单片机与串口助手能通信的基础上,把串口助手换成单片机,调试两个单片机进行串口通信。   第四步,把232通信改成485通信。
回复

使用道具 举报

6#
ID:346434 发表于 2020-3-13 11:44 | 只看该作者
楼主先仿真试一下
回复

使用道具 举报

7#
ID:451718 发表于 2020-3-13 13:01 | 只看该作者
1.先从TTL端截取信号,通过TTL转USB到电脑调试一下,看信号发出来没有。
2.做485传输的时候,建议把公共地也对接起来。不然很容易出莫名其妙的问题。也就是A+,B-,还有GND三个信号。
3.注意A+,B-的对应,别搞反了。
回复

使用道具 举报

8#
ID:707641 发表于 2020-3-13 14:19 | 只看该作者
485通讯测试方法如下:
1:先测试通讯双方的TTL信号是否正常从TX引脚发出,若没有,首先检查代码关于串口配置是否正确(代码尽量简单),而检查芯片是否正常工作,比如芯片供电,晶振配置等等!若一致则走下一步
2:示波器抓取通讯双方的TTL的波特率是否一致,有时候即使波特率不一致能可以收到数据,不过是一些乱码,波特率若不一致,检查程序的波特率配置、
3:检查485收发是否正常工作,比如供电,控制收发引脚状态是否符合控制逻辑
4:测试线路导通性
回复

使用道具 举报

9#
ID:405079 发表于 2020-3-15 12:33 | 只看该作者
如果程序没问题的话检查一下485芯片是否与单片机共地
回复

使用道具 举报

10#
ID:708837 发表于 2020-3-15 14:11 | 只看该作者
楼主你可用先用TTL电平直连测试。以便区分是否是程序问题
回复

使用道具 举报

11#
ID:694586 发表于 2020-4-8 11:07 来自触屏版 | 只看该作者
我也用的这两个单片机,也是不能通讯
回复

使用道具 举报

12#
ID:25310 发表于 2020-4-8 17:41 | 只看该作者
IO口初始化一下,STC单片机IO口不初始化有些端口是不能用的:
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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