找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1004|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)RS485通訊問題 無法與串口屏通訊 還不太懂這個(gè)要怎么配置

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1104510 發(fā)表于 2024-4-20 12:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
以上是我買的單片機(jī)成品板子的485通訊程序,我燒進(jìn)去,但是無法與串口屏通訊,請(qǐng)教各位大佬指點(diǎn)一二,本人剛?cè)腴T,還不太懂這個(gè)要怎么配置。

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

  3. #define ENABLE_IAP 0x83 //系統(tǒng)工作時(shí)鐘<12MHz 時(shí),對(duì)IAP_CONTR 寄存器設(shè)置此值
  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    //存儲(chǔ)地址


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

  14. uint8 sendPosi=0;     //發(fā)送緩沖區(qū)指針
  15. uint8 receCount=0;    //接收緩沖區(qū)指針
  16. uint8 sendCount=0;    //需要發(fā)送數(shù)據(jù)個(gè)數(shù)
  17. uint8 receTimeOut=0;  //通訊超時(shí)值
  18. uint8 byteCount=5;    //發(fā)送個(gè)數(shù)

  19. uint8 sendBuf[10];      //發(fā)送緩沖區(qū)
  20. uint8 receBuf[10];    //接收緩沖區(qū)

  21. /********************************************************************
  22.                            定義數(shù)據(jù)類型
  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;          //定義數(shù)據(jù)類型
  31. uint8 but[16];      //數(shù)據(jù)存儲(chǔ)數(shù)組
  32. /********************************************************************
  33.                             定義 ISP/IAP/EEPROM 命令
  34. *********************************************************************/

  35. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機(jī) 在 一 安全 狀態(tài)
  36. uint8 IapReadByte(uint16 addr);//讀數(shù)據(jù)
  37. void IapProgramByte(uint16 addr, uint8 dat);//寫數(shù)據(jù)
  38. void IapEraseSector(uint16 addr);//擦除數(shù)據(jù)


  39. void delay()//延時(shí)程序
  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. /****************發(fā)送函數(shù)*********************/
  47. void senduart2()
  48. {        RS485_DIR=1;
  49.         for(ii=0;ii<5;ii++)
  50.         {
  51.             if(TEND)      //允許發(fā)送
  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. /*****************清空發(fā)送緩沖區(qū)*************************/
  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);//讀取存儲(chǔ)的值
  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; //接收標(biāo)志清零
  88.          receBuf[r++&0x0F]=RBUF;     //把接受的數(shù)據(jù)存儲(chǔ)到BUT數(shù)組中
  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.             //起始位   地址位  功能位   數(shù)據(jù)位  結(jié)束位
  99.             if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))      //如果開始位和結(jié)束位,還有地址都正確,進(jìn)行下一步判斷
  100.             {
  101.                if(receBuf[2]==0x01)  //修改板子地址
  102.                {
  103.                     add=receBuf[3];
  104.                     IapEraseSector(0);  //擦除扇區(qū)
  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)  //關(guān)閉單路繼電器
  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)  //關(guān)閉全部繼電器
  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)  //查詢輸入狀態(tài)
  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);  //擦除扇區(qū)
  187.                     IapProgramByte(0x01,0x00);//寫入新的地址                  
  188.             }
  189.             clear_receBuf();
  190.         }
  191.     }
  192. }


  193. // /**********************************************************
  194. //放在主函數(shù),定時(shí)0溢出中斷函數(shù),
  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 單片機(jī) 在 一 安全 狀態(tài)
  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){//讀數(shù)據(jù)
  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){//寫數(shù)據(jù)
  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){//擦除數(shù)據(jù)
  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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1104510 發(fā)表于 2024-4-27 09:53 | 只看該作者
請(qǐng)各位大神賜教
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表