原创 C8051F330D

2008-2-20 17:46 2038 1 1 分类: MCU/ 嵌入式

/****************************************************************
----信号输入----
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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条