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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7041|回復: 5
收起左側(cè)

RN8302B三相電能表資料與C語言MCU程序

[復制鏈接]
ID:832889 發(fā)表于 2021-3-24 21:58 | 顯示全部樓層 |閱讀模式
51hei.png 51hei.png

用C對RN8302B進行數(shù)據(jù)讀寫

  1. typedef unsigned char                  u8;
  2. typedef signed char                  s8;
  3. typedef unsigned short          u16;
  4. typedef signed short                  s16;
  5. typedef unsigned long int          u32;
  6. typedef signed long int          s32;
  7. typedef unsigned short      WORD;
  8. typedef        unsigned char        BOOL;

  9. #define PinWrite_ADSCLK(x)          ( (x) ? (P0_bit.no6 = 1 , PM0_bit.no6 = 1) : (PM0_bit.no6 = 0 , P0_bit.no6 = 0) )        //
  10. #define PinMode_ADSCLK(x)                ( (x == GPIO_MODE_OUT) ? (PM0_bit.no6 = 0) : (PM0_bit.no6 = 1) )


  11. #define PinRead_ADSDI()                        (P4_bit.no4)
  12. #define PinWrite_ADSDO(x)                  ( (x) ? (P6_bit.no0 = 1 , PM6_bit.no0 = 1) : (PM6_bit.no0 = 0 , P6_bit.no0 = 0) )        //        



  13. #define PinWrite_ADCS(x)          ( (x) ? (P6_bit.no1 = 1 , PM6_bit.no1 = 1) : (PM6_bit.no1 = 0 , P6_bit.no1 = 0  ) )
  14. #define PinWrite_ADRST(x)          ( (x) ? (P0_bit.no5 = 1 , PM0_bit.no5 = 1) : (PM0_bit.no5 = 0 , P0_bit.no5 = 0  ) )

  15. typedef enum {ERROR = 0 , SUCCESS = !ERROR} ErrorStatus;

  16. typedef struct {
  17. //        u32 Dat : 23;
  18. //        u32 S : 1;
  19.         u8 Dat0;
  20.         u8 Dat1;
  21.         u8 Dat2 : 7;
  22.         u8 S : 1;                        
  23. } sDF09;
  24. typedef struct {
  25.         u32 Dat;
  26. } sDF11;
  27. typedef        sDF11 sFsEgSh_TypeDef;        


  28. #pragma vector = INTTM01_vect
  29. __interrupt void MD_INTTM01(void)
  30. {
  31.         TMIF01 = 0;                /* INTTM01 interrupt flag clear */
  32.         SysStamp ++ ;
  33. }

  34. u16 fnStamp_Through(u16 Ago)
  35. {
  36.         extern u16        SysStamp;
  37.         if (SysStamp >= Ago)
  38.                 {return (SysStamp - Ago);}
  39.         else
  40.                 {return ( (0xffff - Ago) + SysStamp);}
  41. }

  42. u16 fnHexToBcd_u16(u16 Dat)
  43. {
  44.         u16 Result = 0;

  45.         Dat = Dat % 10000;
  46.         Result += (Dat / 1000) * 0x1000;
  47.         Dat = Dat % 1000;        
  48.         Result += (Dat / 100) * 0x100;
  49.         Dat = Dat % 100;        
  50.         Result += (Dat / 10) * 0x10;
  51.         Dat = Dat % 10;        
  52.         Result += Dat;
  53.                
  54.         return(Result);        
  55. }
  56. u32        fnHexToBcd_u32(u32 Dat)
  57. {        
  58.         u32 result = 0;
  59.         
  60.         Dat = Dat % 100000000;
  61.         result += (Dat / 10000000) * 0x10000000;
  62.         Dat = Dat % 10000000;        
  63.         result += (Dat / 1000000) * 0x1000000;
  64.         Dat = Dat % 1000000;
  65.         result += (Dat / 100000) * 0x100000;
  66.         Dat = Dat % 100000;
  67.         result += (Dat / 10000) * 0x10000;
  68.         Dat = Dat % 10000;        
  69.         result += (Dat / 1000) * 0x1000;
  70.         Dat = Dat % 1000;
  71.         result += (Dat / 100) * 0x100;
  72.         Dat = Dat % 100;
  73.         result += (Dat / 10) * 0x10;
  74.         Dat = Dat % 10;        
  75.         result += Dat;
  76.         
  77.         return(result);
  78. }

  79. u16 fnDFConver_Bcd16To16(s16 Dat)
  80. {
  81.         u16 Result;
  82.         Result = abs(Dat) % 8000;                        
  83.         Result = fnHexToBcd_u16(Result);
  84.         if(Dat < 0 ) Result |= 0x8000;
  85.         else Result &= 0x7fff;        
  86.         return(Result);
  87. }
  88. u32 fnDFConver_Bcd32To32(s32 Dat)
  89. {
  90.         u32 Result;
  91.         Result = labs(Dat) % 80000000;                        
  92.         Result = fnHexToBcd_u32(Result);
  93.         if(Dat < 0 ) Result |= 0x80000000;
  94.         else Result &= 0x7fffffff;        
  95.         return(Result);
  96. }

  97. sDF09 fnDFConver_Hex32ToDF09(s32 Dat)
  98. {        
  99.         sDF09        Result;        
  100.         memset(&Result , 0 , sizeof(sDF09) );
  101.         if(Dat < 0) Result.S = 1;
  102.         else Result.S = 0;        
  103.         
  104.         Dat = labs(Dat) % 800000;
  105.         Dat = fnHexToBcd_u32(Dat);
  106.         
  107.         Result.Dat0 = Dat;
  108.         Result.Dat1 = Dat >> 8;
  109.         Result.Dat2 = Dat >> 16;
  110.         return(Result);        
  111. }

  112. typedef union                                         //公共數(shù)據(jù)運算區(qū)8字節(jié)
  113. {
  114.         u8  ucTempBuf[8];
  115.         u32 lTemp32;
  116.         u16 wTemp16;
  117.         u8  ucTemp8;
  118. }sDl645StruDataComm_TypeDef;

  119. __no_init  sDl645StruDataComm_TypeDef      Dl645RN8302DataComm;
  120. __no_init        sDl645FrontTmp_TypeDef                Dl645FrontTmp;
  121. __no_init        sDl645Front_TypeDef                        Dl645Front;
  122. __no_init         sDl645Eg_TypeDef                         Dl645Eg;
  123. __no_init   sDl645FirmParaFile_TypeDef          Dl645FirmPara;

  124. typedef struct
  125. {
  126.     u8                ChkErrCnt;       //讀錯誤計數(shù)1
  127.    
  128.     s32         Pw[12];                   //{Pa Pb Pc P Qa Qb Qc Q Sa Sb Sc S}   48
  129.     s32         UI[7];               //Ua Ub Uc Ia Ib Ic Inal   28
  130.     s32                VectorU[9];                // 正序、負序、零序電壓
  131.     s32                VectorI[9];                // 正序、負序、零序電流
  132.     s32          Pf[4];               //Pf Pfa Pfb Pfc      16     
  133.     u32         Frequency;           //電網(wǎng)頻率,單位:        4  
  134.     s32          YUI[3],YUU[2];  //20
  135.                                        
  136.     s32                Pulse[15];                //前臺高頻脈沖48
  137.     //---電能脈沖---        
  138.     s32                Pulse_EgTmp[20];        //高頻脈沖{P,Q,Ps},{Pa,Qa,Psa},{Pb,Qb,Psb},{Pc,Qc,Psc}{Fp,Fq}{Fpa,Fqa}{Fpb,Fqb}{Fpc,Fqc}
  139.     u32                Pulse_Eg[20];  //低頻脈沖數(shù)
  140.         //---需量脈沖---
  141.         s32                Pulse_NeedTmp[12];        
  142.           u16                Pulse_Need[12]; //{PNeed,QNeed,PsNeed},{PNeeda,QNeeda,PsNeeda},{PNeedb,QNeedb,PsNeedb},{PNeedc,QNeedc,PsNeedc}48
  143.    

  144.     u16                Angle[9];
  145.     u16         PDirect;   //4
  146.     u32         ChkSum1;   //4
  147.     u32         ChkSum2;   //4
  148.         
  149.         u16                Temperature;        //溫度4
  150.         u32                ClockBat;                //時鐘電池4
  151.         u32                BackupBat;                //后備電池4
  152.         
  153.     u16   CF1DelayStamp;
  154.     u16   CF2DelayStamp;
  155.    
  156.     u16   CfIn_P;
  157.     u16   CfIn_q;
  158.    
  159.     u16   CfTime_P;
  160.     u16   CfTime_q;
  161.         
  162. } sDl645FrontTmp_TypeDef;

  163. typedef struct
  164. {        
  165.         struct sFrontPubData_TypeDef  {
  166.                 u16                U[3];                        //---電壓---NNN.N6
  167.                 u16                VectorU[9];                // 正序電壓 0--2  負序電壓 3---5  零序電壓 6---8
  168.                 u32                I[4];                        //---電流NNNN.NNNN(電流值要求3整3小,整定值要求2整4小,最高位表示方向)---16               
  169.                 u32                VectorI[9];                // 正序電流 0--2  負序電流 3---5  零序電流 6---8
  170.                 sDF09        Pw[12];                        //---瞬時有功/無功/視在功率NN.NNNN---{P Pa Pb Pc Q Qa Qb Qc S Sa Sb Sc}36
  171.                 u16          Pf[4];                        //---功率因數(shù)N.NNN---        最高位表示方向{Pf Pfa Pfb Pfc}        8  sDF05
  172.                 u16                Angle[9];                //---相角NNN.N---                18
  173.                                                                 //PhUb,PhUc, 以A相電壓為基準,B、C相角度                                //(hyg) BCD碼
  174.                                                         //PhIa,PhIb,PhIc,A相電流與A相電壓間角度、B相電流與B相電壓間角度、C相電流與C相電壓間角度
  175.                                                         //Angle A,Angle B,Angle C, A相電流與A相電壓間角度、B相電流與A相電壓間角度、C相電流與A相電壓間角度
  176.                                                         //Angle C-Angle A
  177.                 u32                UnblU;                        //電壓不平衡度NNNN.NN%4
  178.                 u32                UnblI;                        //電流不平衡度NNNN.NN%4
  179.                
  180.                 u16                FuzzyU[3];                //---電壓波形失真度NN.NN%---        6        
  181.                 u16                FuzzyI[3];                //---電流波形失真度NN.NN%---        6        
  182.                 u16                WaveU[3][21];        //---相電壓諧波含量NN.NN%---        126        
  183.                 u16                WaveI[3][21];        //---相電流諧波含量NN.NN%---    126
  184.                 //---其他---
  185.                 u16                Frequency;                //NN.NN 2
  186.                 u32                PPwave;                        //NN.NNNN 4
  187.                
  188.                 u16                Temperature;        //NNN.N 2
  189.                 u16                ClockBat;                //NN.NN 2
  190.                 u16                BackupBat;                //NN.NN 2
  191.                 u8                PDirect;                //原功率方向,用于需量處理(0總/1A/2B/3C , 注意與FrontTmp不同) 1
  192.         } PubData;
  193.         
  194.         struct sFrontPriData_TypeDef  {               
  195.                 u8                Flag;                        //---工作異常標志---1
  196.                 u8      PhaseCalStep;
  197.                 u16     FrontStamp;
  198. //                u8      BatCalStep;
  199.                 u16     BatStamp;
  200. //                u16     BatDetStamp;
  201.         } PriData;        
  202.         
  203.         struct sFrontPriPara_TypeDef  {               
  204.                 u32         PConstE;                        //有功常數(shù)
  205.                 u32         QConstE;                        //無功常數(shù)(Hex碼)4
  206.                 u16         Crc;//2
  207.         } PriPara;               
  208. } sDl645Front_TypeDef;        //緩沖區(qū)轉(zhuǎn)換后的有效數(shù)據(jù)

  209. typedef struct
  210. {               
  211.         u8 FractionI;/*電流小數(shù)位數(shù)*/
  212.         u8 FractionU;/*電壓小數(shù)位數(shù)*/
  213.         u8 FractionE;/*電能小數(shù)位數(shù)*/
  214.         u8 FractionP;/*功率需量小數(shù)位數(shù)*/
  215.         u16 ConstE;/*電表有功常數(shù)*/
  216.         u16 Pulse_deltaE;/*數(shù)*/
  217.         u8  HighPulseRate;
  218.         u8 PhaseCalStep;
  219.         u32 IRmsConst;                        //10
  220.         u16        Reserve[2];
  221.         u16        NOLOAD;
  222.         u16        ZEROSTAR;                                        //20
  223.         u32 ChkSum1;
  224.         u16 HFConst1;
  225.         u16 HFConst2;
  226.         u32 VRmsConst;                        //30
  227.         u16        Reserve1;
  228.         u32 PRmsConst;
  229.         u16        Reserve2;
  230.         u16        VGain[3];                                // 42
  231.         u16        IGain[4];                                //48
  232.         u8        PHSU[2];                                // 56
  233.         u32        PHSI[3];
  234.         u16        PRth[4];                                //70
  235.         u16        UI_Offset[7];
  236.         u16        P_PHS[3];/*有功相位校正寄存器*/                                // 92
  237.         u16        PGain[3];/*有功增益校正寄存器*/                                
  238. }sDl645FirmParaFile_TypeDef;

  239. typedef struct {
  240. #pragma pack(1)
  241.         struct sDl645EgPubData_TypeDef
  242.         {
  243.                 sFsEgSh_TypeDef AllPEgSh[DL645_MAX_FL + 1];               
  244.                 sFsEgSh_TypeDef PtPEgSh[DL645_MAX_FL + 1];      
  245.                 sFsEgSh_TypeDef NtPEgSh[DL645_MAX_FL + 1];      
  246.                
  247.                 sFsEgSh_TypeDef AllQEgSh[DL645_MAX_FL + 1];     
  248.                 sFsEgSh_TypeDef PtQEgSh[DL645_MAX_FL + 1];      
  249.                 sFsEgSh_TypeDef NtQEgSh[DL645_MAX_FL + 1];      
  250.                
  251.                 sFsEgSh_TypeDef Qd1QEgSh[DL645_MAX_FL + 1];               
  252.                 sFsEgSh_TypeDef Qd2QEgSh[DL645_MAX_FL + 1];               
  253.                 sFsEgSh_TypeDef Qd3QEgSh[DL645_MAX_FL + 1];               
  254.                 sFsEgSh_TypeDef Qd4QEgSh[DL645_MAX_FL + 1];               
  255.                
  256.                 sFsEgSh_TypeDef PtPsEgSh[DL645_MAX_FL + 1];               
  257.                 sFsEgSh_TypeDef NtPsEgSh[DL645_MAX_FL + 1];               
  258.                
  259.                 sFsEgSh_TypeDef AssEgSh;                                                
  260.                 sFsEgSh_TypeDef BasePtPEgSh;                                       
  261.                 sFsEgSh_TypeDef BaseNtPEgSh;                                       
  262.                 sFsEgSh_TypeDef WavePtPEgSh;                                       
  263.                 sFsEgSh_TypeDef WaveNtPEgSh;                                       
  264.                 sFsEgSh_TypeDef CopPEgSh;                                                
  265.                 sFsEgSh_TypeDef IronPEgSh;                                                        
  266. //-------------        
  267. ……………………

  268. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


msp430單片機源程序如下:
  1. #include<msp430x44x.h>
  2. #include"config.h"
  3. #include"bu9792.h"
  4. void I2C_Delay()
  5. {
  6.         uchar i,j;
  7.         for(i=1;i>0;i--)
  8.                 for(j=10;j>0;j--);                           
  9. }   

  10. void Delay_100us()
  11. {
  12.         uchar i,j;
  13.         for(i=100;i>0;i--)
  14.                 for(j=10;j>0;j--);                           
  15. }   

  16. void I2C_Start()
  17. {
  18.     I2C_INIT;
  19.         SDA_H;
  20.         SCL_H;
  21.         I2C_Delay();
  22.         SDA_L;        
  23.         I2C_Delay();
  24.         SCL_L;

  25. }

  26. void I2C_Stop()
  27. {
  28.         I2C_INIT;
  29.         SCL_L;
  30.         SDA_L;
  31.         I2C_Delay();
  32.         SCL_H;
  33.         I2C_Delay();
  34.         SDA_H;
  35.         I2C_Delay();        
  36. }

  37. uchar I2C_SendByte(uchar sendbyte)     //發(fā)送一個字節(jié)
  38. {
  39.         uchar i;
  40.         for(i=0;i<8;i++)        
  41.         {
  42.                 SCL_L;
  43.                 I2C_Delay();
  44.             if(sendbyte&0x80)
  45.                         SDA_H;
  46.             else
  47.                 SDA_L;
  48.         sendbyte <<= 1;
  49.                 SCL_H;
  50.                 I2C_Delay();                                                                  
  51.         }
  52.         
  53.         SCL_L;                //第九個時鐘周期,檢測從機接收是否正常
  54.         SDA_H;                     
  55.         I2C_Delay();
  56.         SCL_H;
  57.         I2C_Delay();
  58.         SCL_L;
  59.     if(ReadSDA)
  60.                 return fault;                //為真時,從機接收錯誤
  61.     else
  62.                 return ture;
  63.         
  64. }

  65. //接收一個字節(jié)
  66. uchar I2C_ReceiveByte(void)
  67. {
  68.         uchar i,receivebyte=0;
  69.         
  70.         SCL_L;
  71.         SDA_H;
  72.         for(i=0;i<8;i++)
  73.         {
  74.                  receivebyte <<= 1;
  75.                 SCL_L;
  76.                 I2C_Delay();        
  77.             SCL_H;
  78.                 I2C_Delay();        
  79.                 if(ReadSDA)
  80.                 receivebyte |= 0x01;
  81.         }
  82.         SCL_L;               
  83.     return receivebyte;
  84.      
  85. }

  86.                                     
  87. //主機應(yīng)答
  88. void ACK()
  89. {
  90.         SCL_L;
  91.         SDA_L;
  92.         I2C_Delay();
  93.         SCL_H;
  94.         I2C_Delay();
  95.         SCL_L;
  96. }

  97. //主機不應(yīng)答
  98. void NOACK()
  99. {
  100.         SCL_L;
  101.         SDA_H;
  102.         I2C_Delay();
  103.         SCL_H;
  104.         I2C_Delay();
  105.     SCL_L;
  106. }


  107. //LCD清屏或全屏顯示
  108. void Bu9792_Clear(uchar i)
  109. {
  110.         I2C_Start();              
  111.          I2C_SendByte(0x7C);         
  112.         if(i)            
  113.         {
  114.                 I2C_SendByte(0xC0);//關(guān)閉顯示
  115.             I2C_SendByte(0x00);        //ADSET  ram地址設(shè)置
  116.                         
  117.                 for(i=0;i<18;i++)
  118.                 {
  119.                         I2C_SendByte(0x00);
  120.                 }        
  121.         }        
  122.     else                        
  123.         {        
  124.                 //I2C_SendByte(0xC8);   //開啟顯示
  125.                 I2C_SendByte(0xFE);  //全屏顯示
  126.         }
  127.          
  128.         I2C_Stop();                 
  129. }

  130. //初始化
  131. void Bu9792_Init()
  132. {
  133.         uchar i;
  134.         Delay_100us();                     
  135.         I2C_Stop();
  136.         I2C_Start();
  137.         I2C_SendByte(SlaveAddr);
  138.         
  139.         I2C_SendByte(0xEA);        //software reset
  140.         I2C_SendByte(0xA2);                //display control
  141.         I2C_SendByte(0xE8);
  142.         I2C_SendByte(0x00);        //ADSET  ram地址設(shè)置
  143.         for(i=0;i<18;i++)
  144.         {
  145.                 I2C_SendByte(0x00);
  146.         }        
  147.         I2C_Stop();
  148.                
  149. }

  150. void Bu9792_Display(uchar wei,uchar num)
  151. {
  152.         I2C_Start();
  153.         I2C_SendByte(SlaveAddr);
  154.         I2C_SendByte(0xFC);   
  155.         I2C_SendByte(0xC8);      //顯示打開
  156.     I2C_SendByte(0xE8);  
  157.     switch(wei)
  158.         {
  159.                 case 1:        wei = 0x01;break;
  160.                 case 2:        wei = 0x03;break;
  161.                 case 3:        wei = 0x06;break;
  162.                 case 4:        wei = 0x08;break;
  163.                 case 5:        wei = 0x0B;break;
  164.                 case 6:        wei = 0x0D;break;
  165.                 case 7:        wei = 0x10;break;
  166.                 case 8:        wei = 0x12;break;
  167.         
  168.         }        
  169.         //I2C_SendByte(0xEC);
  170.         I2C_SendByte(wei);
  171.     I2C_SendByte(num);
  172.   
  173.         I2C_Stop();

  174. }


  175. void Bu9792_DisplayPot()
  176. {
  177.         I2C_Start();
  178.         I2C_SendByte(SlaveAddr);
  179.         I2C_SendByte(0xFC);   
  180.         I2C_SendByte(0xC8);      //顯示打開
  181.     I2C_SendByte(0xE8);  
  182.             
  183.         //I2C_SendByte(0xEC);
  184.         I2C_SendByte(0x0f);
  185.     I2C_SendByte(0x40);
  186.   
  187.         I2C_Stop();

  188. }
復制代碼
51hei.png
所有資料51hei提供下載:
三相計量RN8302B.7z (4.52 MB, 下載次數(shù): 202)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:254226 發(fā)表于 2022-1-22 16:53 | 顯示全部樓層
感謝樓主,共享的內(nèi)容幫組很大!!!
回復

使用道具 舉報

ID:291242 發(fā)表于 2023-1-20 00:54 | 顯示全部樓層
對于這種表的校準都沒有好的辦法嗎?
回復

使用道具 舉報

ID:391619 發(fā)表于 2023-5-23 09:38 | 顯示全部樓層
很好,非常感謝
回復

使用道具 舉報

ID:1109350 發(fā)表于 2024-4-7 13:06 | 顯示全部樓層
很好,非常非常感謝,對我很有用!!!
回復

使用道具 舉報

ID:358960 發(fā)表于 2025-1-1 07:58 | 顯示全部樓層
感謝樓主,下載學習,學習
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区在线观看视频 | 国产精品1区2区 | 精久久久 | 久久欧美高清二区三区 | 久草在线视频中文 | 可以在线观看av的网站 | 99视频精品 | 午夜寂寞影院列表 | 高清成人av | 国产精品久久久久久久久大全 | 亚洲在线观看视频 | 日韩一及片| 亚洲精品国产成人 | 在线观看电影av | 超碰在线人 | 在线观看成人免费视频 | 精国产品一区二区三区 | 99精品久久久久久 | 国产亚洲欧美在线 | 久久久久亚洲视频 | 全免一级毛片 | 亚洲视频免费在线播放 | 国产成人一区二区 | 亚洲理论在线观看电影 | 精品96久久久久久中文字幕无 | 天天操妹子| 婷婷一级片 | www.国产日本 | 毛片入口 | 嫩草黄色影院 | 色婷婷综合网站 | 精品国产一区二区三区日日嗨 | 国产中文字幕在线 | 日本高清aⅴ毛片免费 | 成年人在线观看 | 日韩精品av | 欧美日韩一区二区三区在线观看 | 蜜臀久久| a在线视频观看 | 亚洲一二视频 | 99久久婷婷国产综合精品电影 |