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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1956|回復: 6
打印 上一主題 下一主題
收起左側(cè)

簡化版的modbus協(xié)議一帶二通信系統(tǒng),MCU不能成功通信,求告知原因?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:479916 發(fā)表于 2019-3-25 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
     打算設(shè)計一套一主二從的多機通信系統(tǒng)。主機發(fā)送自己的供電狀態(tài)給從機,讀取從機的掃描的按鍵數(shù)據(jù)。由于系統(tǒng)功能比較簡單,考慮到modbus協(xié)議相對來說挺復雜,所以設(shè)計了一個簡化的通信協(xié)議:1、主機、從機UART均為模式1。主機發(fā)送2個字節(jié)的數(shù)據(jù)給從機,第1個字節(jié)為地址字節(jié),尋址,第2個字節(jié)是數(shù)據(jù)字節(jié),用來將主機的供電狀態(tài)發(fā)給從機,并讀取從機按鍵狀態(tài)。2個從機,有時候2臺都接入系統(tǒng),有時候只有1臺接入系統(tǒng)。此為設(shè)計功能要求。
     設(shè)計中,在程序初始化時,主機發(fā)送一次數(shù)據(jù)給從機0x01,啟動通信。然后進入while(1)循環(huán)。在循環(huán)中,定時讀取供電狀態(tài),調(diào)用串口驅(qū)動函數(shù)。通信過程:啟動通信后,主機接收從機的數(shù)據(jù),1,接收成功,解析地址,地址解析相符的話,解析數(shù)據(jù),有數(shù)據(jù),執(zhí)行數(shù)據(jù),并再次發(fā)送數(shù)據(jù)給0x01,無數(shù)據(jù),尋址另一臺從機。2、接收成功,解析地址,不相符,尋址另一臺從機,3、計時時間內(nèi),未收到數(shù)據(jù),認為接收失敗,尋址另一臺從機。
    串口接收2個字節(jié)為1幀數(shù)據(jù),接收2個字節(jié)完成后,即認為數(shù)據(jù)接受完成,置位幀接收完成標志。   
    從機接收主機發(fā)來的2個字節(jié)的數(shù)據(jù),同樣進行地址、數(shù)據(jù)解析,完成后,回發(fā)數(shù)據(jù)給主機。
   上述為通信流程。帖程序:

