欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
cs56463-12864-STC89C52單片機驅動源代碼
[打印本頁]
作者:
1574020844
時間:
2018-5-21 16:07
標題:
cs56463-12864-STC89C52單片機驅動源代碼
這是單相電用電器監測裝置的設計源代碼
用cs5463進行電能計算 單片機控制 12864顯示的源代碼
單片機源碼如下:
//頭文件
#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 無符號8位整型變量 */
typedef signed char int8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
typedef unsigned int uint16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
typedef signed int int16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
typedef unsigned long uint32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
typedef signed long int32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
typedef float fp32; /* single precision floating point variable (32bits) 單精度浮點數(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 //這個定義對嗎?
sbit INT=P3^2;
sbit CS=P1^3;
sbit RST=P1^4; //RST
#define CS5463_VScale 525 //計算電壓比例,220V*250mv/110mv=500V
#define CS5463_IScale (250/10) //計算電流比例
static uint8 RX_Buff[4]; //CS5463讀寫緩沖區
uint8 sta; //芯片狀態
#define READ_MASK 0xBF //讀寄存器時的屏蔽碼,與(寫)地址相與
#define CMD_SYNC0 0XFE //結束串口重新初始化
#define CMD_SYNC1 0XFF //開始串口重新初始化
#define REG_CONFR 0x40 //配置
#define REG_CYCCONT 0x4A //一個計算周期的A/D轉換數
#define REG_STATUSR 0x5E //狀態
#define REG_MODER 0x64 //操作模式
#define REG_MASKR 0x74 //中斷屏蔽
#define REG_CTRLR 0x78 //控制
#define CMD_STARTC 0XE8 //執行連續計算周期
#define REG_VRMSR 0X18 //VRMS
#define REG_IRMSR 0X16 //IRMS
#define REG_Pactive 0X14 //Pactive
/*************************************************************
** 函數名稱:uDelay
** 函數功能:延時
** 函數參數:j
** 返回值:無
** 創建時間:2009-4-23
** 第一次修改時間:無
**************************************************************/
static void uDelay(uint8 j)
{
uint8 i;
for(;j>0;j--)
{ for(i=0;i<255;i--)
{
;
}
}
}
/*************************************************************
** 函數名稱:CS5463CMD
** 函數功能:CS5463命令函數
** 函數參數:無
** 創建時間:2009-9-14
** 第一次修改時間:無
**************************************************************/
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; //在時鐘上升沿,數據被寫入CS5463
cmd <<= 1;
i++;
}
uDelay(50);
CS = 1;
}
/*************************************************************
** 函數名稱:CS5463WriteReg
** 函數功能:CS5463寫寄存器函數
** 函數參數:無
** 創建時間:2009-9-14
** 第一次修改時間:無
**************************************************************/
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; //在時鐘上升沿,數據被寫入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; //在時鐘上升沿,數據被寫入CS5463
dat <<= 1;
i++;
}
j++;
}
uDelay(50);
CS = 1;
}
/*************************************************************
** 函數名稱:CS5463ReadReg
** 函數功能:CS5463讀寄存器函數
** 函數參數:無
** 創建時間:2009-9-14
** 第一次修改時間:無
**************************************************************/
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; //在時鐘上升沿,數據被寫入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 應用函數
*************************************************************************************************/
/*************************************************************
** 函數名稱:CS5463Init
** 函數功能:CS5463復位和初始化函數
** 函數參數:無
** 創建時間:2009-9-14
** 第一次修改時間:無
**************************************************************/
bit CS5463_Init(void) //bit 可以這樣嗎?
{
RST = 0;
uDelay(200);
RST = 1;
uDelay(100);
//----------------------
//發送同步序列
RX_Buff[0] = CMD_SYNC1;
RX_Buff[1] = CMD_SYNC1;
RX_Buff[2] = CMD_SYNC0;
CS5463WriteReg(CMD_SYNC1,RX_Buff); //#define CMD_SYNC1 0XFF //開始串口重新初始化
//----------------------
//初始化--配置寄存器
//相位補償為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 //操作模式
//----------------------
//初始化--電流 交流偏置 校準寄存器
// RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
// CS5463WriteReg(REG_IACOFF,RX_Buff);
//----------------------
//初始化--電流 增益校準寄存器
// RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
// CS5463WriteReg(REG_IGN,RX_Buff);
//----------------------
//初始化--電壓 交流偏置 校準寄存器
// RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
// CS5463WriteReg(REG_VACOFF,RX_Buff);
//----------------------
//初始化--電壓 增益校準寄存器
// 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 //一個計算周期的A/D轉換數
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); //初始化--狀態寄存器 #define REG_STATUSR 0x5E //狀態
//----------------------
RX_Buff[0] = 0x80; //開電流、電壓、功率測量完畢中斷
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x80; //開溫度測量完畢中斷
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); //啟動連續轉換 #define CMD_STARTC 0XE8 //執行連續計算周期
//CS5463_Status = 0; //初始化任務進程狀態
//Load_Status = 0;
//CS5463_CrmsSmallCunt = 0;
//CS5463_CrmsOverCunt = 0;
return(1); //只要做完這些步驟就返回true 1
}
/*************************************************************
** 函數名稱:CS5463_ResetStatusReg
** 函數功能:復位狀態寄存器函數
** 函數參數:無
** 創建時間:2009-9-15
** 第一次修改時間:無
**************************************************************/
static void CS5463_ResetStatusReg(void)
{
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(0x5E,RX_Buff); //復位狀態寄存器 #define REG_STATUSR 0x5E //狀態
}
/*************************************************************
** 函數名稱:CS5463_GetStatusReg
** 函數功能:讀取狀態寄存器函數
** 函數參數:無
** 創建時間:2009-9-15
** 第一次修改時間:無
**************************************************************/
static uint8 CS5463_GetStatusReg(void)
{
uint8 sta=0;
CS5463ReadReg(0x1E,RX_Buff); //1E 是什么? 狀態寄存器
if(RX_Buff[0]&0x80) //檢測:電流、電壓、功率測量是否完畢
{
//檢測電流/電壓是否超出范圍
//檢測電流有效值/電壓有效值/電能是否超出范圍
if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
{
CS5463_ResetStatusReg(); //復位狀態寄存器
}
else
{
sta |= 0x01;//B0000_0001; //這什么意思 還可以這樣寫嗎? PT2017-2-8 分隔符嗎?
}
}
if(RX_Buff[2]&0x80) //檢測:溫度測量是否完畢
{
sta |=0x02; //B0000_0010;
}
return(sta);
}
void DelayM(unsigned int a) //延時函數 1MS/次
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉從0加到125,CPU大概就耗時1毫秒?
}
}
void Delay(int num)//延時函數
{
while(num--);
}
/******************************************************************************/
//寫指令或數據 (0,指令) (1,數據)
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---基本指令動作*/
LCM_WriteDatOrCom (0,0x01); /*清屏,地址指針指向00H*/
Delay (100);
LCM_WriteDatOrCom (0,0x06); /*光標的移動方向*/
LCM_WriteDatOrCom(0,0x0c); /*開顯示,關游標*/
}
void chn_disp (uchar code *chn) //顯示4行 指針
{
uchar i,j;
LCM_WriteDatOrCom (0,0x30); // 0 是指令 這2個命令 是干什么 的?
LCM_WriteDatOrCom (0,0x80); //
for (j=0;j<4;j++)
{
for (i=0;i<16;i++)
LCM_WriteDatOrCom (1,chn[j*16+i]);
}
}
/*****************************************************************************/
//清屏函數
void LCM_clr(void)
{
LCM_WriteDatOrCom (0,0x30);
LCM_WriteDatOrCom (0,0x01); /*清屏,地址指針指向00H*/
Delay (180);
}
/*****************************************************************************/
//向LCM發送一個字符串,長度64字符之內。
//應用:LCM_WriteString("您好!");
void LCM_WriteString(unsigned char *str)
{
while(*str != '\0')
{
LCM_WriteDatOrCom(1,*str++);
}
*str = 0; //這里是什么意思 指針歸0嗎?
}
/*************************************************************
** 函數名稱:CS5463_GetCurrentRMS
** 函數功能:讀取電流有效值函數
** 函數參數:無
** 創建時間:2009-9-15
** 第一次修改時間:無
**************************************************************/
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; //計算電流值 暫時不用
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); //小數點 不需要小數點
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; //設置燈狀態為:開燈并電流過小
// if(!CS5463LightFailure_PF) //檢查該報警是否已經回應
// {
// if(!CS5463LightFailure_nF) //檢查定時重發標志
// {
// Comm_ReportLightFailure(MeasureData+4);
// CS5463LightFailure_nF = 1;
// CS5463LightFailure_T = 1;
// }
// }
// }
// }
// else if(temp1>5000) //過流檢測:5000mA
// {
// CS5463_CrmsOverCunt++;
// if(CS5463_CrmsOverCunt>2)
// {
// CS5463_CrmsOverCunt = 0;
// //RelayCtrl(0); //斷開繼電器
// Comm_ReportOverLoad(MeasureData+4); //報告過流信息
// }
// }
// else //如果電流正常
// {
// CS5463_CrmsSmallCunt = 0;
// CS5463_CrmsOverCunt = 0;
// Load_Status = 0xAA; //設置燈狀態為:開燈并正常
// CS5463LightFailure_PF = 0; //復位報警標志
// }
// }
}
/*************************************************************
** 函數名稱:CS5463_GetPactiveRMS
** 函數功能:讀取有功功率函數
** 函數參數:無
** 創建時間:2009-9-15
** 第一次修改時間:無
**************************************************************/
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) //如果為負數,計算原碼
{
RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因為精度的原因,不+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; //計算功率,單位W(瓦特)
// result = Vrms*Irms; ////////直接計算功率
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); //小數點 不需要小數點
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;
}
/*************************************************************
** 函數名稱:CS5463_GetPowerFactor
** 函數功能:讀取功率因數函數
** 函數參數:無
** 創建時間:2009-11-02
** 第一次修改時間:無
**************************************************************/
static void CS5463_GetPowerFactor(void)
{
fp32 G = 1.0,result;
uint8 temp,i,j;
uint32 temp1;
CS5463ReadReg(0x32,RX_Buff); //讀取功率因數
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80) //如果為負數,計算原碼
{
RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因為精度的原因,不+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;
}
/*************************************************************
** 函數名稱:CS5463_GetTemperature
** 函數功能:讀取溫度函數
** 函數參數:無
** 創建時間:2009-11-03
** 第一次修改時間:無
**************************************************************/
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) //如果為負數,計算原碼
{
pn = 1; //負數標志
RX_Buff[0] = ~RX_Buff[0]; //本來為取反+1,這里因為精度的原因,不+1
RX_Buff[1] = ~RX_Buff[1];
RX_Buff[2] = ~RX_Buff[2];
}
i = 0;
result = 0; //這個值是浮點數 先清零 再逐個把0.5的權 數據加進來
while(i<3)
{
temp = RX_Buff[i]; //雖然這個數組定義了4個字節 實際就用了 Buff[0] Buff[1] RX_Buff[2]
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G; //把0.5的權數據加進來
}
temp <<= 1;
j++;
G = G/2;
}
i++;
}
if(result<128) //是的這個result 是 -127,128 這里已經獲取了溫度浮點值 最多是一個3位數? 還有小數點
{
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個字節的 十六進制數據
//
// LCM_WriteDatOrCom (0,0x9D); // 顯示起始位置
// a=RX_Buff[0]/16;
// if(a<10)
// {
// LCM_WriteDatOrCom(1,a+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個?
// }
// 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個?
// }
// 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個?
// }
// b=RX_Buff[2]%16;
//
// if(b<10)
// {
// LCM_WriteDatOrCom(1,b+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,b+0x37);
// }
}
}
/*************************************************************
** 函數名稱:CS5463_GetVoltRMS
** 函數功能:讀取電壓有效值函數
** 函數參數:無
** 創建時間:2009-9-15
** 第一次修改時間:2009-9-23,修改電壓系數(需驗證)
** 第二次修改時間:2010-3-22,設定測量讀數小于100V時數據無效
** 第三次修改時間:
**************************************************************/
static void CS5463_GetVoltRMS(void) //這個函數啥意思? PT2017-2-12 電壓顯示OK
{
float G = 0.5,result; //typedef float fp32; 就是浮點類型
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時取樣電壓為78mv
result = result*CS5463_VScale;//V_Coff; //計算電壓值220V*250mv/(110mv/1.414)=704.8V 可以暫時不用
// if(result<=100)return; //如果測量讀出電壓小于100V,確認讀數錯誤
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; //檢查中斷信號
sta = CS5463_GetStatusReg(); //檢測中斷產生的原因
if(0x01==(sta&0x01)) //讀取電流電壓
{
// CS5463Monitor_Cunt = 0; //如果有中斷,表明芯片正常工作,清除監控定時器
CS5463_ResetStatusReg(); //清除標志
CS5463_GetVoltRMS(); //獲取電壓
CS5463_GetCurrentRMS(); //獲取電流
CS5463_GetPactiveRMS(); //獲取功率
// CS5463_GetPowerFactor(); //獲取功率因數
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; //這個sta變成0 了怎么辦?
// if(a<10)
// {
// LCM_WriteDatOrCom(1,a+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個?
// }
// 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個?
// }
// 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個?
// }
// b=r[2]%16;
//
// if(b<10)
// {
// LCM_WriteDatOrCom(1,b+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,b+0x37);
// }
//
//
//
//
// // read_register(0x16,(void *)r); //讀取Irms寄存器值,并通過串口發送
//
// LCM_WriteDatOrCom (0,0x95); // 顯示起始位置
// a=r[0]/16;
// if(a<10)
// {
// LCM_WriteDatOrCom(1,a+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個?
// }
// 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個?
// }
// 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個?
// }
// b=r[2]%16;
//
// if(b<10)
// {
// LCM_WriteDatOrCom(1,b+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,b+0x37);
// }
// read_register(0x14,(void *)r); //讀取Irms寄存器值,并通過串口發送
// LCM_WriteDatOrCom (0,0x8D); // 顯示起始位置
// a=r[0]/16;
// if(a<10)
// {
// LCM_WriteDatOrCom(1,a+0x30);
// }
// else
// {
// LCM_WriteDatOrCom(1,a+0x37); //為什么多了7個?
// }
// 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個?
// }
// 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個?
// }
// 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; //對于不確定長度的 怎么辦? 2位小數就很不錯了 所以這里就是把小數*100在去顯示 int類型變量怎么辦?
// LCM_WriteDatOrCom (0,0x95); // 顯示起始位置
// aa=T/100; //怎么提取出來1呢 ?
// LCM_WriteDatOrCom(1,aa+0x30); //顯示溫度十位 先看懂這里 0-9的就是+0x30 就可以 這里就是寫數據
// bb=T/10-aa*10; //這個2 是怎么提取的呢? 12-10*1=2
// LCM_WriteDatOrCom(1,bb+0x30); //個位
// LCM_WriteDatOrCom(1,0x2e); //"."
// cc=T-aa*100-bb*10; //再看這個5是如何提取出來的呢? 125- 100-20 =5 有更好的提取方法嗎?
// LCM_WriteDatOrCom(1,cc+0x30); //小位1位
// LCM_WriteString("℃");
// T=T+1;
// DelayM(50);
}
}
復制代碼
所有資料51hei提供下載:
12864-CS5463-STC89S52源代碼-2017-7-9OK.zip
(68.94 KB, 下載次數: 27)
2018-5-21 16:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
卡西莫多i
時間:
2018-5-24 23:56
非常感謝分享!在做畢設中,有很大的參考價值
作者:
卡西莫多i
時間:
2018-6-3 22:59
可以問一下我把程序燒錄進去,顯示屏卻沒有顯示啊,這里有設定好顯示數據位置的函數嗎?
作者:
卡西莫多i
時間:
2018-6-3 23:14
想問一下燒錄了程序,顯示屏卻不顯示,QAQ有什么解決方案嗎?
作者:
dian520
時間:
2019-9-24 21:56
想問一下燒錄了程序,顯示屏卻不顯示,QAQ有什么解決方案嗎?
作者:
ptlantu
時間:
2019-9-25 08:11
有電路圖嗎
作者:
wzl619
時間:
2019-9-25 11:18
謝謝樓主的分享
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1