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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4115|回復: 6
收起左側

cs56463-12864-STC89C52單片機驅動源代碼

[復制鏈接]
ID:334946 發表于 2018-5-21 16:07 | 顯示全部樓層 |閱讀模式
這是單相電用電器監測裝置的設計源代碼
用cs5463進行電能計算 單片機控制 12864顯示的源代碼

單片機源碼如下:
  1.                    //頭文件
  2. #include <REG52.h>
  3. #include <string.h>
  4. #include <intrins.h>
  5. #define uint  unsigned int
  6. #define uchar unsigned char

  7. typedef bit  bool;
  8. typedef unsigned char  uint8;                   /* defined for unsigned 8-bits integer variable         無符號8位整型變量  */
  9. typedef signed   char  int8;                    /* defined for signed 8-bits integer variable                有符號8位整型變量  */
  10. typedef unsigned int   uint16;                  /* defined for unsigned 16-bits integer variable         無符號16位整型變量 */
  11. typedef signed   int   int16;                   /* defined for signed 16-bits integer variable                 有符號16位整型變量 */
  12. typedef unsigned long  uint32;                  /* defined for unsigned 32-bits integer variable         無符號32位整型變量 */
  13. typedef signed   long  int32;                   /* defined for signed 32-bits integer variable                 有符號32位整型變量 */
  14. typedef float          fp32;                    /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */





  15. /*****************************************************************************/
  16. sbit LCM_cs   = P2^0;  //RS
  17. sbit LCM_std  = P2^1;  //SID
  18. sbit LCM_sclk = P2^2;  //SCLK
  19. sbit LCM_psb  = P2^3;   //H=并口; L=串口;
  20. sbit LCM_rst  = P2^4;   //Reset Signal 低電平有效        sbit LCM_rst  = P2^0;
  21. //sbit beep     = P2^5;
  22. //sbit p2_4     = P2^6;  //定義背光控制口
  23. char a,b,c;
  24. char aa,bb,cc,dd,ee;
  25. char i,q,T=125;
  26. uchar code tab1[]={
  27. "電壓            "
  28. "功率            "
  29. "電流            "
  30. "溫度            "
  31. };
  32. /****************************************************************************/

  33. uchar r[3]={0x00,0x00,0x00};

  34. /******************************************************************
  35.                            接口定義
  36. ******************************************************************/
  37. sbit SCLK=P1^1;         //ck
  38. sbit MOSI=P1^0;         //DI
  39. sbit MISO=P1^2;         //DO           //這個定義對嗎?
  40. sbit INT=P3^2;
  41. sbit CS=P1^3;
  42. sbit RST=P1^4;        //RST

  43. #define CS5463_VScale       525             //計算電壓比例,220V*250mv/110mv=500V
  44. #define CS5463_IScale       (250/10)        //計算電流比例

  45. static uint8 RX_Buff[4];                                        //CS5463讀寫緩沖區
  46. uint8 sta;                                                                        //芯片狀態

  47. #define READ_MASK                0xBF        //讀寄存器時的屏蔽碼,與(寫)地址相與
  48. #define CMD_SYNC0            0XFE          //結束串口重新初始化
  49. #define CMD_SYNC1            0XFF          //開始串口重新初始化
  50. #define REG_CONFR           0x40           //配置
  51. #define REG_CYCCONT         0x4A           //一個計算周期的A/D轉換數
  52. #define REG_STATUSR         0x5E         //狀態
  53. #define REG_MODER           0x64          //操作模式
  54. #define REG_MASKR           0x74          //中斷屏蔽
  55. #define REG_CTRLR           0x78          //控制
  56. #define CMD_STARTC           0XE8          //執行連續計算周期

  57. #define REG_VRMSR           0X18          //VRMS
  58. #define REG_IRMSR           0X16          //IRMS
  59. #define REG_Pactive           0X14          //Pactive

  60.                   


  61. /*************************************************************
  62. ** 函數名稱:uDelay
  63. ** 函數功能:延時
  64. ** 函數參數:j
  65. ** 返回值:無
  66. ** 創建時間:2009-4-23
  67. ** 第一次修改時間:無
  68. **************************************************************/
  69. static  void uDelay(uint8 j)

  70. {
  71.   uint8 i;
  72.   for(;j>0;j--)
  73.         { for(i=0;i<255;i--)
  74.                 {
  75.                 ;
  76.                 }
  77.         }
  78. }
  79. /*************************************************************
  80. ** 函數名稱:CS5463CMD
  81. ** 函數功能:CS5463命令函數
  82. ** 函數參數:無
  83. ** 創建時間:2009-9-14
  84. ** 第一次修改時間:無
  85. **************************************************************/
  86. static void CS5463CMD(uint8 cmd)
  87. {
  88. uint8 i;
  89. SCLK = 1;
  90. CS = 0;
  91. i = 0;
  92. while(i<8)
  93. {
  94.           uDelay(50);
  95.         SCLK = 0;
  96.         if(cmd&0x80)MOSI = 1;
  97.         else                MOSI = 0;
  98.         uDelay(50);
  99.         SCLK = 1;                                         //在時鐘上升沿,數據被寫入CS5463
  100.         cmd <<= 1;
  101.         i++;
  102. }
  103. uDelay(50);
  104. CS = 1;
  105. }
  106. /*************************************************************
  107. ** 函數名稱:CS5463WriteReg
  108. ** 函數功能:CS5463寫寄存器函數
  109. ** 函數參數:無
  110. ** 創建時間:2009-9-14
  111. ** 第一次修改時間:無
  112. **************************************************************/
  113. void CS5463WriteReg(uint8 addr,uint8 *p)
  114. {
  115. uint8 i,j;
  116. uint8 dat;
  117. SCLK = 1;
  118. CS = 0;
  119. i = 0;
  120. while(i<8)
  121. {
  122.           uDelay(50);
  123.         SCLK = 0;
  124.         if(addr&0x80)MOSI = 1;
  125.         else                 MOSI = 0;
  126.         uDelay(50);
  127.         SCLK = 1;                                         //在時鐘上升沿,數據被寫入CS5463
  128.         addr <<= 1;
  129.         i++;
  130. }
  131. j = 0;
  132. while(j<3)
  133. {
  134.           dat = *(p+j);
  135.         i = 0;
  136.         while(i<8)
  137.         {
  138.                   uDelay(50);
  139.                 SCLK = 0;
  140.                 if(dat&0x80)MOSI = 1;
  141.                 else                MOSI = 0;
  142.                 uDelay(50);
  143.                 SCLK = 1;                                  //在時鐘上升沿,數據被寫入CS5463
  144.                 dat <<= 1;
  145.                 i++;
  146.         }
  147.         j++;
  148. }
  149. uDelay(50);
  150. CS = 1;
  151. }
  152. /*************************************************************
  153. ** 函數名稱:CS5463ReadReg
  154. ** 函數功能:CS5463讀寄存器函數
  155. ** 函數參數:無
  156. ** 創建時間:2009-9-14
  157. ** 第一次修改時間:無
  158. **************************************************************/
  159. void CS5463ReadReg(uint8 addr,uint8 *p)
  160. {
  161. uint8 i,j;
  162. uint8 dat;
  163. SCLK = 0;
  164. CS = 0;
  165. addr &= READ_MASK;
  166. i = 0;
  167. while(i<8)
  168. {
  169.           uDelay(50);
  170.         SCLK = 0;
  171.         if(addr&0x80)MOSI = 1;
  172.         else                 MOSI = 0;
  173.         uDelay(50);
  174.         SCLK = 1;
  175.         addr <<= 1;                                         //在時鐘上升沿,數據被寫入CS5463
  176.         i++;
  177. }
  178. uDelay(50);
  179. MOSI = 1;
  180. j = 0;
  181. while(j<3)
  182. {
  183.         i = 0;
  184.         dat = 0;
  185.         while(i<8)
  186.         {
  187.                 if(i==7)MOSI = 0;
  188.                 else        MOSI = 1;
  189.                 SCLK = 0;
  190.                 uDelay(50);
  191.                 dat <<= 1;                                                
  192.                 if(MISO)dat |= 0x01;
  193.                 else        dat &= 0xFE;
  194.                 SCLK = 1;
  195.                 uDelay(50);                                                         
  196.                 i++;
  197.         }
  198.         *(p+j) = dat;
  199.         j++;
  200. }
  201. MOSI = 1;
  202. CS = 1;
  203. }
  204. /*************************************************************************************************
  205. ** CS5463 應用函數
  206. *************************************************************************************************/
  207. /*************************************************************
  208. ** 函數名稱:CS5463Init
  209. ** 函數功能:CS5463復位和初始化函數
  210. ** 函數參數:無
  211. ** 創建時間:2009-9-14
  212. ** 第一次修改時間:無
  213. **************************************************************/
  214. bit CS5463_Init(void)           //bit 可以這樣嗎?
  215. {
  216. RST = 0;
  217. uDelay(200);
  218. RST = 1;
  219. uDelay(100);
  220. //----------------------
  221. //發送同步序列
  222. RX_Buff[0] = CMD_SYNC1;
  223. RX_Buff[1] = CMD_SYNC1;
  224. RX_Buff[2] = CMD_SYNC0;
  225. CS5463WriteReg(CMD_SYNC1,RX_Buff);          //#define CMD_SYNC1            0XFF          //開始串口重新初始化               
  226. //----------------------
  227. //初始化--配置寄存器
  228. //相位補償為PC[6:0]=[0000000];
  229. //電流通道增益為Igain=10;
  230. //EWA=0;
  231. //INT中斷為低電平有效IMODE:IINV=[00]
  232. //iCPU=0
  233. //K[3:0]=[0001]
  234. RX_Buff[0] = 0x00;                                                
  235. RX_Buff[1] = 0x00;
  236. RX_Buff[2] = 0x01;
  237. CS5463WriteReg(REG_CONFR,RX_Buff);         //        #define REG_CONFR           0x40           //配置
  238. //----------------------
  239. //初始化--操作寄存器
  240. RX_Buff[0] = 0x00; //B0000_0000;  //這是什么鬼 可以這樣嗎?                                                  
  241. RX_Buff[1] = 0x00;//B0000_0000;
  242. RX_Buff[2] = 0x60;//B0110_0000;
  243. CS5463WriteReg(REG_MODER,RX_Buff);          //#define REG_MODER           0x64          //操作模式
  244. //----------------------
  245. //初始化--電流 交流偏置 校準寄存器
  246. // RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
  247. // CS5463WriteReg(REG_IACOFF,RX_Buff);        
  248. //----------------------
  249. //初始化--電流 增益校準寄存器
  250. // RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
  251. // CS5463WriteReg(REG_IGN,RX_Buff);               
  252. //----------------------
  253. //初始化--電壓 交流偏置 校準寄存器
  254. // RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
  255. // CS5463WriteReg(REG_VACOFF,RX_Buff);        
  256. //----------------------
  257. //初始化--電壓 增益校準寄存器
  258. // RW24XX(RX_Buff,3,EE_VACGAIN,0xA1);
  259. // CS5463WriteReg(REG_VGN,RX_Buff);               
  260. //----------------------
  261. RX_Buff[0] = 0x00;
  262. RX_Buff[1] = 0x0F;
  263. RX_Buff[2] = 0xA0;                                                //#define REG_CYCCONT         0x4A           //一個計算周期的A/D轉換數
  264. CS5463WriteReg(REG_CYCCONT,RX_Buff);        //初始化--CYCLE COUNT 寄存器,4000
  265. //----------------------
  266. //初始化--脈沖速率寄存器
  267. // RX_Buff[0] = 0x00;
  268. // RX_Buff[1] = 0x34;
  269. // RX_Buff[2] = 0x9C;
  270. // CS5463WriteReg(REG_PULRATE,RX_Buff);        
  271. //----------------------
  272. RX_Buff[0] = 0xFF;
  273. RX_Buff[1] = 0xFF;
  274. RX_Buff[2] = 0xFF;
  275. CS5463WriteReg(REG_STATUSR,RX_Buff);        //初始化--狀態寄存器  #define REG_STATUSR         0x5E         //狀態
  276. //----------------------
  277. RX_Buff[0] = 0x80;                                                //開電流、電壓、功率測量完畢中斷
  278. RX_Buff[1] = 0x00;
  279. RX_Buff[2] = 0x80;                                                //開溫度測量完畢中斷
  280. CS5463WriteReg(REG_MASKR,RX_Buff);                //初始化--中斷屏蔽寄存器    #define REG_MASKR           0x74          //中斷屏蔽
  281. //----------------------
  282. RX_Buff[0] = 0x00;
  283. RX_Buff[1] = 0x00;
  284. RX_Buff[2] = 0x00;
  285. CS5463WriteReg(REG_CTRLR,RX_Buff);                //初始化--控制寄存器   #define REG_CTRLR           0x78          //控制  
  286. //----------------------
  287. CS5463CMD(CMD_STARTC);                                           //啟動連續轉換            #define CMD_STARTC           0XE8          //執行連續計算周期
  288. //CS5463_Status = 0;                                                //初始化任務進程狀態
  289. //Load_Status = 0;
  290. //CS5463_CrmsSmallCunt = 0;
  291. //CS5463_CrmsOverCunt = 0;
  292. return(1);                    //只要做完這些步驟就返回true  1
  293. }
  294. /*************************************************************
  295. ** 函數名稱:CS5463_ResetStatusReg
  296. ** 函數功能:復位狀態寄存器函數
  297. ** 函數參數:無
  298. ** 創建時間:2009-9-15
  299. ** 第一次修改時間:無
  300. **************************************************************/
  301. static void CS5463_ResetStatusReg(void)
  302. {
  303. RX_Buff[0] = 0xFF;
  304. RX_Buff[1] = 0xFF;
  305. RX_Buff[2] = 0xFF;
  306. CS5463WriteReg(0x5E,RX_Buff);                //復位狀態寄存器        #define REG_STATUSR         0x5E         //狀態  
  307. }
  308. /*************************************************************
  309. ** 函數名稱:CS5463_GetStatusReg
  310. ** 函數功能:讀取狀態寄存器函數
  311. ** 函數參數:無
  312. ** 創建時間:2009-9-15
  313. ** 第一次修改時間:無
  314. **************************************************************/
  315. static uint8 CS5463_GetStatusReg(void)
  316. {
  317. uint8 sta=0;
  318. CS5463ReadReg(0x1E,RX_Buff);           //1E 是什么?   狀態寄存器
  319. if(RX_Buff[0]&0x80)                                           //檢測:電流、電壓、功率測量是否完畢
  320. {
  321.         //檢測電流/電壓是否超出范圍
  322.         //檢測電流有效值/電壓有效值/電能是否超出范圍
  323.         if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
  324.         {
  325.                  CS5463_ResetStatusReg();                //復位狀態寄存器
  326.         }
  327.         else
  328.         {
  329.                 sta |= 0x01;//B0000_0001;        //這什么意思 還可以這樣寫嗎? PT2017-2-8   分隔符嗎?
  330.         }
  331. }

  332. if(RX_Buff[2]&0x80)                                   //檢測:溫度測量是否完畢
  333. {
  334.           sta |=0x02; //B0000_0010;
  335. }
  336. return(sta);        
  337. }  







  338. void DelayM(unsigned int a)       //延時函數 1MS/次        
  339. {
  340.                 unsigned char i;
  341.                 while( --a != 0)
  342.        {               
  343.                 for(i = 0; i < 125; i++);  //一個 ; 表示空語句,CPU空轉從0加到125,CPU大概就耗時1毫秒?
  344.                 }                                      
  345. }

  346. void Delay(int num)//延時函數
  347. {
  348.         while(num--);
  349. }

  350. /******************************************************************************/
  351. //寫指令或數據  (0,指令) (1,數據)
  352. void LCM_WriteDatOrCom(bit dat_comm,uchar content)
  353. {
  354.   uchar a,i,j;
  355.   Delay(50);
  356.   a=content;
  357.   LCM_cs=1;
  358.   LCM_sclk=0;
  359.   LCM_std=1;
  360.   for(i=0;i<5;i++)
  361.   {
  362.     LCM_sclk=1;
  363.     LCM_sclk=0;
  364.   }
  365.   LCM_std=0;
  366.   LCM_sclk=1;
  367.   LCM_sclk=0;
  368.   if(dat_comm)
  369.     LCM_std=1;   //data
  370.   else
  371.    LCM_std=0;   //command
  372.   LCM_sclk=1;
  373.   LCM_sclk=0;
  374.   LCM_std=0;
  375.   LCM_sclk=1;
  376.   LCM_sclk=0;
  377.   for(j=0;j<2;j++)
  378.   {
  379.     for(i=0;i<4;i++)
  380.     {
  381.       a=a<<1;
  382.       LCM_std=CY;
  383.       LCM_sclk=1;
  384.       LCM_sclk=0;
  385.     }
  386.     LCM_std=0;
  387.     for(i=0;i<4;i++)
  388.     {
  389.       LCM_sclk=1;
  390.       LCM_sclk=0;
  391.     }
  392.   }
  393. }
  394. /*********************************************************************************/


  395. /*****************************************************************************/
  396. //初始化LCM
  397. void LCM_init(void)         
  398. {
  399.   LCM_rst=1;
  400.   LCM_psb=0;
  401.   LCM_WriteDatOrCom (0,0x30);  /*30---基本指令動作*/   
  402.   LCM_WriteDatOrCom (0,0x01);  /*清屏,地址指針指向00H*/
  403.   Delay (100);
  404.   LCM_WriteDatOrCom (0,0x06);  /*光標的移動方向*/
  405.   LCM_WriteDatOrCom(0,0x0c);   /*開顯示,關游標*/
  406. }

  407. void chn_disp (uchar code *chn)   //顯示4行 指針
  408. {
  409.   uchar i,j;
  410.   LCM_WriteDatOrCom  (0,0x30);         //        0 是指令 這2個命令 是干什么 的?
  411.   LCM_WriteDatOrCom  (0,0x80);         //
  412.   for (j=0;j<4;j++)
  413.   {
  414.     for (i=0;i<16;i++)
  415.     LCM_WriteDatOrCom  (1,chn[j*16+i]);
  416.   }
  417. }
  418. /*****************************************************************************/
  419. //清屏函數
  420. void LCM_clr(void)
  421. {
  422.   LCM_WriteDatOrCom (0,0x30);
  423.   LCM_WriteDatOrCom (0,0x01);   /*清屏,地址指針指向00H*/
  424.   Delay (180);
  425. }
  426. /*****************************************************************************/
  427. //向LCM發送一個字符串,長度64字符之內。
  428. //應用:LCM_WriteString("您好!");
  429. void LCM_WriteString(unsigned char *str)
  430. {
  431.                 while(*str != '\0')
  432.        {
  433.                         LCM_WriteDatOrCom(1,*str++);
  434.         }
  435.                 *str = 0;          //這里是什么意思 指針歸0嗎?
  436. }

  437. /*************************************************************
  438. ** 函數名稱:CS5463_GetCurrentRMS
  439. ** 函數功能:讀取電流有效值函數
  440. ** 函數參數:無
  441. ** 創建時間:2009-9-15
  442. ** 第一次修改時間:無
  443. **************************************************************/
  444. static void CS5463_GetCurrentRMS(void)
  445. {
  446. fp32 G = 0.5,result;
  447. uint32 temp1;
  448. uint8 temp,i,j;
  449. CS5463ReadReg(REG_IRMSR,RX_Buff);                   //讀取電流有效值
  450. //SndCom1Data(RX_Buff,3);
  451. i = 0;
  452. result = 0;
  453. while(i<3)
  454. {
  455.           temp = RX_Buff[i];                                          
  456.         j = 0;
  457.         while(j<8)
  458.         {
  459.                  if(temp&0x80)
  460.                 {
  461.                          result += G;        
  462.                 }
  463.                 temp <<= 1;
  464.                 j++;
  465.                 G = G/2;        
  466.         }
  467.         i++;
  468. }
  469. result = result*CS5463_IScale;//I_Coff;                                                //計算電流值 暫時不用
  470. result *= 1000;                                                                //單位mA(毫安)  12345ma
  471. temp1 = (uint32)result;

  472. LCM_WriteDatOrCom  (0,0x94);
  473.         aa=        temp1/10000;
  474.         LCM_WriteDatOrCom(1,aa+0x30);
  475.         bb=        (temp1%10000)/1000;
  476.         LCM_WriteDatOrCom(1,bb+0x30);
  477.         cc=(temp1%1000)/100;
  478.         LCM_WriteDatOrCom(1,cc+0x30);
  479. //        LCM_WriteDatOrCom(1,0x2e);  //小數點  不需要小數點
  480.         dd=        (temp1%100)/10;
  481.         LCM_WriteDatOrCom(1,dd+0x30);
  482.         ee=temp1%10;
  483.         LCM_WriteDatOrCom(1,ee+0x30);
  484.         LCM_WriteString(" mA");

  485. // MeasureData[4] = (uint8)(temp1>>24);
  486. // MeasureData[5] = (uint8)(temp1>>16);
  487. // MeasureData[6] = (uint8)(temp1>>8);
  488. // MeasureData[7] = (uint8)temp1;
  489. // if(0x55==RelayQuery())                                                          //檢查繼電器是否閉合
  490. // {
  491. //         if(temp1<100)                                                                //檢查電流是否小于100mA
  492. //         {
  493. //                CS5463_CrmsSmallCunt++;
  494. //                if(CS5463_CrmsSmallCunt>10)
  495. //                {
  496. //                        CS5463_CrmsSmallCunt = 0;
  497. //                        Load_Status = 0x55;                                        //設置燈狀態為:開燈并電流過小
  498. //                        if(!CS5463LightFailure_PF)                          //檢查該報警是否已經回應
  499. //                        {
  500. //                                if(!CS5463LightFailure_nF)                //檢查定時重發標志
  501. //                                {
  502. //                                        Comm_ReportLightFailure(MeasureData+4);
  503. //                                        CS5463LightFailure_nF = 1;
  504. //                                        CS5463LightFailure_T = 1;
  505. //                                }
  506. //                        }
  507. //                }
  508. //         }
  509. //         else if(temp1>5000)                                                        //過流檢測:5000mA
  510. //         {
  511. //                CS5463_CrmsOverCunt++;
  512. //                if(CS5463_CrmsOverCunt>2)
  513. //                {
  514. //                        CS5463_CrmsOverCunt = 0;
  515. //                        //RelayCtrl(0);                                                //斷開繼電器
  516. //                        Comm_ReportOverLoad(MeasureData+4);        //報告過流信息
  517. //                }
  518. //         }
  519. //        else                                                                                  //如果電流正常
  520. //        {
  521. //                CS5463_CrmsSmallCunt = 0;
  522. //                 CS5463_CrmsOverCunt = 0;
  523. //                Load_Status = 0xAA;                                                //設置燈狀態為:開燈并正常
  524. //                CS5463LightFailure_PF = 0;                                   //復位報警標志
  525. //        }
  526. // }
  527. }



  528. /*************************************************************
  529. ** 函數名稱:CS5463_GetPactiveRMS
  530. ** 函數功能:讀取有功功率函數
  531. ** 函數參數:無
  532. ** 創建時間:2009-9-15
  533. ** 第一次修改時間:無
  534. **************************************************************/
  535. static void CS5463_GetPactiveRMS(void)
  536. {
  537. fp32 G = 1.0,result;
  538. uint8 temp,i,j;
  539. uint32 temp1;
  540. CS5463ReadReg(0x14,RX_Buff);           //讀取有功功率REG_Pactive
  541. //SndCom1Data(RX_Buff,3);
  542. temp = RX_Buff[0];
  543. if(temp&0x80)                                                          //如果為負數,計算原碼
  544. {
  545.           RX_Buff[0] = ~RX_Buff[0];                        //本來為取反+1,這里因為精度的原因,不+1
  546.         RX_Buff[1] = ~RX_Buff[1];
  547.         RX_Buff[2] = ~RX_Buff[2];                        
  548. }
  549. i = 0;
  550. result = 0;
  551. while(i<3)
  552. {
  553.           temp = RX_Buff[i];                                          
  554.         j = 0;
  555.         while(j<8)
  556.         {
  557.                  if(temp&0x80)
  558.                 {
  559.                          result += G;        
  560.                 }
  561.                 temp <<= 1;
  562.                 j++;
  563.                 G = G/2;        
  564.         }
  565.         i++;
  566. }
  567. // result = result*P_Coff;                                //計算功率,單位W(瓦特)
  568. // result = Vrms*Irms;                                        ////////直接計算功率
  569.   result = result*13125;
  570. temp1 = (uint32)result;

  571.   LCM_WriteDatOrCom  (0,0x8C);                //26W  12345W
  572.         aa=        temp1/10000;
  573.         LCM_WriteDatOrCom(1,aa+0x30);
  574.         bb=        (temp1%10000)/1000;
  575.         LCM_WriteDatOrCom(1,bb+0x30);
  576.         cc=(temp1%1000)/100;
  577.         LCM_WriteDatOrCom(1,cc+0x30);
  578. //        LCM_WriteDatOrCom(1,0x2e);  //小數點  不需要小數點
  579.         dd=        (temp1%100)/10;
  580.         LCM_WriteDatOrCom(1,dd+0x30);
  581.         ee=temp1%10;
  582.         LCM_WriteDatOrCom(1,ee+0x30);
  583.         LCM_WriteString(" W");


  584. // MeasureData[8] = (uint8)(temp1>>24);
  585. // MeasureData[9] = (uint8)(temp1>>16);
  586. // MeasureData[10] = (uint8)(temp1>>8);
  587. // MeasureData[11] = (uint8)temp1;
  588. }
  589. /*************************************************************
  590. ** 函數名稱:CS5463_GetPowerFactor
  591. ** 函數功能:讀取功率因數函數
  592. ** 函數參數:無
  593. ** 創建時間:2009-11-02
  594. ** 第一次修改時間:無
  595. **************************************************************/
  596. static void CS5463_GetPowerFactor(void)
  597. {
  598. fp32 G = 1.0,result;
  599. uint8 temp,i,j;
  600. uint32 temp1;
  601. CS5463ReadReg(0x32,RX_Buff);                   //讀取功率因數
  602. //SndCom1Data(RX_Buff,3);
  603. temp = RX_Buff[0];
  604. if(temp&0x80)                                                          //如果為負數,計算原碼
  605. {
  606.           RX_Buff[0] = ~RX_Buff[0];                        //本來為取反+1,這里因為精度的原因,不+1
  607.         RX_Buff[1] = ~RX_Buff[1];
  608.         RX_Buff[2] = ~RX_Buff[2];                        
  609. }
  610. i = 0;
  611. result = 0;
  612. while(i<3)
  613. {
  614.           temp = RX_Buff[i];                                          
  615.         j = 0;
  616.         while(j<8)
  617.         {
  618.                  if(temp&0x80)
  619.                 {
  620.                          result += G;        
  621.                 }
  622.                 temp <<= 1;
  623.                 j++;
  624.                 G = G/2;        
  625.         }
  626.         i++;
  627. }
  628. result *= 10000;
  629. temp1 = (uint32)result;
  630. // MeasureData[12] = (uint8)(temp1>>24);
  631. // MeasureData[13] = (uint8)(temp1>>16);
  632. // MeasureData[14] = (uint8)(temp1>>8);
  633. // MeasureData[15] = (uint8)temp1;
  634. }

  635. /*************************************************************
  636. ** 函數名稱:CS5463_GetTemperature
  637. ** 函數功能:讀取溫度函數
  638. ** 函數參數:無
  639. ** 創建時間:2009-11-03
  640. ** 第一次修改時間:無
  641. **************************************************************/
  642. static void CS5463_GetTemperature(void)          //溫度能顯示了 PT2017-2-12
  643. {
  644. fp32 G = 128,result;
  645. uint8 temp,i,j,pn=0;
  646. uint32 temp1;
  647. CS5463ReadReg(0x26,RX_Buff);                   //讀取溫度        是的在這里就讀到了溫度
  648. //SndCom1Data(RX_Buff,3);
  649. temp = RX_Buff[0];
  650. if(temp&0x80)                                                          //如果為負數,計算原碼
  651. {
  652.           pn = 1;                                                                //負數標志
  653.         RX_Buff[0] = ~RX_Buff[0];                        //本來為取反+1,這里因為精度的原因,不+1
  654.         RX_Buff[1] = ~RX_Buff[1];
  655.         RX_Buff[2] = ~RX_Buff[2];                        
  656. }
  657. i = 0;
  658. result = 0;    //這個值是浮點數 先清零 再逐個把0.5的權 數據加進來
  659. while(i<3)
  660. {
  661.           temp = RX_Buff[i];        //雖然這個數組定義了4個字節 實際就用了 Buff[0]  Buff[1]  RX_Buff[2]                                   
  662.         j = 0;
  663.         while(j<8)
  664.         {
  665.                  if(temp&0x80)
  666.                 {
  667.                          result += G;        //把0.5的權數據加進來                  
  668.                 }
  669.                 temp <<= 1;
  670.                 j++;
  671.                 G = G/2;        
  672.         }
  673.         i++;
  674. }
  675. if(result<128)                          //是的這個result 是 -127,128   這里已經獲取了溫度浮點值 最多是一個3位數? 還有小數點
  676. {
  677.          result *= 100;
  678.         temp1 = (uint32)result;          //是的 這里就是 例如12523  -----> 125.23  怎么去顯示? 如何分離 從8A開始顯示

  679.             LCM_WriteDatOrCom  (0,0x9C);        // 顯示起始位置  第4行
  680.                 aa=        temp1/ 10000;
  681.                 LCM_WriteDatOrCom(1,aa+0x30);         //怎么分離出來顯示 PT2017-2-9
  682.                 bb=temp1/1000- aa*10;
  683.                 LCM_WriteDatOrCom(1,bb+0x30);

  684.                 cc=        temp1/100- aa*100-bb*10;
  685.                 LCM_WriteDatOrCom(1,cc+0x30);
  686.             LCM_WriteDatOrCom(1,0x2e);         //"."
  687.                 dd=        (temp1%100)/10;
  688.                 LCM_WriteDatOrCom(1,dd+0x30);
  689.                 ee=temp1%10;
  690.                 LCM_WriteDatOrCom(1,ee+0x30);
  691.                 LCM_WriteString("℃");


  692. //                  PT2017-2-12 顯示3個字節的 十六進制數據
  693. //
  694. //            LCM_WriteDatOrCom  (0,0x9D);        // 顯示起始位置
  695. //                        a=RX_Buff[0]/16;
  696. //                        if(a<10)
  697. //                        {
  698. //                        LCM_WriteDatOrCom(1,a+0x30);
  699. //                        }
  700. //                        else
  701. //                        {
  702. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  703. //                        }
  704. //                        b=RX_Buff[0]%16;
  705. //
  706. //                         if(b<10)
  707. //                        {
  708. //                        LCM_WriteDatOrCom(1,b+0x30);
  709. //                        }
  710. //                        else
  711. //                        {
  712. //                         LCM_WriteDatOrCom(1,b+0x37);
  713. //                        }
  714. //
  715. //                        a=RX_Buff[1]/16;
  716. //
  717. //                        if(a<10)
  718. //                        {
  719. //                        LCM_WriteDatOrCom(1,a+0x30);
  720. //                        }
  721. //                        else
  722. //                        {
  723. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  724. //                        }
  725. //                        b=RX_Buff[1]%16;
  726. //
  727. //                         if(b<10)
  728. //                        {
  729. //                        LCM_WriteDatOrCom(1,b+0x30);
  730. //                        }
  731. //                        else
  732. //                        {
  733. //                         LCM_WriteDatOrCom(1,b+0x37);
  734. //                        }
  735. //                        
  736. //
  737. //
  738. //                        a=RX_Buff[2]/16;
  739. //
  740. //                        if(a<10)
  741. //                        {
  742. //                        LCM_WriteDatOrCom(1,a+0x30);
  743. //                        }
  744. //                        else
  745. //                        {
  746. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  747. //                        }
  748. //                        b=RX_Buff[2]%16;
  749. //
  750. //                         if(b<10)
  751. //                        {
  752. //                        LCM_WriteDatOrCom(1,b+0x30);
  753. //                        }
  754. //                        else
  755. //                        {
  756. //                         LCM_WriteDatOrCom(1,b+0x37);
  757. //                        }

  758. }
  759. }
  760. /*************************************************************
  761. ** 函數名稱:CS5463_GetVoltRMS
  762. ** 函數功能:讀取電壓有效值函數
  763. ** 函數參數:無
  764. ** 創建時間:2009-9-15
  765. ** 第一次修改時間:2009-9-23,修改電壓系數(需驗證)
  766. ** 第二次修改時間:2010-3-22,設定測量讀數小于100V時數據無效
  767. ** 第三次修改時間:
  768. **************************************************************/
  769. static void CS5463_GetVoltRMS(void)                 //這個函數啥意思?         PT2017-2-12 電壓顯示OK
  770. {
  771. float G = 0.5,result;                //typedef float          fp32;          就是浮點類型
  772. int temp1;                          //  int
  773. uint8 temp,i,j;                  //  byte
  774. CS5463ReadReg(REG_VRMSR,RX_Buff);                   //讀取電壓有效值            這里就讀到了嗎?  是
  775. //SndCom1Data(RX_Buff,3);                                        //#define REG_VRMSR           0x58        //電壓有效值  電壓有效值0x58嗎?是寫
  776. i = 0;
  777. result = 0;
  778. while(i<3)
  779. {
  780.           temp = RX_Buff[i];                                          
  781.         j = 0;
  782.         while(j<8)
  783.         {
  784.                  if(temp&0x80)
  785.                 {
  786.                          result += G;        
  787.                 }
  788.                 temp <<= 1;
  789.                 j++;
  790.                 G = G/2;        
  791.         }
  792.         i++;                                                               
  793. }                                                                                //電壓在220時取樣電壓為78mv
  794. result = result*CS5463_VScale;//V_Coff;                                //計算電壓值220V*250mv/(110mv/1.414)=704.8V            可以暫時不用  
  795. // if(result<=100)return;                                        //如果測量讀出電壓小于100V,確認讀數錯誤
  796. result *= 100;                                                //單位為mV(毫伏) 12345mv  5位你怎么顯示
  797. temp1 = (uint32)result;

  798.         LCM_WriteDatOrCom  (0,0x84);
  799.         aa=        temp1/10000;
  800.         LCM_WriteDatOrCom(1,aa+0x30);
  801.         bb=        (temp1%10000)/1000;
  802.         LCM_WriteDatOrCom(1,bb+0x30);
  803.         cc=(temp1%1000)/100;
  804.         LCM_WriteDatOrCom(1,cc+0x30);
  805.         LCM_WriteDatOrCom(1,0x2e);
  806.         dd=        (temp1%100)/10;
  807.         LCM_WriteDatOrCom(1,dd+0x30);
  808.         ee=temp1%10;
  809.         LCM_WriteDatOrCom(1,ee+0x30);
  810.         LCM_WriteString(" V");



  811. // MeasureData[0] = (uint8)(temp1>>24);
  812. // MeasureData[1] = (uint8)(temp1>>16);
  813. // MeasureData[2] = (uint8)(temp1>>8);
  814. // MeasureData[3] = (uint8)temp1;        
  815. }

  816. void main()
  817. {
  818.    CS5463_Init();
  819.     LCM_init();       //初始化液晶顯示器
  820.         LCM_clr();       //清屏
  821.         chn_disp(tab1); //顯示歡迎字
  822.         DelayM(500);  //顯示等留3秒
  823.         // LCM_clr();       //清屏
  824.    
  825.          
  826.           while(1)
  827.           {
  828.         //        if(INT)break;                                                        //檢查中斷信號

  829.                 sta        = CS5463_GetStatusReg();                          //檢測中斷產生的原因
  830.                 if(0x01==(sta&0x01))                                           //讀取電流電壓
  831.                 {        
  832.         //                CS5463Monitor_Cunt = 0;                                //如果有中斷,表明芯片正常工作,清除監控定時器
  833.                         CS5463_ResetStatusReg();                        //清除標志
  834.                         CS5463_GetVoltRMS();                                //獲取電壓
  835.                         CS5463_GetCurrentRMS();                                //獲取電流
  836.                         CS5463_GetPactiveRMS();                                //獲取功率
  837. //                        CS5463_GetPowerFactor();                        //獲取功率因數
  838.                         if(0x02==(sta&0x02))                                //讀取溫度
  839.                         {        
  840.                         CS5463_GetVoltRMS();                                //獲取電壓                                                               
  841.                         CS5463_GetTemperature();                    //溫度讀取不需要太頻繁,所以跟電流電壓一起讀取

  842.                                 //CS5463_Init();                                //重新初始化芯片
  843.                         }                                                
  844.                         //SndCom1Data(MeasureData,16);
  845.                 }





  846.                 //   read_register(0x18,(void *)r); //讀取Vrms寄存器值



  847. //                        LCM_WriteDatOrCom  (0,0x85);        // 顯示起始位置           PT 2017-2-12 不用顯示了
  848. //                        a=sta/16;   //這個sta變成0 了怎么辦?
  849. //                        if(a<10)
  850. //                        {
  851. //                        LCM_WriteDatOrCom(1,a+0x30);
  852. //                        }
  853. //                        else
  854. //                        {
  855. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  856. //                        }
  857. //                        b=sta%16;
  858. //
  859. //                         if(b<10)
  860. //                        {
  861. //                        LCM_WriteDatOrCom(1,b+0x30);
  862. //                        }
  863. //                        else
  864. //                        {
  865. //                         LCM_WriteDatOrCom(1,b+0x37);
  866. //                        }


  867. //
  868. //                        a=r[1]/16;
  869. //
  870. //                        if(a<10)
  871. //                        {
  872. //                        LCM_WriteDatOrCom(1,a+0x30);
  873. //                        }
  874. //                        else
  875. //                        {
  876. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  877. //                        }
  878. //                        b=r[1]%16;
  879. //
  880. //                         if(b<10)
  881. //                        {
  882. //                        LCM_WriteDatOrCom(1,b+0x30);
  883. //                        }
  884. //                        else
  885. //                        {
  886. //                         LCM_WriteDatOrCom(1,b+0x37);
  887. //                        }
  888. //                        
  889. //
  890. //
  891. //                        a=r[2]/16;
  892. //
  893. //                        if(a<10)
  894. //                        {
  895. //                        LCM_WriteDatOrCom(1,a+0x30);
  896. //                        }
  897. //                        else
  898. //                        {
  899. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  900. //                        }
  901. //                        b=r[2]%16;
  902. //
  903. //                         if(b<10)
  904. //                        {
  905. //                        LCM_WriteDatOrCom(1,b+0x30);
  906. //                        }
  907. //                        else
  908. //                        {
  909. //                         LCM_WriteDatOrCom(1,b+0x37);
  910. //                        }
  911. //
  912. //
  913. //
  914. //
  915. //                        // read_register(0x16,(void *)r); //讀取Irms寄存器值,并通過串口發送
  916. //
  917. //                        LCM_WriteDatOrCom  (0,0x95);        // 顯示起始位置
  918. //                        a=r[0]/16;
  919. //                        if(a<10)
  920. //                        {
  921. //                        LCM_WriteDatOrCom(1,a+0x30);
  922. //                        }
  923. //                        else
  924. //                        {
  925. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  926. //                        }
  927. //                        b=r[0]%16;
  928. //
  929. //                         if(b<10)
  930. //                        {
  931. //                        LCM_WriteDatOrCom(1,b+0x30);
  932. //                        }
  933. //                        else
  934. //                        {
  935. //                         LCM_WriteDatOrCom(1,b+0x37);
  936. //                        }
  937. //
  938. //                        a=r[1]/16;
  939. //
  940. //                        if(a<10)
  941. //                        {
  942. //                        LCM_WriteDatOrCom(1,a+0x30);
  943. //                        }
  944. //                        else
  945. //                        {
  946. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  947. //                        }
  948. //                        b=r[1]%16;
  949. //
  950. //                         if(b<10)
  951. //                        {
  952. //                        LCM_WriteDatOrCom(1,b+0x30);
  953. //                        }
  954. //                        else
  955. //                        {
  956. //                         LCM_WriteDatOrCom(1,b+0x37);
  957. //                        }
  958. //                        
  959. //
  960. //
  961. //                        a=r[2]/16;
  962. //
  963. //                        if(a<10)
  964. //                        {
  965. //                        LCM_WriteDatOrCom(1,a+0x30);
  966. //                        }
  967. //                        else
  968. //                        {
  969. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  970. //                        }
  971. //                        b=r[2]%16;
  972. //
  973. //                         if(b<10)
  974. //                        {
  975. //                        LCM_WriteDatOrCom(1,b+0x30);
  976. //                        }
  977. //                        else
  978. //                        {
  979. //                         LCM_WriteDatOrCom(1,b+0x37);
  980. //                        }










  981.                          //   read_register(0x14,(void *)r); //讀取Irms寄存器值,并通過串口發送

  982. //                        LCM_WriteDatOrCom  (0,0x8D);        // 顯示起始位置
  983. //                        a=r[0]/16;
  984. //                        if(a<10)
  985. //                        {
  986. //                        LCM_WriteDatOrCom(1,a+0x30);
  987. //                        }
  988. //                        else
  989. //                        {
  990. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  991. //                        }
  992. //                        b=r[0]%16;
  993. //
  994. //                         if(b<10)
  995. //                        {
  996. //                        LCM_WriteDatOrCom(1,b+0x30);
  997. //                        }
  998. //                        else
  999. //                        {
  1000. //                         LCM_WriteDatOrCom(1,b+0x37);
  1001. //                        }
  1002. //
  1003. //                        a=r[1]/16;
  1004. //
  1005. //                        if(a<10)
  1006. //                        {
  1007. //                        LCM_WriteDatOrCom(1,a+0x30);
  1008. //                        }
  1009. //                        else
  1010. //                        {
  1011. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  1012. //                        }
  1013. //                        b=r[1]%16;
  1014. //
  1015. //                         if(b<10)
  1016. //                        {
  1017. //                        LCM_WriteDatOrCom(1,b+0x30);
  1018. //                        }
  1019. //                        else
  1020. //                        {
  1021. //                         LCM_WriteDatOrCom(1,b+0x37);
  1022. //                        }
  1023. //                        
  1024. //
  1025. //
  1026. //                        a=r[2]/16;
  1027. //
  1028. //                        if(a<10)
  1029. //                        {
  1030. //                        LCM_WriteDatOrCom(1,a+0x30);
  1031. //                        }
  1032. //                        else
  1033. //                        {
  1034. //                         LCM_WriteDatOrCom(1,a+0x37);  //為什么多了7個?
  1035. //                        }
  1036. //                        b=r[2]%16;
  1037. //
  1038. //                         if(b<10)
  1039. //                        {
  1040. //                        LCM_WriteDatOrCom(1,b+0x30);
  1041. //                        }
  1042. //                        else
  1043. //                        {
  1044. //                         LCM_WriteDatOrCom(1,b+0x37);
  1045. //                        }



  1046.                 //          read_register(0x26,(void *)r); //溫度

  1047.                 //        T=125;            //對于不確定長度的 怎么辦? 2位小數就很不錯了 所以這里就是把小數*100在去顯示 int類型變量怎么辦?
  1048. //                        LCM_WriteDatOrCom  (0,0x95);        // 顯示起始位置
  1049. //                        aa=T/100;                 //怎么提取出來1呢 ?
  1050. //                        LCM_WriteDatOrCom(1,aa+0x30);        //顯示溫度十位                 先看懂這里 0-9的就是+0x30 就可以 這里就是寫數據  
  1051. //                        bb=T/10-aa*10;         //這個2 是怎么提取的呢? 12-10*1=2
  1052. //                        LCM_WriteDatOrCom(1,bb+0x30);        //個位
  1053. //                        LCM_WriteDatOrCom(1,0x2e);         //"."
  1054. //                        cc=T-aa*100-bb*10;          //再看這個5是如何提取出來的呢? 125- 100-20 =5  有更好的提取方法嗎?
  1055. //                        LCM_WriteDatOrCom(1,cc+0x30); //小位1位
  1056. //                        LCM_WriteString("℃");        
  1057. //                        T=T+1;
  1058. //                        DelayM(50);
  1059.                 }


  1060. }