主機程序:
main.c:
  1. # define _MAIN_C
  2. # include "config.h"
  3. # include "tmr_uart.h"
  4. # include "action.h"
  5. # include "main.h"




  6. uchar8 OCBuf[]={0xFF,0xFF};
  7. bit OCflag=0;                                                                                //過流標志
  8. //uchar8 Powflag;
  9. uchar8 PowSta=0xFF;                                                                        //供電狀態(tài)標志
  10. uchar8 PowCNTR=0;                                                                        //供電采集計數(shù)
  11. uchar8 TxdBuf[2]={0xFF,0xFF};                                                       //發(fā)送緩沖
  12. uchar8 buf[2];
  13. bit Txdflag=0;                                                                                //字節(jié)發(fā)送標志
  14. uchar8 RxdBuf[2];                                                                        //接收緩沖
  15. uchar8 cntRxd=0;                                                                        //接收計數(shù)
  16. bit RxFr_Succ=0;                                                                        //幀接收成功標志。
  17. bit TxFr_Succ=0;                                                                        //幀發(fā)送成功標志
  18. bit RxFr_Fail=0;                                                                               //幀接收失敗標志
  19. uchar8 sl_select=0;                                                                        //從機選擇索引


  20. void main()
  21. {
  22.         ROE=1;        RA3=1;        RA2=1;        RA1=1;                                        //釋放所有輸出
  23.         Buz=0;                                                                                        //蜂鳴器響
  24.         DelayX50ms(5);                                                                               //
  25.         Buz=1;                                                                                        //蜂鳴器關(guān)
  26.         P1=0x00;                                                                                      //數(shù)據(jù)管全亮,檢測數(shù)據(jù)管是否正常
  27.         DelayX50ms(5);
  28.         P1=0xFF;                                                                                    //關(guān)閉數(shù)據(jù)管
  29.         DIR_485=0;                                                                            //485通信處于接收狀態(tài)
  30.         ConfigTimer0();                                                                      //配置定時器0
  31.         ConfigUART();                                                                        //配置UART
  32.         UartSend(0x01);                                                                          //發(fā)送數(shù)據(jù)給從機0x01.
  33.         while(1)
  34.         {
  35.                 OCProtect();                                                                //檢測過流保護
  36.                 PowCheck(10);                                                                //檢測供電狀態(tài)
  37.                 UartDriver();                                                             //串口驅(qū)動
  38.         }
  39. }
  40. //串口驅(qū)動
  41. void UartDriver()
  42. {
  43.         switch(sl_select)
  44.         {
  45.                 case 0: if(RxFr_Succ)                                                                                //接收數(shù)據(jù)成功
  46.                                 {
  47.                                         RxFr_Succ=0;
  48.                                         UartReceive();                                                                        //串口讀數(shù)據(jù)
  49.                                         UartAction(0xF1);                                                                //接收數(shù)據(jù)解析(含地址)
  50.                                         if((buf[1]>=0x03)&&(buf[1]<=0x11))                                  //buf[1]>=0x03,且小于0x11,表示有數(shù)據(jù)
  51.                                         {
  52.                                                 UartSend(0x01);                                                                //繼續(xù)發(fā)數(shù)據(jù)給0x01從機
  53.                                         }
  54.                                         else                                                                                   //無數(shù)據(jù)
  55.                                         {
  56.                                                 sl_select++;                                                              //從機選擇索引+1
  57.                                                 UartSend(0x02);                                                                //給0x02發(fā)數(shù)據(jù)
  58.                                         }
  59.                                        
  60.                                 }
  61.                                 if(RxFr_Fail)                                                                                //接收數(shù)據(jù)失敗,(此從機不在線)
  62.                                 {
  63.                                         RxFr_Fail=0;
  64.                                         UartSend(0xF2);                                                                        //給0x02發(fā)數(shù)據(jù)
  65.                                         sl_select++;                                                                        //從機選擇索引+1
  66.                                 }
  67.                                 break;
  68.                 case 1: if(RxFr_Succ)                                                                                  //接收數(shù)據(jù)成功
  69.                                 {
  70.                                         RxFr_Succ=0;
  71.                                         UartReceive();                                                                       
  72.                                         if((buf[1]>=0x03)&&(buf[1]<=0x11))                                   //有數(shù)據(jù)
  73.                                         {
  74.                                                 UartSend(0x02);                                                               //繼續(xù)給從機0x02發(fā)數(shù)據(jù)
  75.                                         }
  76.                                         else                                                                                 //無數(shù)據(jù)
  77.                                         {
  78.                                                 sl_select--;                                                                //從機索引-1
  79.                                                 UartSend(0x01);                                                        //發(fā)送數(shù)據(jù)給0x01
  80.                                         }
  81.                                 }
  82.                                 if(RxFr_Fail)                                                                                //數(shù)據(jù)接收失敗(此從機不在線)
  83.                                 {
  84.                                         RxFr_Fail=0;
  85.                                         UartSend(0x01);                                                                        //發(fā)送數(shù)據(jù)給0x01
  86.                                         sl_select--;                                                                                //索引-1
  87.                                 }
  88.                                 break;
  89.                 default:sl_select=0; break;
  90.         }
  91. }
  92. //串口發(fā)送函數(shù),只發(fā)送2個字節(jié).
  93. void UartSend(uchar8 addr)
  94. {
  95.         uchar8 len=0;
  96.         DIR_485=1;
  97.         TxdBuf[0]=addr;                                                                           //將要發(fā)送的從機的地址裝入發(fā)送緩沖內(nèi)
  98.         while(len<2)
  99.         {
  100.                 Txdflag=0;
  101.                 SBUF=TxdBuf[len++];
  102.                 while(!Txdflag);
  103.         }
  104.         TxFr_Succ=1;                                                                                //置位發(fā)送成功標志
  105.         DelayX10us(5);
  106.         DIR_485=0;
  107. }
  108. //串口接收函數(shù)
  109. void UartReceive()
  110. {
  111.         uchar8 len=0;
  112.         uchar8 buf[2];
  113.         while(len<2)
  114.         {
  115.                 buf[len++]=RxdBuf[len++];
  116.         }
  117.         DelayX10us(5);
  118. }
  119. //串口中斷函數(shù)
  120. void InterruptUART() interrupt 4
  121. {
  122.         if(RI)
  123.         {
  124.                 RI=0;
  125.                 RxdBuf[cntRxd++]=SBUF;
  126.                 if(cntRxd>=2)
  127.                 {
  128.                         cntRxd=0;
  129.                         RxFr_Succ=1;                                //接收成功
  130.                         RxFr_Fail=0;
  131.                         TxFr_Succ=0;
  132.                 }
  133.         }
  134.         if(TI)
  135.         {
  136.                 TI=0;
  137.                 Txdflag=1;
  138.         }
  139. }
  140. //T0中斷函數(shù)
  141. void InterruptTimter0() interrupt 1
  142. {
  143.         static uchar8 i=0;                                        //1yá÷Ë÷òy
  144.         static uchar8 j=0;                                        //供電索引
  145.         static uchar8 k=0;                                        //串口發(fā)送計時
  146.         TH0=0xF8;
  147.         TL0=0xCC;                                                        //2ms
  148. //過流檢測,同時躲過電機啟動瞬間的尖峰電流
  149.         OCBuf[0]=(OCBuf[0]<<1)|GL1;
  150.         OCBuf[1]=(OCBuf[1]<<1)|GL2;
  151.         if((OCBuf[0]==0x00)||(OCBuf[1]==0x00))
  152.         {
  153.                 i++;
  154.                 OCBuf[0]=0xFF;
  155.                 OCBuf[1]=0xFF;
  156.                 if(i>=2)
  157.                 {
  158.                         i=0;
  159.                         OCflag=1;
  160.                 }
  161.         }
  162. //供電狀態(tài)檢測
  163.         PowSta=(PowSta<<1)|DcBat;                       
  164.         j++;
  165.         if(j>=8)
  166.         {
  167.                 j=0;
  168.                 PowCNTR++;
  169.         }
  170. //通信接收計時,TxFr_Succ為發(fā)送成功標志,RxFr_Succ為接收成功標志(置位表示接收成功,不置位不代表接收失敗).RxFr_Fail接收失敗標志,(置位表示接收失敗,不置位不代表接收成功)
  171.         if((TxFr_Succ)&&(!(RxFr_Succ)))                        //數(shù)據(jù)發(fā)送成功,但尚未接收到,開始計時
  172.         {
  173.                 k++;
  174.                 if(k>=20)                                                        //計時40ms
  175.                 {
  176.                         k=0;
  177.                         RxFr_Fail=1;                                        //接收失敗,(從機不在線)
  178.                         TxFr_Succ=0;                                        //
  179.                 }
  180.                        
  181.         }
  182.         else                                                                        //計時清0,從數(shù)據(jù)發(fā)送成功開始計時,數(shù)據(jù)未發(fā)送成功,不計時,k清0,數(shù)據(jù)接收
  183.         {                                                                       //成功后,k清0.
  184.                 k=0;
  185.         }
  186. }

  187. 定時器,UART,過流檢測,供電狀態(tài)檢測,延時函數(shù)
  188. # define _TMR_UART_C
  189. # include "config.h"
  190. # include "tmr_uart.h"
  191. # include "main.h"


  192. //T0配置函數(shù)
  193. void ConfigTimer0()
  194. {
  195.         TMOD&=0xF0;                 
  196.         TMOD|=0x01;                 
  197.         TF0=0;                        
  198.         TH0=0xF8;               
  199.         TL0=0xCC;                 
  200.         ET0=1;                        
  201.         TR0=1;                        
  202.         EA=1;                        
  203. }
  204. /*UART配置函數(shù)*/
  205. void ConfigUART()
  206. {
  207.         SCON=0x50;                                                                //ÅäÖÃ′®¿úÎa·½ê½1£¬8λUART,2¨ìØÂê¿é±ä
  208.         TMOD&=0x0F;                                                                //ÇåáãT1¿ØÖÆÎ»¡£
  209.         TMOD|=0x20;                                                                //ÅäÖÃT1ÎaÄ£ê½2.
  210.         TH1=0xFD;
  211.         TL1=TH1;                                                                          //2¨ìØÂê9600
  212.         ES=1;                                                                        //¿aÆô′®¿úÖD¶Ï
  213.         ET1=0;                                                                        //½ûÖ1T1ÖD¶Ï
  214.         TR1=1;                                                                        //Æô¶ˉT1                       
  215. }
  216. /*過流檢測函數(shù)*/
  217. void OCProtect()                                                                   //n*40ms½øDDò»′Î1yá÷ÅD¶Ï
  218. {
  219.         if(OCflag)                                                                //ÖμÎa0x00,±íê¾òѾ-2úéú1yá÷¡£
  220.         {      
  221.                 ROE=1;RA3=1;RA2=1;RA1=1;                        //½«¿ØÖƼìμçÆ÷òy½Åè«2¿à-¸ß£¬êí·ÅËùóD¼ìμçÆ÷¡£
  222.                 while(1)
  223.                 {
  224.                         Buz=!Buz;                                               
  225.                         DelayX50ms(5);                                        //·äÃùÆ÷ÿ¸ô1SÏìò»′Ρ£
  226.                 }
  227.         }
  228. }
  229. //供電狀態(tài)檢測函數(shù)
  230. void PowCheck(uchar8 t)
  231. {
  232.         if(PowCNTR>=t)
  233.         {
  234.                 PowCNTR=0;
  235.                 if(PowSta==0xFF)
  236.                 {      
  237.                         TxdBuf[1]=0x12;                                        //將供電狀態(tài)變量賦給發(fā)送緩沖
  238.                 }
  239.                 else if(PowSta==0x00)
  240.                 {
  241.                         TxdBuf[1]=0x13;                                        //將供電狀態(tài)變量賦給發(fā)送緩沖
  242.                 }
  243.                 else;
  244.         }
  245. }
  246. /*延時函數(shù)*/
  247. void DelayX50ms(uchar8 t)                //@11.0592MHz
  248. {
  249.         uchar8 i, j,k;
  250.         i = 5;
  251.         j = 121;
  252.         for(k=0;k<t;k++)
  253.         {
  254.                 do
  255.                 {
  256.                         while (--j);
  257.                 }
  258.                 while (--i);
  259.         }
  260. }
  261. //延時函數(shù)
  262. void DelayX10us(uchar8 t)
  263. {
  264.         do{
  265.                 _nop_();
  266.                 _nop_();
  267.                 _nop_();
  268.                 _nop_();
  269.                 _nop_();
  270.                 _nop_();
  271.                 _nop_();
  272.                 _nop_();
  273.         }while(--t);
  274. }

  275. # define _ACTION_C
  276. # include "config.h"
  277. # include "action.h"
  278. # include "main.h"


  279. //串口數(shù)據(jù)解析函數(shù)
  280. void UartAction(uchar8 addr)
  281. {
  282.         if(buf[0]!=addr)                                                                //ê×Ïèo˶ÔμØÖ·£¬2»êÇ′ó»úF1·¢à′μÄêy¾Y£¬Ö±½ó·μ»Ø
  283.         {
  284.                 return;
  285.         }
  286.         switch(buf[1])
  287.         {
  288.                 case 0x03:ReturnPos(addr);break;
  289.                 case 0x04:ROE=0;RA3=0;RA2=0;RA1=0; LedDisp(1); break;                 //C1PÎaμíμçÆ½
  290.                 case 0x05:ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(2); break;                 //C2PÏòí·Æ½òÆ
  291.                 case 0x06:ROE=1;RA3=0;RA2=1;RA1=0; LedDisp(5); break;                 //C5P±3°åéÏéy
  292.                 case 0x07:ROE=0;RA3=1;RA2=1;RA1=0; LedDisp(11);break;                         //1#Y6  é23μ
  293.                 case 0x08:ROE=0;RA3=0;RA2=1;RA1=1; LedDisp(7); break;                    //C2NÏò½ÅƽòÆ
  294.                 case 0x09:ROE=1;RA3=0;RA2=1;RA1=1; LedDisp(10);break;                //C5N±3°åϽμ
  295.                 case 0x0A:ROE=0;RA3=0;RA2=0;RA1=1; LedDisp(6); break;                //C1NϽμ
  296.                 case 0x0B:ROE=1;RA3=1;RA2=0;RA1=0; LedDisp(13);break;                //2#Y4  Ñüéy
  297.                 case 0x0C:ROE=1;RA3=0;RA2=0;RA1=0; LedDisp(4); break;                //C4P×óÇã
  298.                 case 0x0D:ROE=0;RA3=1;RA2=1;RA1=1; LedDisp(12);break;                //1#Y7 Ëéé23μ
  299.                 case 0x0E:ROE=0;RA3=1;RA2=0;RA1=1; LedDisp(8); break;                //C3Ní·½μ½Åéy
  300.                 case 0x0F:ROE=1;RA3=1;RA2=0;RA1=1; LedDisp(14);break;                //2#Y5  Ñü½μ
  301.                 case 0x10:ROE=0;RA3=1;RA2=0;RA1=0; LedDisp(3); break;                //C3Pí·éy½Å½μ
  302.                 case 0x11:ROE=1;RA3=0;RA2=0;RA1=1; LedDisp(9); break;                //C4NóòÇã      
  303.                 case 0xFF:ROE=1;RA3=1;RA2=1;RA1=1; LedDisp(19);break;                //êí·ÅËùóD¼ìμçÆ÷
  304.                 default:ROE=1;RA3=1;RA2=1;RA1=1;Dis_Pin=0xFF;break;
  305.         }
  306. }
  307. //LED顯示函數(shù)
  308. void LedDisp(uchar8 temp)
  309. {
  310.         switch(temp)
  311.         {
  312.                 case 1:  Dis_Pin=0x9F;break;        //9F:1001 1111 ÏÔê¾1
  313.                 case 2:  Dis_Pin=0x31;break;        //31:1010 1110 ÏÔê¾2
  314.                 case 3:  Dis_Pin=0x15;break;        //15:                   ÏÔê¾3
  315.                 case 4:  Dis_Pin=0x9C;break;        //                           ÏÔê¾4
  316.                 case 5:  Dis_Pin=0x54;break;        //                           ÏÔê¾5
  317.                 case 6:  Dis_Pin=0x8F;break;        //                           ÏÔê¾1.
  318.                 case 7:  Dis_Pin=0x21;break;        //                           ÏÔê¾2.
  319.                 case 8:  Dis_Pin=0x05;break;        //                           ÏÔê¾3.
  320.                 case 9:  Dis_Pin=0x8C;break;        //                           ÏÔê¾4.
  321.                 case 10: Dis_Pin=0x44;break;        //                       ÏÔê¾5.
  322.                 case 11: Dis_Pin=0x50;break;        //                           ÏÔê¾6
  323.                 case 12: Dis_Pin=0x40;break;        //                           ÏÔê¾6.
  324.                 case 13: Dis_Pin=0x1F;break;        //                           ÏÔê¾7
  325.                 case 14: Dis_Pin=0x0F;break;        //                           ÏÔê¾7.
  326.                 default: Dis_Pin=0x00;break;
  327.         }
  328. }
  329. //復位函數(shù)
  330. void ReturnPos(uchar8 addr)
  331. {
  332.         if(RW5==0)
  333.         {      
  334.                 ROE=1;RA3=0;RA2=1;RA1=0; LedDisp(5);                                //±3°åéÏéy
  335.                 while(RW5==0)
  336.                 {
  337.                         ReAction(addr);
  338.                 }
  339.         }
  340.         else if(RW5==1)
  341.         {      
  342.                 ROE=1;RA3=0;RA2=1;RA1=1; LedDisp(10);                                //±3°åϽμ
  343.                 while(RW5==1)
  344.                 {      
  345.                         ReAction(addr);
  346.                 }
  347.         }
  348. //×óóòÇãD±¸′λ


  349.         if(RW4==0)
  350.         {      
  351.                 ROE=1;RA3=0;RA2=0;RA1=0; LedDisp(4);                                //×óÇã
  352.                 while(RW4==0)
  353.                 {
  354.                         ReAction(addr);
  355.                 }
  356.         }
  357.         else if(RW4==1)
  358.         {      
  359.                 ROE=1;RA3=0;RA2=0;RA1=1; LedDisp(9);                                //óòÇã
  360.                 while(RW4==1)
  361.                 {
  362.                         ReAction(addr);
  363.                 }
  364.         }
  365. //ǰoóÇãD±¸′λ
  366.         if(RW3==0)
  367.         {
  368.                 ROE=0;RA3=1;RA2=0;RA1=0; LedDisp(3);                                //ǰÇã
  369.                 while(RW3==0)
  370.                 {
  371.                         ReAction(addr);
  372.                 }
  373.         }
  374.         else if(RW3==1)
  375.         {      
  376.                 ROE=0;RA3=1;RA2=0;RA1=1; LedDisp(8);                                //oóÇã
  377.                 while(RW3==1)
  378.                 {
  379.                         ReAction(addr);
  380.                 }
  381.         }
  382.         if(RW2==0)
  383.         {
  384.                 ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(2);                                //Ïòí·Æ½òÆ
  385.                 while(RW2==0)
  386.                 {
  387.                         ReAction(addr);
  388.                 }
  389.         }
  390.         else if(RW2==1)
  391.         {
  392.                 ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(7);                                //Ïò½ÅƽòÆ
  393.                 while(RW2==1)
  394.                 {
  395.                         ReAction(addr);
  396.                 }
  397.         }
  398.         if(RW1==0)
  399.         {      
  400.                 ROE=0;RA3=0;RA2=0;RA1=1; LedDisp(6);                                //Ïòí·Æ½òÆ
  401.                 while(RW1==0)
  402.                 {
  403.                         ReAction(addr);
  404.                 }      
  405.         }      
  406.         ROE=1;RA3=1;RA2=1;RA1=1;                                                                //1رռìμçÆ÷êä3ö¡£
  407. }
  408. //復位解析函數(shù),復位期間,也要一直與從機進行通信,并解析數(shù)據(jù).
  409. void ReAction(uchar8 addr)
  410. {
  411.         UartSend(addr);
  412.         switch(sl_select)
  413.         {
  414.         case 0:if(RxFr_Succ)
  415.                 {
  416.                         RxFr_Succ=0;
  417.                         UartReceive();
  418.                         if(buf[0]!=addr)
  419.                         {
  420.                                 return;
  421.                         }
  422.                         if((buf[1]==0xFF)||(buf[1]==0x03))
  423.                         {
  424.                                 sl_select++;
  425.                         }
  426.                         else
  427.                                 break;
  428.                 }
  429.         case 1:if(RxFr_Succ)
  430.                 {
  431.                         RxFr_Succ=0;
  432.                         UartReceive();
  433.                         if(buf[0]!=addr)
  434.                         {
  435.                                 return;
  436.                         }
  437.                         if((buf[1]==0xFF)||(buf[1]==0x03))
  438.                         {
  439.                                 sl_select--;
  440.                         }
  441.                         else
  442.                                 break;
  443.                 }
  444.         default:break;
  445.         }
  446. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:479916 發(fā)表于 2019-3-25 16:55 | 只看該作者
從機程序:

# define _MAIN_C
# include "config.h"
# include "botton.h"
# include "inital.h"
# include "leddisp.h"
# include "main.h"


uchar8 ScanKeyCNTR=0;                                        //掃描按鍵計數(shù)
uchar8 cntRxd=0;                                                 //接收計數(shù)
bit flagFrame=0;                                                  //幀接收成功標志
uchar8 RxdBuf[2];                                               //串口接收緩沖
uchar8 TxdBuf[2];                                               //發(fā)送緩沖
uchar8 PowSta;                                                   //供電狀態(tài)
uchar8 PowCNTR=0;                                          //供電狀態(tài)顯示計時
uint16 SlpCNTR=SleepTime;                               //休眠
bit flagTxd=0;                                                   //字節(jié)發(fā)送標志
uchar8 Slpbuf=0xFF;
uint16 KeyBuf=0xFFFF;                                     //按鍵讀取
uchar8 ReturnCNTR=20;
uchar8 pdata buf[2];

void main()
{
        P3M1=0x00;
        P3M0=0x40;                                                                         //設(shè)計商品模式為強推挽
        P1M1=0x00;
        P1M0=0x03;                                                                        //P1.0,P1.1端口為強推挽
        SleepDisp=1;                                                                //休眠指示燈
        PowDisp=0;                                                                        //供電指示燈
        DIR_485=0;                                                                        //485方向控制
        ConfigTimer0();
        ConfigUART();
        while(1)
        {
                SlpMode();                                                             //執(zhí)行休眠函數(shù)
                if(ScanKeyCNTR>=2)
                {
                        ScanKeyCNTR=0;
                        ScanKey();                                                            //按鍵掃描
                        KeyCode();                                                        //按鍵編碼
                }
                UartDriver();
        }
}
//串口驅(qū)動函數(shù)
void UartDriver()
{
        if(flagFrame)                                              //幀接收成功
        {
                flagFrame=0;
                UartReceive();                                   //串口接收函數(shù)
                if(buf[0]!=0xF1)                                                //地址解析
                {
                        return;
                }
                switch(buf[1])                                            //數(shù)據(jù)解析
                {
                        case 0x12:PowSta=buf[1];break;
                        case 0x13:PowSta=buf[1];break;
                        default:break;
                }
                PowStaDisp();                                                        //供電狀態(tài)顯示
                UartSend();                                                                //發(fā)送
        }
}
//串口接收函數(shù)
void UartReceive()
{
        uchar8 len=2;
        while(len<2)
        {
                buf[len++]=RxdBuf[len++];
        }
}
//串口發(fā)送函數(shù)
void UartSend()
{
        uchar8 len=0;
        TxdBuf[0]=0xF1;
        DIR_485=1;
        _nop_();
        while(len<2)
        {
                flagTxd=0;
                SBUF=TxdBuf[len];
                len++;
                while(!flagTxd);
        }
        DelayX10us(6);
        DIR_485=0;
}
//中斷函數(shù)
void InterruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                RxdBuf[cntRxd++]=SBUF;
                if(cntRxd>=2)
                {
                        cntRxd=0;
                        flagFrame=1;           置位接收成功標志
                }
        }
        if(TI)
        {
                TI=0;
                flagTxd=1;
        }
}
//T0中斷函數(shù)
void InterruptTimer0() interrupt 1
{
        TH0=0xF8;
        TL0=0xCC;
//休眠計時
        if(KeyBuf==0xFFFF)
                SlpCNTR--;                                                                        //ÿ¸ô2msË÷òy¼õD¡ò»′Î
        else
                SlpCNTR=SleepTime;                                                        //Ë÷òyÖμ»Ö¸′3õÖμ
//喚醒計時
        Slpbuf=(Slpbuf<<1)|Wake_up;

        PowCNTR++;

        ScanKeyCNTR++;
}

