找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3767|回复: 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 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:321933 发表于 2018-5-24 23:56 | 只看该作者
非常感谢分享!在做毕设中,有很大的参考价值
回复

使用道具 举报

板凳
ID:321933 发表于 2018-6-3 22:59 | 只看该作者
可以问一下我把程序烧录进去,显示屏却没有显示啊,这里有设定好显示数据位置的函数吗?
回复

使用道具 举报

地板
ID:321933 发表于 2018-6-3 23:14 | 只看该作者
想问一下烧录了程序,显示屏却不显示,QAQ有什么解决方案吗?
回复

使用道具 举报

5#
ID:615920 发表于 2019-9-24 21:56 | 只看该作者
想问一下烧录了程序,显示屏却不显示,QAQ有什么解决方案吗?
回复

使用道具 举报

6#
ID:73182 发表于 2019-9-25 08:11 | 只看该作者
有电路图吗
回复

使用道具 举报

7#
ID:616081 发表于 2019-9-25 11:18 | 只看该作者

谢谢楼主的分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表