|
這是單相電用電器監(jiān)測(cè)裝置的設(shè)計(jì)源代碼
用cs5463進(jìn)行電能計(jì)算 單片機(jī)控制 12864顯示的源代碼
單片機(jī)源碼如下:
- //頭文件
- #include <REG52.h>
- #include <string.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- typedef bit bool;
- typedef unsigned char uint8; /* defined for unsigned 8-bits integer variable 無符號(hào)8位整型變量 */
- typedef signed char int8; /* defined for signed 8-bits integer variable 有符號(hào)8位整型變量 */
- typedef unsigned int uint16; /* defined for unsigned 16-bits integer variable 無符號(hào)16位整型變量 */
- typedef signed int int16; /* defined for signed 16-bits integer variable 有符號(hào)16位整型變量 */
- typedef unsigned long uint32; /* defined for unsigned 32-bits integer variable 無符號(hào)32位整型變量 */
- typedef signed long int32; /* defined for signed 32-bits integer variable 有符號(hào)32位整型變量 */
- typedef float fp32; /* single precision floating point variable (32bits) 單精度浮點(diǎn)數(shù)(32位長度) */
- /*****************************************************************************/
- sbit LCM_cs = P2^0; //RS
- sbit LCM_std = P2^1; //SID
- sbit LCM_sclk = P2^2; //SCLK
- sbit LCM_psb = P2^3; //H=并口; L=串口;
- sbit LCM_rst = P2^4; //Reset Signal 低電平有效 sbit LCM_rst = P2^0;
- //sbit beep = P2^5;
- //sbit p2_4 = P2^6; //定義背光控制口
- char a,b,c;
- char aa,bb,cc,dd,ee;
- char i,q,T=125;
- uchar code tab1[]={
- "電壓 "
- "功率 "
- "電流 "
- "溫度 "
- };
- /****************************************************************************/
- uchar r[3]={0x00,0x00,0x00};
- /******************************************************************
- 接口定義
- ******************************************************************/
- sbit SCLK=P1^1; //ck
- sbit MOSI=P1^0; //DI
- sbit MISO=P1^2; //DO //這個(gè)定義對(duì)嗎?
- sbit INT=P3^2;
- sbit CS=P1^3;
- sbit RST=P1^4; //RST
- #define CS5463_VScale 525 //計(jì)算電壓比例,220V*250mv/110mv=500V
- #define CS5463_IScale (250/10) //計(jì)算電流比例
- static uint8 RX_Buff[4]; //CS5463讀寫緩沖區(qū)
- uint8 sta; //芯片狀態(tài)
- #define READ_MASK 0xBF //讀寄存器時(shí)的屏蔽碼,與(寫)地址相與
- #define CMD_SYNC0 0XFE //結(jié)束串口重新初始化
- #define CMD_SYNC1 0XFF //開始串口重新初始化
- #define REG_CONFR 0x40 //配置
- #define REG_CYCCONT 0x4A //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
- #define REG_STATUSR 0x5E //狀態(tài)
- #define REG_MODER 0x64 //操作模式
- #define REG_MASKR 0x74 //中斷屏蔽
- #define REG_CTRLR 0x78 //控制
- #define CMD_STARTC 0XE8 //執(zhí)行連續(xù)計(jì)算周期
- #define REG_VRMSR 0X18 //VRMS
- #define REG_IRMSR 0X16 //IRMS
- #define REG_Pactive 0X14 //Pactive
-
- /*************************************************************
- ** 函數(shù)名稱:uDelay
- ** 函數(shù)功能:延時(shí)
- ** 函數(shù)參數(shù):j
- ** 返回值:無
- ** 創(chuàng)建時(shí)間:2009-4-23
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void uDelay(uint8 j)
- {
- uint8 i;
- for(;j>0;j--)
- { for(i=0;i<255;i--)
- {
- ;
- }
- }
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463CMD
- ** 函數(shù)功能:CS5463命令函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-14
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463CMD(uint8 cmd)
- {
- uint8 i;
- SCLK = 1;
- CS = 0;
- i = 0;
- while(i<8)
- {
- uDelay(50);
- SCLK = 0;
- if(cmd&0x80)MOSI = 1;
- else MOSI = 0;
- uDelay(50);
- SCLK = 1; //在時(shí)鐘上升沿,數(shù)據(jù)被寫入CS5463
- cmd <<= 1;
- i++;
- }
- uDelay(50);
- CS = 1;
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463WriteReg
- ** 函數(shù)功能:CS5463寫寄存器函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-14
- ** 第一次修改時(shí)間:無
- **************************************************************/
- void CS5463WriteReg(uint8 addr,uint8 *p)
- {
- uint8 i,j;
- uint8 dat;
- SCLK = 1;
- CS = 0;
- i = 0;
- while(i<8)
- {
- uDelay(50);
- SCLK = 0;
- if(addr&0x80)MOSI = 1;
- else MOSI = 0;
- uDelay(50);
- SCLK = 1; //在時(shí)鐘上升沿,數(shù)據(jù)被寫入CS5463
- addr <<= 1;
- i++;
- }
- j = 0;
- while(j<3)
- {
- dat = *(p+j);
- i = 0;
- while(i<8)
- {
- uDelay(50);
- SCLK = 0;
- if(dat&0x80)MOSI = 1;
- else MOSI = 0;
- uDelay(50);
- SCLK = 1; //在時(shí)鐘上升沿,數(shù)據(jù)被寫入CS5463
- dat <<= 1;
- i++;
- }
- j++;
- }
- uDelay(50);
- CS = 1;
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463ReadReg
- ** 函數(shù)功能:CS5463讀寄存器函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-14
- ** 第一次修改時(shí)間:無
- **************************************************************/
- void CS5463ReadReg(uint8 addr,uint8 *p)
- {
- uint8 i,j;
- uint8 dat;
- SCLK = 0;
- CS = 0;
- addr &= READ_MASK;
- i = 0;
- while(i<8)
- {
- uDelay(50);
- SCLK = 0;
- if(addr&0x80)MOSI = 1;
- else MOSI = 0;
- uDelay(50);
- SCLK = 1;
- addr <<= 1; //在時(shí)鐘上升沿,數(shù)據(jù)被寫入CS5463
- i++;
- }
- uDelay(50);
- MOSI = 1;
- j = 0;
- while(j<3)
- {
- i = 0;
- dat = 0;
- while(i<8)
- {
- if(i==7)MOSI = 0;
- else MOSI = 1;
- SCLK = 0;
- uDelay(50);
- dat <<= 1;
- if(MISO)dat |= 0x01;
- else dat &= 0xFE;
- SCLK = 1;
- uDelay(50);
- i++;
- }
- *(p+j) = dat;
- j++;
- }
- MOSI = 1;
- CS = 1;
- }
- /*************************************************************************************************
- ** CS5463 應(yīng)用函數(shù)
- *************************************************************************************************/
- /*************************************************************
- ** 函數(shù)名稱:CS5463Init
- ** 函數(shù)功能:CS5463復(fù)位和初始化函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-14
- ** 第一次修改時(shí)間:無
- **************************************************************/
- bit CS5463_Init(void) //bit 可以這樣嗎?
- {
- RST = 0;
- uDelay(200);
- RST = 1;
- uDelay(100);
- //----------------------
- //發(fā)送同步序列
- RX_Buff[0] = CMD_SYNC1;
- RX_Buff[1] = CMD_SYNC1;
- RX_Buff[2] = CMD_SYNC0;
- CS5463WriteReg(CMD_SYNC1,RX_Buff); //#define CMD_SYNC1 0XFF //開始串口重新初始化
- //----------------------
- //初始化--配置寄存器
- //相位補(bǔ)償為PC[6:0]=[0000000];
- //電流通道增益為Igain=10;
- //EWA=0;
- //INT中斷為低電平有效IMODE:IINV=[00]
- //iCPU=0
- //K[3:0]=[0001]
- RX_Buff[0] = 0x00;
- RX_Buff[1] = 0x00;
- RX_Buff[2] = 0x01;
- CS5463WriteReg(REG_CONFR,RX_Buff); // #define REG_CONFR 0x40 //配置
- //----------------------
- //初始化--操作寄存器
- RX_Buff[0] = 0x00; //B0000_0000; //這是什么鬼 可以這樣嗎?
- RX_Buff[1] = 0x00;//B0000_0000;
- RX_Buff[2] = 0x60;//B0110_0000;
- CS5463WriteReg(REG_MODER,RX_Buff); //#define REG_MODER 0x64 //操作模式
- //----------------------
- //初始化--電流 交流偏置 校準(zhǔn)寄存器
- // RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
- // CS5463WriteReg(REG_IACOFF,RX_Buff);
- //----------------------
- //初始化--電流 增益校準(zhǔn)寄存器
- // RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
- // CS5463WriteReg(REG_IGN,RX_Buff);
- //----------------------
- //初始化--電壓 交流偏置 校準(zhǔn)寄存器
- // RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
- // CS5463WriteReg(REG_VACOFF,RX_Buff);
- //----------------------
- //初始化--電壓 增益校準(zhǔn)寄存器
- // RW24XX(RX_Buff,3,EE_VACGAIN,0xA1);
- // CS5463WriteReg(REG_VGN,RX_Buff);
- //----------------------
- RX_Buff[0] = 0x00;
- RX_Buff[1] = 0x0F;
- RX_Buff[2] = 0xA0; //#define REG_CYCCONT 0x4A //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
- CS5463WriteReg(REG_CYCCONT,RX_Buff); //初始化--CYCLE COUNT 寄存器,4000
- //----------------------
- //初始化--脈沖速率寄存器
- // RX_Buff[0] = 0x00;
- // RX_Buff[1] = 0x34;
- // RX_Buff[2] = 0x9C;
- // CS5463WriteReg(REG_PULRATE,RX_Buff);
- //----------------------
- RX_Buff[0] = 0xFF;
- RX_Buff[1] = 0xFF;
- RX_Buff[2] = 0xFF;
- CS5463WriteReg(REG_STATUSR,RX_Buff); //初始化--狀態(tài)寄存器 #define REG_STATUSR 0x5E //狀態(tài)
- //----------------------
- RX_Buff[0] = 0x80; //開電流、電壓、功率測(cè)量完畢中斷
- RX_Buff[1] = 0x00;
- RX_Buff[2] = 0x80; //開溫度測(cè)量完畢中斷
- CS5463WriteReg(REG_MASKR,RX_Buff); //初始化--中斷屏蔽寄存器 #define REG_MASKR 0x74 //中斷屏蔽
- //----------------------
- RX_Buff[0] = 0x00;
- RX_Buff[1] = 0x00;
- RX_Buff[2] = 0x00;
- CS5463WriteReg(REG_CTRLR,RX_Buff); //初始化--控制寄存器 #define REG_CTRLR 0x78 //控制
- //----------------------
- CS5463CMD(CMD_STARTC); //啟動(dòng)連續(xù)轉(zhuǎn)換 #define CMD_STARTC 0XE8 //執(zhí)行連續(xù)計(jì)算周期
- //CS5463_Status = 0; //初始化任務(wù)進(jìn)程狀態(tài)
- //Load_Status = 0;
- //CS5463_CrmsSmallCunt = 0;
- //CS5463_CrmsOverCunt = 0;
- return(1); //只要做完這些步驟就返回true 1
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_ResetStatusReg
- ** 函數(shù)功能:復(fù)位狀態(tài)寄存器函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-15
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463_ResetStatusReg(void)
- {
- RX_Buff[0] = 0xFF;
- RX_Buff[1] = 0xFF;
- RX_Buff[2] = 0xFF;
- CS5463WriteReg(0x5E,RX_Buff); //復(fù)位狀態(tài)寄存器 #define REG_STATUSR 0x5E //狀態(tài)
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetStatusReg
- ** 函數(shù)功能:讀取狀態(tài)寄存器函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-15
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static uint8 CS5463_GetStatusReg(void)
- {
- uint8 sta=0;
- CS5463ReadReg(0x1E,RX_Buff); //1E 是什么? 狀態(tài)寄存器
- if(RX_Buff[0]&0x80) //檢測(cè):電流、電壓、功率測(cè)量是否完畢
- {
- //檢測(cè)電流/電壓是否超出范圍
- //檢測(cè)電流有效值/電壓有效值/電能是否超出范圍
- if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
- {
- CS5463_ResetStatusReg(); //復(fù)位狀態(tài)寄存器
- }
- else
- {
- sta |= 0x01;//B0000_0001; //這什么意思 還可以這樣寫嗎? PT2017-2-8 分隔符嗎?
- }
- }
- if(RX_Buff[2]&0x80) //檢測(cè):溫度測(cè)量是否完畢
- {
- sta |=0x02; //B0000_0010;
- }
- return(sta);
- }
- void DelayM(unsigned int a) //延時(shí)函數(shù) 1MS/次
- {
- unsigned char i;
- while( --a != 0)
- {
- for(i = 0; i < 125; i++); //一個(gè) ; 表示空語句,CPU空轉(zhuǎn)從0加到125,CPU大概就耗時(shí)1毫秒?
- }
- }
- void Delay(int num)//延時(shí)函數(shù)
- {
- while(num--);
- }
- /******************************************************************************/
- //寫指令或數(shù)據(jù) (0,指令) (1,數(shù)據(jù))
- void LCM_WriteDatOrCom(bit dat_comm,uchar content)
- {
- uchar a,i,j;
- Delay(50);
- a=content;
- LCM_cs=1;
- LCM_sclk=0;
- LCM_std=1;
- for(i=0;i<5;i++)
- {
- LCM_sclk=1;
- LCM_sclk=0;
- }
- LCM_std=0;
- LCM_sclk=1;
- LCM_sclk=0;
- if(dat_comm)
- LCM_std=1; //data
- else
- LCM_std=0; //command
- LCM_sclk=1;
- LCM_sclk=0;
- LCM_std=0;
- LCM_sclk=1;
- LCM_sclk=0;
- for(j=0;j<2;j++)
- {
- for(i=0;i<4;i++)
- {
- a=a<<1;
- LCM_std=CY;
- LCM_sclk=1;
- LCM_sclk=0;
- }
- LCM_std=0;
- for(i=0;i<4;i++)
- {
- LCM_sclk=1;
- LCM_sclk=0;
- }
- }
- }
- /*********************************************************************************/
- /*****************************************************************************/
- //初始化LCM
- void LCM_init(void)
- {
- LCM_rst=1;
- LCM_psb=0;
- LCM_WriteDatOrCom (0,0x30); /*30---基本指令動(dòng)作*/
- LCM_WriteDatOrCom (0,0x01); /*清屏,地址指針指向00H*/
- Delay (100);
- LCM_WriteDatOrCom (0,0x06); /*光標(biāo)的移動(dòng)方向*/
- LCM_WriteDatOrCom(0,0x0c); /*開顯示,關(guān)游標(biāo)*/
- }
- void chn_disp (uchar code *chn) //顯示4行 指針
- {
- uchar i,j;
- LCM_WriteDatOrCom (0,0x30); // 0 是指令 這2個(gè)命令 是干什么 的?
- LCM_WriteDatOrCom (0,0x80); //
- for (j=0;j<4;j++)
- {
- for (i=0;i<16;i++)
- LCM_WriteDatOrCom (1,chn[j*16+i]);
- }
- }
- /*****************************************************************************/
- //清屏函數(shù)
- void LCM_clr(void)
- {
- LCM_WriteDatOrCom (0,0x30);
- LCM_WriteDatOrCom (0,0x01); /*清屏,地址指針指向00H*/
- Delay (180);
- }
- /*****************************************************************************/
- //向LCM發(fā)送一個(gè)字符串,長度64字符之內(nèi)。
- //應(yīng)用:LCM_WriteString("您好!");
- void LCM_WriteString(unsigned char *str)
- {
- while(*str != '\0')
- {
- LCM_WriteDatOrCom(1,*str++);
- }
- *str = 0; //這里是什么意思 指針歸0嗎?
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetCurrentRMS
- ** 函數(shù)功能:讀取電流有效值函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-15
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463_GetCurrentRMS(void)
- {
- fp32 G = 0.5,result;
- uint32 temp1;
- uint8 temp,i,j;
- CS5463ReadReg(REG_IRMSR,RX_Buff); //讀取電流有效值
- //SndCom1Data(RX_Buff,3);
- i = 0;
- result = 0;
- while(i<3)
- {
- temp = RX_Buff[i];
- j = 0;
- while(j<8)
- {
- if(temp&0x80)
- {
- result += G;
- }
- temp <<= 1;
- j++;
- G = G/2;
- }
- i++;
- }
- result = result*CS5463_IScale;//I_Coff; //計(jì)算電流值 暫時(shí)不用
- result *= 1000; //單位mA(毫安) 12345ma
- temp1 = (uint32)result;
- LCM_WriteDatOrCom (0,0x94);
- aa= temp1/10000;
- LCM_WriteDatOrCom(1,aa+0x30);
- bb= (temp1%10000)/1000;
- LCM_WriteDatOrCom(1,bb+0x30);
- cc=(temp1%1000)/100;
- LCM_WriteDatOrCom(1,cc+0x30);
- // LCM_WriteDatOrCom(1,0x2e); //小數(shù)點(diǎn) 不需要小數(shù)點(diǎn)
- dd= (temp1%100)/10;
- LCM_WriteDatOrCom(1,dd+0x30);
- ee=temp1%10;
- LCM_WriteDatOrCom(1,ee+0x30);
- LCM_WriteString(" mA");
- // MeasureData[4] = (uint8)(temp1>>24);
- // MeasureData[5] = (uint8)(temp1>>16);
- // MeasureData[6] = (uint8)(temp1>>8);
- // MeasureData[7] = (uint8)temp1;
- // if(0x55==RelayQuery()) //檢查繼電器是否閉合
- // {
- // if(temp1<100) //檢查電流是否小于100mA
- // {
- // CS5463_CrmsSmallCunt++;
- // if(CS5463_CrmsSmallCunt>10)
- // {
- // CS5463_CrmsSmallCunt = 0;
- // Load_Status = 0x55; //設(shè)置燈狀態(tài)為:開燈并電流過小
- // if(!CS5463LightFailure_PF) //檢查該報(bào)警是否已經(jīng)回應(yīng)
- // {
- // if(!CS5463LightFailure_nF) //檢查定時(shí)重發(fā)標(biāo)志
- // {
- // Comm_ReportLightFailure(MeasureData+4);
- // CS5463LightFailure_nF = 1;
- // CS5463LightFailure_T = 1;
- // }
- // }
- // }
- // }
- // else if(temp1>5000) //過流檢測(cè):5000mA
- // {
- // CS5463_CrmsOverCunt++;
- // if(CS5463_CrmsOverCunt>2)
- // {
- // CS5463_CrmsOverCunt = 0;
- // //RelayCtrl(0); //斷開繼電器
- // Comm_ReportOverLoad(MeasureData+4); //報(bào)告過流信息
- // }
- // }
- // else //如果電流正常
- // {
- // CS5463_CrmsSmallCunt = 0;
- // CS5463_CrmsOverCunt = 0;
- // Load_Status = 0xAA; //設(shè)置燈狀態(tài)為:開燈并正常
- // CS5463LightFailure_PF = 0; //復(fù)位報(bào)警標(biāo)志
- // }
- // }
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetPactiveRMS
- ** 函數(shù)功能:讀取有功功率函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-15
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463_GetPactiveRMS(void)
- {
- fp32 G = 1.0,result;
- uint8 temp,i,j;
- uint32 temp1;
- CS5463ReadReg(0x14,RX_Buff); //讀取有功功率REG_Pactive
- //SndCom1Data(RX_Buff,3);
- temp = RX_Buff[0];
- if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
- {
- RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因?yàn)榫鹊脑,?1
- RX_Buff[1] = ~RX_Buff[1];
- RX_Buff[2] = ~RX_Buff[2];
- }
- i = 0;
- result = 0;
- while(i<3)
- {
- temp = RX_Buff[i];
- j = 0;
- while(j<8)
- {
- if(temp&0x80)
- {
- result += G;
- }
- temp <<= 1;
- j++;
- G = G/2;
- }
- i++;
- }
- // result = result*P_Coff; //計(jì)算功率,單位W(瓦特)
- // result = Vrms*Irms; ////////直接計(jì)算功率
- result = result*13125;
- temp1 = (uint32)result;
- LCM_WriteDatOrCom (0,0x8C); //26W 12345W
- aa= temp1/10000;
- LCM_WriteDatOrCom(1,aa+0x30);
- bb= (temp1%10000)/1000;
- LCM_WriteDatOrCom(1,bb+0x30);
- cc=(temp1%1000)/100;
- LCM_WriteDatOrCom(1,cc+0x30);
- // LCM_WriteDatOrCom(1,0x2e); //小數(shù)點(diǎn) 不需要小數(shù)點(diǎn)
- dd= (temp1%100)/10;
- LCM_WriteDatOrCom(1,dd+0x30);
- ee=temp1%10;
- LCM_WriteDatOrCom(1,ee+0x30);
- LCM_WriteString(" W");
- // MeasureData[8] = (uint8)(temp1>>24);
- // MeasureData[9] = (uint8)(temp1>>16);
- // MeasureData[10] = (uint8)(temp1>>8);
- // MeasureData[11] = (uint8)temp1;
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetPowerFactor
- ** 函數(shù)功能:讀取功率因數(shù)函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-11-02
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463_GetPowerFactor(void)
- {
- fp32 G = 1.0,result;
- uint8 temp,i,j;
- uint32 temp1;
- CS5463ReadReg(0x32,RX_Buff); //讀取功率因數(shù)
- //SndCom1Data(RX_Buff,3);
- temp = RX_Buff[0];
- if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
- {
- RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因?yàn)榫鹊脑,?1
- RX_Buff[1] = ~RX_Buff[1];
- RX_Buff[2] = ~RX_Buff[2];
- }
- i = 0;
- result = 0;
- while(i<3)
- {
- temp = RX_Buff[i];
- j = 0;
- while(j<8)
- {
- if(temp&0x80)
- {
- result += G;
- }
- temp <<= 1;
- j++;
- G = G/2;
- }
- i++;
- }
- result *= 10000;
- temp1 = (uint32)result;
- // MeasureData[12] = (uint8)(temp1>>24);
- // MeasureData[13] = (uint8)(temp1>>16);
- // MeasureData[14] = (uint8)(temp1>>8);
- // MeasureData[15] = (uint8)temp1;
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetTemperature
- ** 函數(shù)功能:讀取溫度函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-11-03
- ** 第一次修改時(shí)間:無
- **************************************************************/
- static void CS5463_GetTemperature(void) //溫度能顯示了 PT2017-2-12
- {
- fp32 G = 128,result;
- uint8 temp,i,j,pn=0;
- uint32 temp1;
- CS5463ReadReg(0x26,RX_Buff); //讀取溫度 是的在這里就讀到了溫度
- //SndCom1Data(RX_Buff,3);
- temp = RX_Buff[0];
- if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
- {
- pn = 1; //負(fù)數(shù)標(biāo)志
- RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因?yàn)榫鹊脑颍?1
- RX_Buff[1] = ~RX_Buff[1];
- RX_Buff[2] = ~RX_Buff[2];
- }
- i = 0;
- result = 0; //這個(gè)值是浮點(diǎn)數(shù) 先清零 再逐個(gè)把0.5的權(quán) 數(shù)據(jù)加進(jìn)來
- while(i<3)
- {
- temp = RX_Buff[i]; //雖然這個(gè)數(shù)組定義了4個(gè)字節(jié) 實(shí)際就用了 Buff[0] Buff[1] RX_Buff[2]
- j = 0;
- while(j<8)
- {
- if(temp&0x80)
- {
- result += G; //把0.5的權(quán)數(shù)據(jù)加進(jìn)來
- }
- temp <<= 1;
- j++;
- G = G/2;
- }
- i++;
- }
- if(result<128) //是的這個(gè)result 是 -127,128 這里已經(jīng)獲取了溫度浮點(diǎn)值 最多是一個(gè)3位數(shù)? 還有小數(shù)點(diǎn)
- {
- result *= 100;
- temp1 = (uint32)result; //是的 這里就是 例如12523 -----> 125.23 怎么去顯示? 如何分離 從8A開始顯示
- LCM_WriteDatOrCom (0,0x9C); // 顯示起始位置 第4行
- aa= temp1/ 10000;
- LCM_WriteDatOrCom(1,aa+0x30); //怎么分離出來顯示 PT2017-2-9
- bb=temp1/1000- aa*10;
- LCM_WriteDatOrCom(1,bb+0x30);
- cc= temp1/100- aa*100-bb*10;
- LCM_WriteDatOrCom(1,cc+0x30);
- LCM_WriteDatOrCom(1,0x2e); //"."
- dd= (temp1%100)/10;
- LCM_WriteDatOrCom(1,dd+0x30);
- ee=temp1%10;
- LCM_WriteDatOrCom(1,ee+0x30);
- LCM_WriteString("℃");
- // PT2017-2-12 顯示3個(gè)字節(jié)的 十六進(jìn)制數(shù)據(jù)
- //
- // LCM_WriteDatOrCom (0,0x9D); // 顯示起始位置
- // a=RX_Buff[0]/16;
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=RX_Buff[0]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- // a=RX_Buff[1]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=RX_Buff[1]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- //
- //
- // a=RX_Buff[2]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=RX_Buff[2]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- }
- }
- /*************************************************************
- ** 函數(shù)名稱:CS5463_GetVoltRMS
- ** 函數(shù)功能:讀取電壓有效值函數(shù)
- ** 函數(shù)參數(shù):無
- ** 創(chuàng)建時(shí)間:2009-9-15
- ** 第一次修改時(shí)間:2009-9-23,修改電壓系數(shù)(需驗(yàn)證)
- ** 第二次修改時(shí)間:2010-3-22,設(shè)定測(cè)量讀數(shù)小于100V時(shí)數(shù)據(jù)無效
- ** 第三次修改時(shí)間:
- **************************************************************/
- static void CS5463_GetVoltRMS(void) //這個(gè)函數(shù)啥意思? PT2017-2-12 電壓顯示OK
- {
- float G = 0.5,result; //typedef float fp32; 就是浮點(diǎn)類型
- int temp1; // int
- uint8 temp,i,j; // byte
- CS5463ReadReg(REG_VRMSR,RX_Buff); //讀取電壓有效值 這里就讀到了嗎? 是
- //SndCom1Data(RX_Buff,3); //#define REG_VRMSR 0x58 //電壓有效值 電壓有效值0x58嗎?是寫
- i = 0;
- result = 0;
- while(i<3)
- {
- temp = RX_Buff[i];
- j = 0;
- while(j<8)
- {
- if(temp&0x80)
- {
- result += G;
- }
- temp <<= 1;
- j++;
- G = G/2;
- }
- i++;
- } //電壓在220時(shí)取樣電壓為78mv
- result = result*CS5463_VScale;//V_Coff; //計(jì)算電壓值220V*250mv/(110mv/1.414)=704.8V 可以暫時(shí)不用
- // if(result<=100)return; //如果測(cè)量讀出電壓小于100V,確認(rèn)讀數(shù)錯(cuò)誤
- result *= 100; //單位為mV(毫伏) 12345mv 5位你怎么顯示
- temp1 = (uint32)result;
- LCM_WriteDatOrCom (0,0x84);
- aa= temp1/10000;
- LCM_WriteDatOrCom(1,aa+0x30);
- bb= (temp1%10000)/1000;
- LCM_WriteDatOrCom(1,bb+0x30);
- cc=(temp1%1000)/100;
- LCM_WriteDatOrCom(1,cc+0x30);
- LCM_WriteDatOrCom(1,0x2e);
- dd= (temp1%100)/10;
- LCM_WriteDatOrCom(1,dd+0x30);
- ee=temp1%10;
- LCM_WriteDatOrCom(1,ee+0x30);
- LCM_WriteString(" V");
- // MeasureData[0] = (uint8)(temp1>>24);
- // MeasureData[1] = (uint8)(temp1>>16);
- // MeasureData[2] = (uint8)(temp1>>8);
- // MeasureData[3] = (uint8)temp1;
- }
- void main()
- {
- CS5463_Init();
- LCM_init(); //初始化液晶顯示器
- LCM_clr(); //清屏
- chn_disp(tab1); //顯示歡迎字
- DelayM(500); //顯示等留3秒
- // LCM_clr(); //清屏
-
-
- while(1)
- {
- // if(INT)break; //檢查中斷信號(hào)
- sta = CS5463_GetStatusReg(); //檢測(cè)中斷產(chǎn)生的原因
- if(0x01==(sta&0x01)) //讀取電流電壓
- {
- // CS5463Monitor_Cunt = 0; //如果有中斷,表明芯片正常工作,清除監(jiān)控定時(shí)器
- CS5463_ResetStatusReg(); //清除標(biāo)志
- CS5463_GetVoltRMS(); //獲取電壓
- CS5463_GetCurrentRMS(); //獲取電流
- CS5463_GetPactiveRMS(); //獲取功率
- // CS5463_GetPowerFactor(); //獲取功率因數(shù)
- if(0x02==(sta&0x02)) //讀取溫度
- {
- CS5463_GetVoltRMS(); //獲取電壓
- CS5463_GetTemperature(); //溫度讀取不需要太頻繁,所以跟電流電壓一起讀取
- //CS5463_Init(); //重新初始化芯片
- }
- //SndCom1Data(MeasureData,16);
- }
- // read_register(0x18,(void *)r); //讀取Vrms寄存器值
- // LCM_WriteDatOrCom (0,0x85); // 顯示起始位置 PT 2017-2-12 不用顯示了
- // a=sta/16; //這個(gè)sta變成0 了怎么辦?
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=sta%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- // a=r[1]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[1]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- //
- //
- // a=r[2]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[2]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- //
- //
- //
- // // read_register(0x16,(void *)r); //讀取Irms寄存器值,并通過串口發(fā)送
- //
- // LCM_WriteDatOrCom (0,0x95); // 顯示起始位置
- // a=r[0]/16;
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[0]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- // a=r[1]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[1]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- //
- //
- // a=r[2]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[2]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- // read_register(0x14,(void *)r); //讀取Irms寄存器值,并通過串口發(fā)送
- // LCM_WriteDatOrCom (0,0x8D); // 顯示起始位置
- // a=r[0]/16;
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[0]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- // a=r[1]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[1]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- //
- //
- //
- // a=r[2]/16;
- //
- // if(a<10)
- // {
- // LCM_WriteDatOrCom(1,a+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個(gè)?
- // }
- // b=r[2]%16;
- //
- // if(b<10)
- // {
- // LCM_WriteDatOrCom(1,b+0x30);
- // }
- // else
- // {
- // LCM_WriteDatOrCom(1,b+0x37);
- // }
- // read_register(0x26,(void *)r); //溫度
- // T=125; //對(duì)于不確定長度的 怎么辦? 2位小數(shù)就很不錯(cuò)了 所以這里就是把小數(shù)*100在去顯示 int類型變量怎么辦?
- // LCM_WriteDatOrCom (0,0x95); // 顯示起始位置
- // aa=T/100; //怎么提取出來1呢 ?
- // LCM_WriteDatOrCom(1,aa+0x30); //顯示溫度十位 先看懂這里 0-9的就是+0x30 就可以 這里就是寫數(shù)據(jù)
- // bb=T/10-aa*10; //這個(gè)2 是怎么提取的呢? 12-10*1=2
- // LCM_WriteDatOrCom(1,bb+0x30); //個(gè)位
- // LCM_WriteDatOrCom(1,0x2e); //"."
- // cc=T-aa*100-bb*10; //再看這個(gè)5是如何提取出來的呢? 125- 100-20 =5 有更好的提取方法嗎?
- // LCM_WriteDatOrCom(1,cc+0x30); //小位1位
- // LCM_WriteString("℃");
- // T=T+1;
- // DelayM(50);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
12864-CS5463-STC89S52源代碼-2017-7-9OK.zip
(68.94 KB, 下載次數(shù): 27)
2018-5-21 16:04 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|