回復

使用道具 舉報

板凳
ID:479916 發(fā)表于 2019-3-25 16:56 | 只看該作者
現(xiàn)在通信不成功,求哪位老師給看看,問題出在哪兒?
回復

使用道具 舉報

地板
ID:365802 發(fā)表于 2019-3-25 18:31 | 只看該作者
沒看出錯誤在哪裡, 不過建議你先電腦用串口助手調(diào)通.
回復

使用道具 舉報

5#
ID:479916 發(fā)表于 2019-3-26 08:08 | 只看該作者
ping264888 發(fā)表于 2019-3-25 18:31
沒看出錯誤在哪裡, 不過建議你先電腦用串口助手調(diào)通.

現(xiàn)在用串口助手調(diào)試, 主機能發(fā)數(shù)據(jù),但數(shù)據(jù)不正確,為什么 不正確,一直沒有找到原因呢.
回復

使用道具 舉報

6#
ID:416287 發(fā)表于 2019-3-27 14:40 | 只看該作者
先確定雙方波特率相同 然后看尋址是否正確
回復

使用道具 舉報

7#
ID:479916 發(fā)表于 2019-3-28 19:46 | 只看該作者
奮斗的小白熊 發(fā)表于 2019-3-27 14:40
先確定雙方波特率相同 然后看尋址是否正確

