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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 977|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 无码日韩精品一区二区免费 | 久草精品视频 | 午夜在线精品 | 亚洲视频二区 | 一区二区三区四区日韩 | 久久久久久成人 | 在线看片网站 | 国产一区亚洲二区三区 | 日韩中文字幕在线观看视频 | 91亚洲精品久久久电影 | 97高清国语自产拍 | 亚洲精品一区二区三区在线 | 在线播放日韩 | 国产高清无av久久 | 一区视频在线 | 天天爽夜夜骑 | 黄色免费在线观看 | 日韩在线不卡 | heyzo在线| 久久久久久亚洲精品不卡 | 国产精品夜夜春夜夜爽久久电影 | 日韩精品一区二区三区在线播放 | 精品国产免费一区二区三区五区 | 网站黄色在线免费观看 | jizz18国产 | 久久久久久国产精品免费免费狐狸 | 久久久久久国产 | 欧美一区二区三区四区五区无卡码 | 国产精品美女视频 | 亚洲国产专区 | 亚洲国产精品人人爽夜夜爽 | 亚洲毛片在线观看 | 久久久久久免费精品一区二区三区 | 久久久久国产 | 午夜精品久久久久久久星辰影院 | 欧美黄色大片在线观看 | 欧美精品在线一区 | 国产一区二区久久 | 亚洲一区二区三区四区五区中文 | 人人干视频在线 | 欧美精品一区久久 |