/****************************************************************
----信号输入----
P0.2(A相)
P0.3(B相)
P0.6(C相)
****************************************************************/
#include<c8051f330.h>
void initi_io_adc0()/*A通道--------------------*/
{
AMX0P = 0x2; //P0.4-6模拟正输入*************************************通道增加至3CH/////0x04
/*添加变量(输入通道)参数*/
AMX0N = 0x11; //GND模拟地
XBR0 = 0x00; //断开数字资源
XBR1 = 0x40; //使能交叉开关
ADC0CF = 0x38; //转换周期,右对齐
REF0CN = 0x03; //内部REF参考,
ADC0CN = 0xc1; //AD0使能,TIMER1启动
}
//*******************************************************************************
void initi_io_adc1()/*B通道--------------------*/
{
AMX0P = 0x3; //P0.4-6模拟正输入*************************************通道增加至3CH/////0x04
/*添加变量(输入通道)参数*/
AMX0N = 0x11; //GND模拟地
XBR0 = 0x00; //断开数字资源
XBR1 = 0x40; //使能交叉开关
ADC0CF = 0x38; //转换周期,右对齐
REF0CN = 0x03; //内部REF参考,
ADC0CN = 0xc1; //AD0使能,TIMER1启动
}
//*******************************************************************************
void initi_io_adc2()/*C通道--------------------*/
{
AMX0P = 0x6; //P0.6模拟正输入*************************************通道增加至3CH/////0x04
/*添加变量(输入通道)参数*/
AMX0N = 0x11; //GND模拟地
XBR0 = 0x00; //断开数字资源
XBR1 = 0x40; //使能交叉开关
ADC0CF = 0x38; //转换周期,右对齐
REF0CN = 0x03; //内部REF参考,
ADC0CN = 0xc1; //AD0使能,TIMER1启动
}
//*******************************************************************************
//=================INIT.C
//////////////////////////////////////////////////////
智能 三相 电流(电压)表
/////////////////////////////////////////////////////
软件校表
1:工厂校表 读出值(F330直接读出的数据) / 校准系数 = 校准值(必须是10000)
//如15000 / 1.5 = 10000
//1.5 为工厂校准系数
//A B C 各项校表方法一致
2:用户设定 如设定7500/5
那么标准字7500/10000=0.75 0.75 便为用户设定系数
//读出数据便可以直接乘这个系数得出相应结果输送到显示数据变量
3:各项系数修正
//===========READ.TEXT
/*********************************************************************************
------显示数据函数--------
I/O口分配:
----显示----
P1.3-BIT
P1.5-DS
P1.4-SCK
P1.6-CLK
P1.7-NO/OFF
*********************************************************************************/
#include <c8051f330.h>
sbit BITDATA =P1^3; //数码管3 数码管阳极片选 数据
sbit DS1DATA =P1^5; //数码管2 数码管1 数据
sbit SCKDATA =P1^4; //数码管时钟
sbit CLRDATA =P1^6; //全部清零显示
sbit DIS_ONOFF =P1^7; //显示开
void display(unsigned char data1,unsigned char data2,unsigned char data3,unsigned char data0)
{ //DS1 DS2 DS3数据 位数据
unsigned char i;
unsigned int temp_data,temp_bit;
temp_bit=data3*256+data0; // 位*256+DS3
temp_data=data2*256+data1; // DS1*256+DS2
DIS_ONOFF=1;
CLRDATA=0;
CLRDATA=1;
if(CLRDATA!=0)
{
for(i=0;i<16;i++)//循环16次,取出数据至74HC164,用来显示数据
{
SCKDATA="0";
DS1DATA=(bit)(temp_data&0x8000);//DS1取数据
temp_data<<=1;
BITDATA=(bit)(temp_bit&0x8000);//位选
temp_bit<<=1;
SCKDATA="1";
}
}
DIS_ONOFF=0;
}
//============DISPLAY.C
/*-------------------------------------------------------------------
浙江**仪表有限公司
智能三相电压电流表
标准信号输入: 电流5A; 电压100V
显示量程可编程
带各项(和项)送输出模拟量0-20mA或着4-20mA
使用说明参考read sheet
-------------------------------------------------------------------*/
#include <c8051f330.h>
#define PASS_L 0 //PASS 进入密码确认
#define PASS_H 1
//---------1
#define CTPT_L 2 //CTPT 变比设定
#define CTPT_H 3
//---------2
#define D__PL 4 //小数点和保密设置 工厂设置
#define D__PH 5
//---------3
#define OU_LL 6 //变送输出低
#define OU_LH 7
//---------4
#define OU_HL 8 //变送输出高
#define OU_HH 9
//---------5
#define OU_ML 10 //变送输出类型
#define OU_MH 11
//---------6
#define ADDR_L 12 //仪表地址
#define ADDR_H 13
//---------7
#define BAUD_L 14 //波特
#define BAUD_H 15
//---------8
#define CH_AL 16 //A相用户设定
#define CH_AH 17
//---------9
#define CH_BL 18 //B相用户设定
#define CH_BH 19
//---------10
#define CH_CL 20 //C相用户设定
#define CH_CH 21
//---------11
#define CHPS_L 22 //用户密码修改
#define CHPS_H 23
//---------12
#define CHHA_L 24 //A相工厂调试
#define CHHA_H 25
//---------13
#define CHHB_L 26 //B相工厂调试
#define CHHB_H 27
//---------14
#define CHHC_L 28 //C相工厂调试
#define CHHC_H 29
//---------15
/******宏定义位变量******/
sbit anjian_L1 =P1^0; // MOV 键
sbit anjian_L2 =P0^7; // UP 键
sbit CLRDATA =P1^6; //全部清零显示
sbit DIS_ONOFF =P1^7; //显示开
sbit wdtch =P2^0; //外部狗
/******RAM数据数组声明******/
unsigned char temp1;//temp1 显示页码
unsigned char e_dp_bit;//小数点
unsigned char e_dw_bit;//单位符号
unsigned char i5,i_gongchang;//显示数据保存 工厂调试代码
unsigned char ds3_1,ds3_2,ds3_3,ds3_0;//DS3数据位组合
unsigned int temp2, tempdata1, tempdata2, tempdata3;
//temp2 过采样256次 tempdata 数码管显示数据
unsigned long temp, temp_data1, temp_data2, temp_data3;
//temp 公用数据缓冲变量 temp_data 各相数据缓冲变量
unsigned char set,mov,up,set_data,mov_data,up_data;
//按键动态变量
unsigned int i2;//i2 数组数据输出缓冲
unsigned char xdata ABC_DP,IDA_4_20;//显示字形指针
unsigned int xdata i_xiaoshu;
unsigned char xdata diszfdata[13];//显示字形指针
unsigned char xdata eeproom[34];//EEPROOM数组
double xdata ap_gc,bp_gc,cp_gc;//A相工厂校准 B相工厂校准 C相工厂校准
double xdata bianbi_yonghu;//用户所设置的变比
/******ROM变量声明******/
unsigned char code displaydata[]=
{0x3,0x9f,0x25,0xd,0x99,0x49,0x41,0x1b,0x1,0x9,0x31,0x85,0xff};//数码管显示用的数字库
//0 1 2 3 4 5 6 7 8 9 P d 字符消隐
unsigned char code displayzifu[16][4]=
{{0x31,0x11,0x49,0x49},{0x63,0xdd,0x31,0xdd},{0x3,0xfd,0x85,0x31},{0x3,0x83,0xfd,0xe3},
//PASS CTPT //o-dp OU-L
{0x3,0x83,0xfd,0x91},{0x3,0x83,0xfd,0x13},{0x11,0x85,0x85,0xf1},{0xc1,0x11,0x83,0x85},
//OU=H OU-M //ADDR BAUD
{0x63,0x91,0xfd,0x11},{0x63,0x91,0xfd,0xc1},{0x63,0x91,0xfd,0x63},{0x63,0x91,0x31,0x49},
//CH-A CH-B //CH-C //CHPS
{0x63,0x91,0x91,0x11,},{0x63,0x91,0x91,0xc1}, {0x63,0x91,0x91,0x63,}}; //DS1显示英语字库
//CH-A CH-B //CH-C
/******函数声明******/
void display (unsigned char data0,unsigned char data1,unsigned char data2,
unsigned char data3); //显示函数声明
void initi_io_adc0(); //I/O,ADC初始化
void initi_io_adc1(); //I/O,ADC初始化
void initi_io_adc2(); //I/O,ADC初始化
unsigned int ljmp_eeproom(unsigned char x); //从数组调出数据
void ljmp_dataeep(unsigned int i); //数据写到数组
unsigned int arryzuhe(); //DS3数据组合
void xie_eeproom(); //数组写入EEPROOM
void read_eeproom(); //读EEPROOM到数组
void wdtime(); //打狗
void xieru_IDACdata(unsigned int i); //写入IDAC
auto xieru_IDAC(); //变送输出数据处理
void suan_yonghu(); //用户变比设置
void qu_shishu(); //由工厂系数求出实数
float abcp_gc(unsigned int aaa); //工厂校表
void pass_xiaodui(); //密码校对
void scan_keybit(); //键盘扫描
void jisuan(); //计算函数声明
void jisuan_ds3(unsigned int i); //计算DS3数据指针
void data_edit(); //数据处理
void scan_keydata(); //键盘数据处理
void dis2_zifu(unsigned char i); //字符导入DS2
auto qu_gc(); //取出工厂校表系数
void write_byte(unsigned char addr, unsigned char write_data); //24C02 在指定地址写数据
unsigned char read_random(unsigned char random_addr); //24C02 在指定地址读取
/********************************************************************************************/
void main ()
{
unsigned char i;//,i1//i ADC 类别 ,i3 i3 set_data上次状态
//float fi;
//unsigned char in;
ap_gc=bp_gc=cp_gc=1.0;
CKCON="4";
PCA0MD = 0x00;
PCA0CPH2=150;
VDM0CN=0xff;
//定时器0初始化
TMOD="0x01"; //定时器0工作方式
TH0=0xe1;
TL0=0x00;
IE="0x82"; //总中断使能
EIE1 = 0x08; //AD0转换结束中断使能
//IO口初始化
P0MDIN = 0xb3; //P0.2 3 6为模拟输入,通道增加至3CH/////ef
P0MDOUT = 0x00;
P0SKIP = 0x4e; //交叉开关跳过P0.6,通道增加至3CH/////0x10
P1MDIN = 0xff; //P1数字输出
P1MDOUT= 0x00; //P1数字输出
P1SKIP = 0xff; //交叉开关不跳过P1
IDA0CN = 0xf3; //DAC 写改变 2mA 输出的电流
initi_io_adc0();
DIS_ONOFF=CLRDATA=0;
for(temp2=0;temp2<200;temp2++);
//画面初始化
read_eeproom(); //从EEPROOM 24c02读出数据放到数组中
if( ( (eeproom[D__PL]*256+eeproom[D__PH])/100 ) ==15)
{
i_gongchang=15;
}
else
{
i_gongchang=12;
}
// i="read"_random(1);//读数据(地址,有返回值)
// write_byte(1,2);//写数据(地址,数据)
qu_gc();
suan_yonghu(); //用户变比设置
TR0=1;
while (1)
{
//按键扫描,显示数据指针处理
if(set_data==0)
{
qu_shishu();//由工厂系数求出实数
jisuan();//计算数据字库指针
xieru_IDAC();
i5=2;
}
temp="0";
//正常模式------------------------------
//------------------//A通道
initi_io_adc0(); //A相硬件初始化
// for(i1=0;i1<=250;i1++); //通道切换延时
temp2=0;
temp="0";
for(;i==0;)
{
for(;temp2>255;)
{
temp_data1=temp;
temp2=0;
temp="0";
i="1";
scan_keybit(); //键盘扫描
}
if(temp2==120)
{scan_keybit();} //键盘扫描
}
scan_keybit();
//------------------//键盘数据处理
//------------------//B通道
initi_io_adc1(); //B相硬件初始化
temp2=0;
temp="0";
for(;i==1;)
{
for(;temp2>255;)
{
temp_data2=temp;
temp2=0;
temp="0";
i="2";
scan_keybit(); //键盘扫描
}
if(temp2==120)
{scan_keybit();} //键盘扫描
}
scan_keybit();
//------------------//键盘数据处理
//------------------//C通道
initi_io_adc2(); //C相硬件初始化
temp2=0;
temp="0";
for(;i==2;)
{
for(;temp2>255;)
{
temp_data3=temp;
temp2=0;
temp="0";
i="0";
scan_keybit(); //键盘扫描
}
if(temp2==120)
{scan_keybit();} //键盘扫描
}
scan_keybit();
//------------------//键盘数据处理
scan_keydata();
//------------------//FFT
data_edit();
//正常模式---------------------------------
//键盘数据扫描模式-----------------------------
if(set_data>0)
{
//------------------------------------------------------------------------------------------
if(set_data==13) //A相校表
{
if(anjian_L2==0)
{
ap_gc=abcp_gc(tempdata1);
eeproom[CHHA_L]=i_xiaoshu/256;
eeproom[CHHA_H]=i_xiaoshu%256;
}
}
//------------------------------------------------------------------------------------------
if(set_data==14) //B相校表
{
if(anjian_L2==0)
{
bp_gc=abcp_gc(tempdata2);
eeproom[CHHB_L]=i_xiaoshu/256;
eeproom[CHHB_H]=i_xiaoshu%256;
}
}
//------------------------------------------------------------------------------------------
if(set_data==15) //C相校表
{
if(anjian_L2==0)
{
cp_gc=abcp_gc(tempdata3);
eeproom[CHHC_L]=i_xiaoshu/256;
eeproom[CHHC_H]=i_xiaoshu%256;
}
}
//------------------------------------------------------------------------------------------
if(mov_data==0)
{
i2=ljmp_eeproom(set_data); //从数组调出数据
jisuan_ds3(i2);
}
diszfdata[0]=displaydata[10];
diszfdata[1]=displaydata[11];
diszfdata[2]=displaydata[(set_data/10)];
diszfdata[3]=displaydata[(set_data%10)];
//第一排显示数据
dis2_zifu(set_data); //字符导入DS2
if(set_data>i_gongchang) //1515:用于工厂校表 12:用于客户校表
{
xie_eeproom(); //数组写入到24C02
RSTSRC="0x90"; //数据写入后 再进行软件复位 数据初始化
// read_eeproom(); //从EEPROOM 24c02读出数据放到数组中
// set_data=mov_data=up_data=set=mov=up=0;
}
//MOV 按键处理----------------
switch (mov_data)
{
case 1:
{
if(up_data==11) //mov按键初始化
{
diszfdata[8]=displaydata[12];
}
else //up按键进行递加
{
ds3_0=up_data;
diszfdata[8]=displaydata[up_data];
}
}
break;
case 2:
{
if(up_data==11) //mov按键初始化
{
diszfdata[9]=displaydata[12];
}
else //up按键进行递加
{
ds3_1=up_data;
diszfdata[9]=displaydata[up_data];
}
}
break;
case 3:
{
if(up_data==11) //mov按键初始化
{
diszfdata[10]=displaydata[12];
}
else //up按键进行递加
{
ds3_2=up_data;
diszfdata[10]=displaydata[up_data];
}
}
break;
case 4:
{
if(up_data==11) //mov按键初始化
{
diszfdata[11]=displaydata[12];
}
else //up按键进行递加
{
ds3_3=up_data;
diszfdata[11]=displaydata[up_data];
}
}
break;
}
//MOV 按键处理--------------
}
}
}
/********************************************************************************************/
void jisuan() //计算数据指针
{
unsigned char a;
a="displaydata"[tempdata1/1000];diszfdata[0]=a;
a="displaydata"[(tempdata1%1000)/100];diszfdata[1]=a;
a="displaydata"[(tempdata1%100)/10];diszfdata[2]=a;
a="displaydata"[(tempdata1%100)%10];diszfdata[3]=a; //数码管1数据
a="displaydata"[tempdata2/1000];diszfdata[4]=a;
a="displaydata"[(tempdata2%1000)/100];diszfdata[5]=a;
a="displaydata"[(tempdata2%100)/10];diszfdata[6]=a;
a="displaydata"[(tempdata2%100)%10];diszfdata[7]=a; //数码管2数据
a="displaydata"[tempdata3/1000];diszfdata[8]=a;
a="displaydata"[(tempdata3%1000)/100];diszfdata[9]=a;
a="displaydata"[(tempdata3%100)/10];diszfdata[10]=a;
a="displaydata"[(tempdata3%100)%10];diszfdata[11]=a; //数码管3数据
}
/********************************************************************************************/
void intput() interrupt 1 //定时器0中断服务函数,显示驱动的数据指针。
{
unsigned char a,b,c,d;//,e;
TR0=0;
wdtch=~wdtch;
wdtime();
switch (temp1)
{
case 0: //第一位
{a=diszfdata[0];b=diszfdata[4];c=diszfdata[8];d=0xfd;}
break;
case 1: //第二位
{a=diszfdata[1];b=diszfdata[5];c=diszfdata[9];d=0xfb;}
break;
case 2: //第三位
{a=diszfdata[2];b=diszfdata[6];c=diszfdata[10];d=0xf7;}
break;
case 3: //第四位
{a=diszfdata[3];b=diszfdata[7];c=diszfdata[11];d=0xef;} // 单位符号指示
// 0xbf:LED1亮
break; // 0xdf:LED2亮
// 0xdf:LED2亮
}
//------------------
// e="0";//eeproom[D__PH];
if(temp1==e_dp_bit)//判断是否要显示小数点
{
if(set_data==0)//正常模式显示小数点
{
switch (e_dw_bit)//添加单位符号指示
{
case 0:
d="d"+0;
break;
case 1:
break;
case 3:
break;
}
display (a-1,b-1,c-1,d);//显示小数点
}
else
{
display (a,b,c,d);//不显示小数点
}
}
else
{
display (a,b,c,d);
}
//------------------
if(temp1>2)
{
temp1=0;
}
else
{
temp1++;
}
TH0=250;TL0=0x00;TR0=1;
}
/********************************************************************************************/
void adc_outdata() interrupt 10 //ADC转换结束中断
{
unsigned int i;
// EIE1 = 0x00; //AD0转换结束中断禁止
i=(ADC0H*256+ADC0L);
temp="i"+temp;
ADC0CN = 0xc1; //AD0使能,TIMER1启动
temp2++;
}
/********************************************************************************************/
void scan_keybit() //键盘扫描
{
unsigned char i;
anjian_L1=1;
anjian_L2=0;
if(anjian_L1==0) //SET按键扫描
{
anjian_L1=0;
anjian_L2=1;
for(i=0;i<10;i++);
if(anjian_L2==0)
{
set="set"+1;
}
}
//------------------
anjian_L1=1;
anjian_L2=1;
for(i=0;i<10;i++);
if(anjian_L1==0) //MOV按键扫描
{
mov="mov"+1;
}
//------------------
anjian_L1=1;
anjian_L2=1;
for(i=0;i<10;i++);
if(anjian_L2==0) //UP按键扫描
{
up="up"+1;
}
//------------------
anjian_L1=1;
anjian_L2=1;
if(anjian_L1==0) //退出按键处理模式
{
for(i=0;i<10;i++);
if(anjian_L2==0)
{
RSTSRC="0x90";
}
}
}
/********************************************************************************************/
void data_edit() //FFT
{
if(temp_data1>75) //A相数据处理
{
tempdata1=(temp_data1>>4)+75; //对应AC信号修正
}
else
{
tempdata1=temp_data1;
}
//------------------
if(temp_data2>75) //B相数据处理
{
tempdata2=(temp_data2>>4)+75; //对应AC信号修正
}
else
{
tempdata2=temp_data2;
}
//------------------
if(temp_data3>75) //C相数据处理
{
tempdata3=(temp_data3>>4)+75; //对应AC信号修正
}
else
{
tempdata3=temp_data3;
}
}
/********************************************************************************************/
void scan_keydata() //键盘数据处理
{
//unsigned char i,i1;
unsigned int i4;
if(set>1)
{
++set_data;
i4=arryzuhe(); //DS3数据指针进行组合
if(set_data==i5) //SET_DATA和i5相等的时候
{
if(mov_data!=0)
{
ljmp_dataeep(i4); //数据写到数组
}
i5++;
}
mov_data=0;
if(set_data==2)
{
pass_xiaodui();
}
}
//------------------set
if(set_data>0)
{
if(mov>1)
{
mov_data++;
up_data=11;
if(mov_data>=5)
{
mov_data=0;
}
}
//------------------mov
if(up>1)
{
up_data++;
if(up_data>=10)
{
up_data=0;
}
}
}
//------------------up
set="mov"=up=0;
}
/********************************************************************************************/
void dis2_zifu(unsigned char i) //字符导入DS2
{
unsigned char i1,i22=4,i3;
i=i-1;
for(i1=0;i1<=3;i1++)
{
i3=diszfdata[i22]=displayzifu[i1];
i22++;
}
}
/********************************************************************************************/
void jisuan_ds3(unsigned int i) //计算数据指针
{
unsigned char a;
a="displaydata"[i/1000];diszfdata[8]=a;
a="displaydata"[(i%1000)/100];diszfdata[9]=a;
a="displaydata"[(i%100)/10];diszfdata[10]=a;
a="displaydata"[(i%100)%10];diszfdata[11]=a; //数码管3数据
}
/********************************************************************************************/
unsigned int ljmp_eeproom(unsigned char x) //在指定数组地址取出整形数据 0-1 2-3 3-4 ....
{
unsigned char i,i1;
i="eeproom"[(x+x-1-1)]; //低字节
i1=eeproom[(x+x-1)]; //高字节
return(i*256+i1);
}
/********************************************************************************************/
void ljmp_dataeep(unsigned int i) //数据写到数组
{
unsigned char i0,i1;
i0=i/256;
i1=i%256;
eeproom[((set_data-1)+(set_data-1)-1-1)]=i0; //高字节放在数组低位
eeproom[((set_data-1)+(set_data-1)-1)]=i1; //低字节放在数组高位
}
/********************************************************************************************/
unsigned int arryzuhe() //DS3数据组合
{
unsigned int i;
i=ds3_0*1000+ds3_1*100+ds3_2*10+ds3_3;
return(i);
}
/********************************************************************************************/
void xie_eeproom() //数组写入EEPROOM
{
unsigned char i,a,i1;
EA="0";
for(i=0;i<32;i++)
{
wdtime();
a=eeproom;
write_byte(i,a);
for(i1=0;i1<250;i1++);
if(i==3)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==6)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==9)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==12)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==15)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==18)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==21)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==24)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==28)
{CLRDATA=DIS_ONOFF=1;} //清屏
}
EA="1";
}
/********************************************************************************************/
void read_eeproom() //读EEPROOM到数组
{
unsigned char i,a,i1;
EA="0";
for(i=0;i<32;i++)
{
wdtime();
a="read"_random(i);
eeproom=a;
for(i1=0;i1<250;i1++);
if(i==3)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==6)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==9)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==12)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==15)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==18)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==21)
{CLRDATA=DIS_ONOFF=1;} //清屏
if(i==24)
{CLRDATA=DIS_ONOFF=0;} //点亮
if(i==28)
{CLRDATA=DIS_ONOFF=1;} //清屏
}
EA="1";
eeproom[1]=(eeproom[1]+1);//密码变更
e_dp_bit=((eeproom[D__PL]*256+eeproom[D__PH])%100)%10;//取出小数点位
e_dw_bit=(eeproom[D__PL]*256+eeproom[D__PH])%100/10;//取出单位符号位
//增加单位符号指示
ABC_DP=(eeproom[OU_ML]*256+eeproom[OU_MH])/100;//变送输出通道选择: A B C D(和数)
IDA_4_20=(eeproom[OU_ML]*256+eeproom[OU_MH])%100;//变送输出类型选择 0-20mA 4-20mA
}
/********************************************************************************************/
void pass_xiaodui() //密码校对
{
unsigned int i,i1;
//unsigned int temp11;
i="eeproom"[PASS_L]*256+eeproom[PASS_H];
i1=eeproom[CHPS_L]*256+eeproom[CHPS_H];
if(i1>10000)
{
i1=0;
}
if(i==i1)
{
}
else
{
set_data=mov_data=up_data=set=mov=up=0;
read_eeproom(); //再次从EEPROOM 24c02读出数据放到数组中
}
}
/********************************************************************************************/
float abcp_gc(unsigned int aaa) //工厂校表 得出标准系数
{
float a,b;
a=aaa;
b=(10000/a); //求工厂校表系数
i_xiaoshu=b*10000; //小数升级为正整数
return(b);
}
/********************************************************************************************/
auto qu_gc() //工厂校表系数
{
float a,b;
a="eeproom"[CHHA_L]*256+eeproom[CHHA_H];
b=(a/10000); //求工厂校表系数A
ap_gc=b;
a="eeproom"[CHHB_L]*256+eeproom[CHHB_H];
b=(a/10000); //求工厂校表系数B
bp_gc=b;
a="eeproom"[CHHC_L]*256+eeproom[CHHC_H];
b=(a/10000); //求工厂校表系数C
cp_gc=b;
}
/********************************************************************************************/
void qu_shishu() //由工厂系数求出实数
{
tempdata1=tempdata1*ap_gc*bianbi_yonghu;
tempdata2=tempdata2*bp_gc*bianbi_yonghu;
tempdata3=tempdata3*cp_gc*bianbi_yonghu;
}
/********************************************************************************************/
void suan_yonghu() //用户变比设置
{
float a,b;
a="eeproom"[CTPT_L]*256+eeproom[CTPT_H];
b=(a/10000); //求用户变比系数
bianbi_yonghu=b;
}
/********************************************************************************************/
auto xieru_IDAC() //变送输出数据更新
{
float code_daima,data_0,data_1,data_2;
//code_daiam:写入IDAC的数据 data_0:MCU所测试的数据 data_1:上限数据 data_2:下限数据
data_1=(eeproom[OU_LL]*256+eeproom[OU_LH]);//0;
data_2=(eeproom[OU_HL]*256+eeproom[OU_HH]);
switch (ABC_DP)
{
case 0://通道选择模式0 无选择通道
{
;
}
break;
case 1://通道选择模式1 选择A通道
{
data_0=tempdata1;
}
break;
case 2://通道选择模式 选择B通道
{
data_0=tempdata2;
}
break;
case 3://通道选择模式 选择C通道
{
data_0=tempdata3;
}
break;
case 4://通道选择模式 A B C三相电流总和
{
data_0=tempdata1+tempdata2+tempdata3;
}
break;
}
if(IDA_4_20==0x01) //输出0-20mA
{
if(data_0<data_1)
{
data_0=0;
data_1=0;
}
code_daima=(data_0-data_1)/(data_2-data_1)*1023;
//计算数据
xieru_IDACdata(code_daima);
//导入IDA0寄存器
}
//-------------------------------------------------
if(IDA_4_20==0x02) //输出4-20mA
{
if(data_0<data_1)
{
data_0=0;
data_1=0;
}
code_daima=205-(data_0-data_1)/(data_2-data_1)*205+(data_0-data_1)/(data_2-data_1)*1023;
//计算数据
xieru_IDACdata(code_daima);
//导入IDA0寄存器
}
//-------------------------------------------------
}
/********************************************************************************************/
void xieru_IDACdata(unsigned int i) //写入IDAC
{
unsigned char i1,i2;//10位电流数据的高8位:i1 10位电流数据的低2位:i2
if(i>1024)
{
i="1023";
}
i1=i>>2;
i2=i<<8;
IDA0L=i2;
IDA0H=i1;
}
/********************************************************************************************/
void wdtime()
{
PCA0MD = 0x00;
PCA0H = 0x00;
PCA0L = 0x00;
PCA0MD = 0x40;
PCA0CN = 0x40;
}
//==================MAIN.C
文章评论(0条评论)
登录后参与讨论