已經(jīng)解決了,在串口發(fā)達函數(shù)中,應該在每個字節(jié)發(fā)送完成后,延時半個左右的波特率周期,而不是在整個幀發(fā)送完成后進行延時.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人精品在线 | 男女在线网站 | 国产精品久久久久久久久久免费看 | 久久国产精品免费一区二区三区 | av一区二区三区在线观看 | 日韩精品视频在线 | 亚洲不卡在线观看 | 美女视频黄色的 | 香蕉久久av | 日韩精品一区二区三区在线播放 | 免费 视频 1级 | 天堂综合网 | 成人免费小视频 | 亚洲va欧美va天堂v国产综合 | 日韩亚洲视频 | 亚洲精品一区中文字幕乱码 | 中文在线一区二区 | www.国产一区 | 欧美激情国产精品 | 亚洲在线一区二区 | 亚洲社区在线 | 久久久久国产 | 日韩一区二区三区在线视频 | 日本在线网址 | 亚洲第一视频网 | 亚洲午夜精品在线观看 | 91亚洲国产成人久久精品网站 | 国产精品久久福利 | 久久男人 | 日本一区二区不卡 | www.亚洲一区二区三区 | 三级成人在线观看 | 欧美一级欧美一级在线播放 | 久久精品无码一区二区三区 | 欧美日本韩国一区二区 | 一区二区三区四区在线视频 | 欧美精品一区二区在线观看 | 欧美一级艳情片免费观看 | 亚洲欧洲精品在线 | 国产人成精品一区二区三 | 久久久蜜桃 |