復制代碼

所有資料51hei提供下載:
12864-CS5463-STC89S52源代碼-2017-7-9OK.zip (68.94 KB, 下載次數: 27)


評分

參與人數 2黑幣 +10 收起 理由
muzhi + 5 贊一個!
卡西莫多i + 5 絕世好帖!

查看全部評分

回復

使用道具 舉報

ID:321933 發表于 2018-5-24 23:56 | 顯示全部樓層
非常感謝分享!在做畢設中,有很大的參考價值
回復

使用道具 舉報

ID:321933 發表于 2018-6-3 22:59 | 顯示全部樓層
可以問一下我把程序燒錄進去,顯示屏卻沒有顯示啊,這里有設定好顯示數據位置的函數嗎?
回復

使用道具 舉報

ID:321933 發表于 2018-6-3 23:14 | 顯示全部樓層
想問一下燒錄了程序,顯示屏卻不顯示,QAQ有什么解決方案嗎?
回復

使用道具 舉報

ID:615920 發表于 2019-9-24 21:56 | 顯示全部樓層
想問一下燒錄了程序,顯示屏卻不顯示,QAQ有什么解決方案嗎?
回復

使用道具 舉報

ID:73182 發表于 2019-9-25 08:11 | 顯示全部樓層
有電路圖嗎
回復

