找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 599|回复: 1
收起左侧

单片机RS485通讯问题 无法与串口屏通讯 还不太懂这个要怎么配置

[复制链接]
ID:1104510 发表于 2024-4-20 12:02 | 显示全部楼层 |阅读模式
以上是我买的单片机成品板子的485通讯程序,我烧进去,但是无法与串口屏通讯,请教各位大佬指点一二,本人刚入门,还不太懂这个要怎么配置。

  1. #include "main.h"
  2. #include "init.h"

  3. #define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
  4. #define CMD_IDLE 0
  5. #define CMD_READ 1
  6. #define CMD_PROGRAM 2
  7. #define CMD_ERASE 3
  8. #define ENABLE_IAP 0x83//SYSCLK<12MH
  9. #define IAP_ADDRESS 0x0000    //存储地址


  10. uint8 add;    //掉电保持485的地址
  11. uint8 j=0;
  12. uint8 dat=0X00;   
  13. bit flag_zx=0;

  14. uint8 sendPosi=0;     //发送缓冲区指针
  15. uint8 receCount=0;    //接收缓冲区指针
  16. uint8 sendCount=0;    //需要发送数据个数
  17. uint8 receTimeOut=0;  //通讯超时值
  18. uint8 byteCount=5;    //发送个数

  19. uint8 sendBuf[10];      //发送缓冲区
  20. uint8 receBuf[10];    //接收缓冲区

  21. /********************************************************************
  22.                            定义数据类型
  23. *********************************************************************/
  24. uint8 TBUF,RBUF;
  25. uint8 TDAT,RDAT;
  26. uint8 TCNT,RCNT;
  27. uint8 TBIT,RBIT;
  28. bit TING,RING;
  29. bit TEND,REND;

  30. uint8 t,r,ii;          //定义数据类型
  31. uint8 but[16];      //数据存储数组
  32. /********************************************************************
  33.                             定义 ISP/IAP/EEPROM 命令
  34. *********************************************************************/

  35. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  36. uint8 IapReadByte(uint16 addr);//读数据
  37. void IapProgramByte(uint16 addr, uint8 dat);//写数据
  38. void IapEraseSector(uint16 addr);//擦除数据


  39. void delay()//延时程序
  40. {
  41.     uint8 m,n,s;
  42.     for(m=100;m>0;m--)
  43.     for(n=200;n>0;n--)
  44.     for(s=248;s>0;s--);
  45. }




  46. /****************发送函数*********************/
  47. void senduart2()
  48. {        RS485_DIR=1;
  49.         for(ii=0;ii<5;ii++)
  50.         {
  51.             if(TEND)      //允许发送
  52.             {
  53.                  TEND=0;
  54.                  TBUF=sendBuf[t++&0x0F];
  55.                  TING=1;
  56.             }
  57.             while(!TEND);
  58.         }
  59.         t=0;
  60.         RS485_DIR=0;
  61. }
  62. /*****************清空发送缓冲区*************************/
  63. void clear_receBuf()
  64. {
  65.     uint8 i;
  66.     for(i=0;i<5;i++)
  67.     {
  68.         receBuf[i]=0;
  69.     }
  70. }
  71. void main()
  72. {
  73.      delay();
  74.     clear_receBuf();
  75.     add= IapReadByte(0x01);//读取存储的值
  76.     if(add==0xff)
  77.        add=0x00;
  78.     ConfigUART1();
  79.     TR0=1;
  80.     EA=1;
  81.    
  82.                

  83.     while(1)
  84.     {  
  85.        if(REND)  //如果有接收
  86.        {
  87.          REND=0; //接收标志清零
  88.          receBuf[r++&0x0F]=RBUF;     //把接受的数据存储到BUT数组中
  89.          if(r>=5)
  90.          {    r=0;

  91.             flag_zx=1;
  92.          }
  93.        }
  94.        if(flag_zx==1)
  95.        {            

  96.             flag_zx=0;
  97.             //0         1       2       3        4        
  98.             //起始位   地址位  功能位   数据位  结束位
  99.             if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))      //如果开始位和结束位,还有地址都正确,进行下一步判断
  100.             {
  101.                if(receBuf[2]==0x01)  //修改板子地址
  102.                {
  103.                     add=receBuf[3];
  104.                     IapEraseSector(0);  //擦除扇区
  105.                     IapProgramByte(0x01,add);//写入新的地址                  
  106.                }
  107.                else if(receBuf[2]==0x02)  //打开单路继电器
  108.                {
  109.                        switch(receBuf[3])
  110.                     {
  111.                         case 0x01: COM1=0; break;
  112.                         case 0x02: COM2=0; break;
  113.                         case 0x03: COM3=0; break;
  114.                         case 0x04: COM4=0; break;
  115.                         default:break;
  116.                     }
  117.                }
  118.                else if(receBuf[2]==0x03)  //关闭单路继电器
  119.                {
  120.                        switch(receBuf[3])
  121.                     {
  122.                         case 0x01: COM1=1; break;
  123.                         case 0x02: COM2=1; break;
  124.                         case 0x03: COM3=1; break;
  125.                         case 0x04: COM4=1; break;
  126.                         default:break;
  127.                     }               
  128.                }
  129.                else if(receBuf[2]==0x04)  //打开全部继电器
  130.                {
  131.                     if(receBuf[3]==0xff)
  132.                     {
  133.                         COM1=0; COM2=0; COM3=0;COM4=0;
  134.                     }  
  135.                }
  136.                else if(receBuf[2]==0x05)  //关闭全部继电器
  137.                {
  138.                     if(receBuf[3]==0x00)
  139.                     {
  140.                         COM1=1; COM2=1; COM3=1; COM4=1;
  141.                     }               
  142.                }
  143.                else if(receBuf[2]==0x06)  //查询继电器
  144.                {
  145.                     sendBuf[0]=0xaa;
  146.                     sendBuf[1]=add;
  147.                     sendBuf[2]=0x07;
  148.                     //sendBuf[3]=0xfe;
  149.                     sendBuf[4]=0xbb;   
  150.                    switch(receBuf[3])
  151.                    {
  152.                        case 0x01: if(COM1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  153.                        case 0x02: if(COM2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  154.                        case 0x03: if(COM3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  155.                        case 0x04: if(COM4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  156.                        default:break;
  157.                    }  
  158.                    senduart2();
  159.                }
  160.                else if(receBuf[2]==0x08)  //查询输入状态
  161.                {
  162.                     sendBuf[0]=0xaa;
  163.                     sendBuf[1]=add;
  164.                     sendBuf[2]=0x09;
  165.                     //sendBuf[3]=0xfe;
  166.                     sendBuf[4]=0xbb;
  167.                
  168.                    switch(receBuf[3])
  169.                    {
  170.                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  171.                        case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  172.                        case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  173.                        case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  174.                        case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  175.                        case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  176.                        case 0x07: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  177.                        case 0x08: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  178.                        default:break;
  179.                    }  
  180.                     senduart2();
  181.                }              
  182.             }
  183.             if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  184.             {
  185.                     add=0x00;
  186.                     IapEraseSector(0);  //擦除扇区
  187.                     IapProgramByte(0x01,0x00);//写入新的地址                  
  188.             }
  189.             clear_receBuf();
  190.         }
  191.     }
  192. }


  193. // /**********************************************************
  194. //放在主函数,定时0溢出中断函数,
  195. //*********************/
  196. void tm0()interrupt 1 using 1
  197. {
  198. if(RING)
  199.   {
  200.    if(--RCNT==0)
  201.     {
  202.      RCNT=3;
  203.      if(--RBIT==0)
  204.         {
  205.          RBUF=RDAT;
  206.          RING=0;
  207.          REND=1;
  208.         }
  209.         else
  210.         {
  211.          RDAT>>=1;
  212.          if(RXB)RDAT|=0X80;
  213.         }

  214.     }
  215.   }
  216.     else if(!RXB)
  217.     {
  218.      RING=1;
  219.      RCNT=4;
  220.      RBIT=9;
  221.     }
  222.     if(--TCNT==0)
  223.     {
  224.     TCNT=3;


  225.     if(TING)
  226.     {
  227.       if(TBIT==0)
  228.       {
  229.       TXB=0;
  230.       TDAT=TBUF;
  231.       TBIT=9;
  232.       }
  233.       else
  234.       {
  235.       TDAT>>=1;
  236.       if(--TBIT==0)
  237.       {
  238.        TXB=1;
  239.        TING=0;
  240.        TEND=1;
  241.       }
  242.       else
  243.       {
  244.       TXB=CY;
  245.       }
  246.       }
  247.     }
  248.     }
  249. }
  250. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  251.     IAP_CONTR = 0;       //
  252.     IAP_CMD = 0;       //
  253.     IAP_TRIG = 0;       //
  254.     IAP_ADDRH = 0x80;  //
  255.     IAP_ADDRL = 0;       //
  256. }
  257. uint8 IapReadByte(uint16 addr){//读数据
  258.    uint8 dat;
  259.    IAP_CONTR = ENABLE_IAP;
  260.    IAP_CMD = CMD_READ;
  261.    IAP_ADDRL = addr;
  262.    IAP_ADDRH = addr >> 8;
  263.    IAP_TRIG = 0x5A;
  264.    IAP_TRIG = 0xA5;
  265.    _nop_();
  266.    dat = IAP_DATA;
  267.    IapIdle();
  268.    return dat;
  269. }
  270. void IapProgramByte(uint16 addr, uint8 dat){//写数据
  271.    IAP_CONTR = ENABLE_IAP;
  272.    IAP_CMD = CMD_PROGRAM;
  273.    IAP_ADDRL = addr;
  274.    IAP_ADDRH = addr >> 8;
  275.    IAP_DATA = dat;
  276.    IAP_TRIG = 0x5A;
  277.    IAP_TRIG = 0xA5;
  278.    _nop_();
  279.    IapIdle();
  280. }
  281. void IapEraseSector(uint16 addr){//擦除数据
  282.    IAP_CONTR = ENABLE_IAP;
  283.    IAP_CMD = CMD_ERASE;
  284.    IAP_ADDRL = addr;
  285.    IAP_ADDRH = addr >> 8;
  286.    IAP_TRIG = 0x5A;
  287.    IAP_TRIG = 0xA5;
  288.    _nop_();
  289.    IapIdle();
  290. }
复制代码
回复

使用道具 举报

ID:1104510 发表于 2024-4-27 09:53 | 显示全部楼层
请各位大神赐教
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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