使用道具 舉報

ID:616081 發表于 2019-9-25 11:18 | 顯示全部樓層

謝謝樓主的分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区精品在线观看 | 国产成人精品一区二区在线 | 色婷婷激情| 亚洲精品字幕 | 亚洲欧美一区二区三区视频 | 天天色综 | 欧美一区二区三区在线观看 | 久艹网站 | 视频一区二区在线观看 | 欧美一级片在线观看 | a久久| 亚洲欧美日韩精品久久亚洲区 | 伊人久久精品一区二区三区 | 国产精品日韩在线观看一区二区 | 嫩草视频网站 | 久国产视频 | 日本不卡一区二区三区在线观看 | 国产大片一区 | 91视视频在线观看入口直接观看 | 国产精品毛片av一区 | 中文字幕av网站 | 国产乡下妇女做爰 | 在线观看av网站永久 | 中文字幕在线三区 | 日本黄色免费片 | 欧美日韩不卡 | 亚洲综合99| 日本视频中文字幕 | 黄色一级电影在线观看 | 久久九 | 99在线免费观看 | 国产97在线视频 | 成人精品鲁一区一区二区 | 久久亚洲国产 | 国产a区 | 欧美久操网 | 久热精品在线观看视频 | 久久精品视频亚洲 | 一区在线视频 | 91一区二区 | 国产四虎|