⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机modbusrtu通信协议.txt

📁 51系列单片机的ModbusRTU
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        case 4:ADC_CONTR = 0X83;break; //启动通道4转换
        case 5:ADC_CONTR = 0X84;break; //启动通道5转换
        case 6:ADC_CONTR = 0X85;break; //启动通道6转换
        case 7:ADC_CONTR = 0X86;break; //启动通道7转换
        case 8:ADC_CONTR = 0X87;break; //启动通道8转换
        default:break;
    }
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    ADC_CONTR |= 0X08;  //启动转换
}
////////////////////////////////////
uint adc_result() //AD转换结果数字滤波
{
    uchar i,j;
    uint temp;
    _nop_();_nop_();
    for(j = 0; j < 3; j++)
    {
        for( i = 0; i < 4 - j; i++)
        {
            if(AD_IN[i] > AD_IN[i+1])
            {
                temp = AD_IN[i];
                AD_IN[i] = AD_IN[i+1];
                AD_IN[i+1] = temp;
            }
        }
    }
    return AD_IN[2];
}
////////////////////////////////////
void adc(void) interrupt 5
{
    uint AD_huangxiao;

    WDT_CONTR = 0X3C; //喂狗
    ADC_CONTR = 0xc0;// 清除中断标志

    AD_huangxiao = ADC_RES ; //读取AD转换结果
    AD_huangxiao = AD_huangxiao << 8;
    AD_huangxiao += ADC_RESL;

    switch(channel)
    {
    	case 0x01:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN1 = adc_result();
                    channel = 0x02;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x02:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN2 = adc_result();
                    channel = 0x03;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x03:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN3 = adc_result();
                    channel = 0x04;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x04:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN4 = adc_result();
                    channel = 0x05;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x05:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN5 = adc_result();
                    channel = 0x06;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x06:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN6 = adc_result();
                    channel = 0x07;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x07:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN7 = adc_result();
                    channel = 0x08;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--;}
            };break;
        case 0x08:
            {
                if(AD_count == 0x00)
                {
                    AD_IN[AD_count] = AD_huangxiao ;
                    AD_count = 0x04;
                    AD_IN8 = adc_result();
                    channel = 0x01;
                }
                else
                {AD_IN[AD_count] = AD_huangxiao ;AD_count--; }
            };break;
        default:
            {
                AD_count = 0x04;
                channel = 0x01;
            };break;
    }
    start_adc();
}
////////////////////////////////////////
void yinhu_cantrol(void)//弧电源的引弧控制//
{
//AD转换的电压数值 = 1024 * VIN / VCC;
//1V = 204
    uchar yinhu_start;

    yinhu_start = getout1 & 0x01;
    if (yinhu_start == 0x01)
    {
        if (yinhu_bz1 == 0){if (AD_IN1 > huangxiao ){yinhu_bz1 = 1;}else{yinhu_bz1 = 0;}}
    }

    yinhu_start = getout1 & 0x02;
    if (yinhu_start == 0x02)
    {
        if (yinhu_bz2 == 0){if (AD_IN2 > huangxiao ){yinhu_bz2 = 1;}else{yinhu_bz2 = 0;}}
    }

    yinhu_start = getout1 & 0x04;
    if (yinhu_start == 0x04)
    {
        if (yinhu_bz3 == 0){if (AD_IN3 > huangxiao ){yinhu_bz3 = 1;}else{yinhu_bz3 = 0;}}
    }

    yinhu_start = getout1 & 0x08;
    if (yinhu_start == 0x08)
    {
        if (yinhu_bz4 == 0){if (AD_IN4 > huangxiao ){yinhu_bz4 = 1;}else{yinhu_bz4 = 0;}}
    }

    yinhu_start = getout1 & 0x10;
    if (yinhu_start == 0x10)
    {
        if (yinhu_bz5 == 0){if (AD_IN5 > huangxiao ){yinhu_bz5 = 1;}else{yinhu_bz5 = 0;}}
    }

    yinhu_start = getout1 & 0x20;
    if (yinhu_start == 0x20)
    {
        if (yinhu_bz6 == 0){if (AD_IN6 > huangxiao ){yinhu_bz6 = 1;}else{yinhu_bz6 = 0;}}
    }

    yinhu_start = getout1 & 0x40;
    if (yinhu_start == 0x40)
    {
        if (yinhu_bz7 == 0){if (AD_IN7 > huangxiao ){yinhu_bz7 = 1;}else{yinhu_bz7 = 0;}}
    }

    yinhu_start = getout1 & 0x80;
    if (yinhu_start == 0x80)
    {
        if (yinhu_bz8 == 0){if (AD_IN8 > huangxiao ){yinhu_bz8 = 1;}else{yinhu_bz8 = 0;}}
    }

}
/////////////////////////////////////////
void time0(void) interrupt 1//35ms
{
    if (yinhu_bz1 == 1){yinhu_jdq1 = 1;}
    if (yinhu_jdq1 == 1)
    {
        jdq_off_on1 ++;
        switch (jdq_off_on1 )
        {
            case 1: {getout2 |= 0x01;};break;
            case 8: {getout2 &= 0xfe;};break;
            case 30: {jdq_off_on1 = 0x00; yinhu_bz1 = 0;yinhu_jdq1 = 0;};break;
            case 40: {jdq_off_on1 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz2 == 1){yinhu_jdq2 = 1;}
    if (yinhu_jdq2 == 1)
    {
        jdq_off_on2 ++;
        switch (jdq_off_on2 )
        {
            case 1: {getout2 |= 0x02;};break;
            case 8: {getout2 &= 0xfd;};break;
            case 30: {jdq_off_on2 = 0x00; yinhu_bz2 = 0;yinhu_jdq2 = 0;};break;
            case 40: {jdq_off_on2 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz3 == 1){yinhu_jdq3 = 1;}
    if (yinhu_jdq3 == 1)
    {
        jdq_off_on3 ++;
        switch (jdq_off_on3 )
        {
            case 1: {getout2 |= 0x04;};break;
            case 8: {getout2 &= 0xfb;};break;
            case 30: {jdq_off_on3 = 0x00; yinhu_bz3 = 0;yinhu_jdq3 = 0;};break;
            case 40: {jdq_off_on3 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz4 == 1){yinhu_jdq4 = 1;}
    if (yinhu_jdq4 == 1)
    {
        jdq_off_on4 ++;
        switch (jdq_off_on4 )
        {
            case 1: {getout2 |= 0x08;};break;
            case 8: {getout2 &= 0xf7;};break;
            case 30: {jdq_off_on4 = 0x00; yinhu_bz4 = 0;yinhu_jdq4 = 0;};break;
            case 40: {jdq_off_on4 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz5 == 1){yinhu_jdq5 = 1;}
    if (yinhu_jdq5 == 1)
    {
        jdq_off_on5 ++;
        switch (jdq_off_on5 )
        {
            case 1: {getout2 |= 0x10;};break;
            case 8: {getout2 &= 0xef;};break;
            case 30: {jdq_off_on5 = 0x00; yinhu_bz5 = 0;yinhu_jdq5 = 0;};break;
            case 40: {jdq_off_on5 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz6 == 1){yinhu_jdq6 = 1;}
    if (yinhu_jdq6 == 1)
    {
        jdq_off_on6 ++;
        switch (jdq_off_on6 )
        {
            case 1: {getout2 |= 0x20;};break;
            case 8: {getout2 &= 0xdf;};break;
            case 30: {jdq_off_on6 = 0x00; yinhu_bz6 = 0;yinhu_jdq6 = 0;};break;
            case 40: {jdq_off_on6 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz7 == 1){yinhu_jdq7 = 1;}
    if (yinhu_jdq7 == 1)
    {
        jdq_off_on7 ++;
        switch (jdq_off_on7 )
        {
            case 1: {getout2 |= 0x40;};break;
            case 8: {getout2 &= 0xbf;};break;
            case 30: {jdq_off_on7 = 0x00; yinhu_bz7 = 0;yinhu_jdq7 = 0;};break;
            case 40: {jdq_off_on7 = 0x00;};break;
        }
    }
    //==========================================//
    if (yinhu_bz8 == 1){yinhu_jdq8 = 1;}
    if (yinhu_jdq8 == 1)
    {
        jdq_off_on8 ++;
        switch (jdq_off_on8 )
        {
            case 1: {getout2 |= 0x80;};break;
            case 8: {getout2 &= 0x7f;};break;
            case 30: {jdq_off_on8 = 0x00; yinhu_bz8 = 0;yinhu_jdq8 = 0;};break;
            case 40: {jdq_off_on8 = 0x00;};break;
        }
    }
    //==========================================//
}
////////////////////////////////////////
void Initiata_adc(void)//AD转换初始化
{
        P1ASF = 0xff;//设置P1口为AD转换口
        AUXR1 = 0x04;
        ADC_CONTR = 0X80;//开AD转换电源 //设置转换速度
        AD_IN1 = 0;
        AD_IN2 = 0;
        AD_IN3 = 0;
        AD_IN4 = 0;
        AD_IN5 = 0;
        AD_IN6 = 0;
        AD_IN7 = 0;
        AD_IN8 = 0;
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}
////////////////////////////////////////
void Initiata_dac(void)//DA数据转换初始化
{
        DA_OUT1 = 0;
        DA_OUT2 = 0;
        DA_OUT3 = 0;
        DA_OUT4 = 0;
        DA_OUT5 = 0;
        DA_OUT6 = 0;
        DA_OUT7 = 0;
        DA_OUT8 = 0;
        one_16 = 0;
        two_16 = 0;
}
////////////////////////////////////////
void Initiata_yinhu(void)//引弧初始化
{
        yinhu_bz1 = 0;
        yinhu_bz2 = 0;
        yinhu_bz3 = 0;
        yinhu_bz4 = 0;
        yinhu_bz5 = 0;
        yinhu_bz6 = 0;
        yinhu_bz7 = 0;
        yinhu_bz8 = 0;
}
////////////////////////////////////////
void Initiata_int(void)//中断初始化
{
/*
    sfr IE      = 0xA8;  //中断控制寄存器        EA  ELVD  EADC   ES   ET1  EX1  ET0  EX0  0x00,0000
    //-----------------------
    sbit EA       = IE^7;
    sbit ELVD     = IE^6; //低压监测中断允许位
    sbit EADC     = IE^5; //ADC 中断允许位
    sbit ES       = IE^4;
    sbit ET1      = IE^3;
    sbit EX1      = IE^2;
    sbit ET0      = IE^1;
    sbit EX0      = IE^0;

    sfr IP      = 0xB8; //中断优先级低位      PPCA  PLVD  PADC  PS   PT1  PX1  PT0  PX0   0000,0000
    //-----------------------
    sbit PPCA     = IP^7;  //PCA 模块中断优先级
    sbit PLVD     = IP^6;  //低压监测中断优先级
    sbit PADC     = IP^5;  //ADC 中断优先级
    sbit PS       = IP^4;
    sbit PT1      = IP^3;
    sbit PX1      = IP^2;
    sbit PT0      = IP^1;
    sbit PX0      = IP^0;

    sfr SCON = 0x98; //Serial Control         SM0/FE SM1   SM2   REN   TB8   RB8    TI    RI    0000,0000
    //-----------------------------------
    sbit SM0 = SCON^7;  //SM0/FE
    sbit SM1 = SCON^6;
    sbit SM2 = SCON^5;
    sbit REN = SCON^4;
    sbit TB8 = SCON^3;
    sbit RB8 = SCON^2;
    sbit TI  = SCON^1;
    sbit RI  = SCON^0;
*/
    IE=0xB2;
    IP=0x10;
    PCON=0X80;
    SCON=0X50;
}
////////////////////////////////////////
void Initiata_rs232(void)//串口初始化
{
        ES = 0;
        SCON=0X50;
        //BRT =  0XF4;   //22.1184MHz  9600
        BRT =  0XFA;    //22.1184MHz  19200
        AUXR = 0X11;
        ES = 1;
}
////////////////////////////////////////
void Initiata_time(void)//定时器初始化
{
    TMOD = 0X11;
    TL0 = TH0 = 0x00;
    TL1 = TH1 = 0x00;
}
////////////////////////////////////////
void main(void)
{

	_nop_();_nop_();
        P4SW = 0XBF;
	P0=0xff;
	P1=0xff;
	P3=0xff;
	P2=0x00;
        auto_man = 0;

        jdq_off_on1 = 0x00;
        jdq_off_on2 = 0x00;
        jdq_off_on3 = 0x00;
        jdq_off_on4 = 0x00;
        jdq_off_on5 = 0x00;
        jdq_off_on6 = 0x00;
        jdq_off_on7 = 0x00;
        jdq_off_on8 = 0x00;

        getout1 = 0;
        getout2 = 0;
        getout_bit1();
        getout_bit2();

        Initiata_int();
        Initiata_rs232();
        Initiata_adc();
        Initiata_dac();
        Initiata_yinhu();
        Initiata_time();

        send_back = 0;
        TR0 = 1;
        /////////初次启动AD转换
        AD_count = 0x04;
        channel = 0x01;
        start_adc();

	while(1)
	{
                WDT_CONTR = 0X3C; //喂狗
                delay_times++;
                if(delay_times > 8000)//工作指示灯
                {
                    delay_times = 0;
                    led = !led;
                    EA = 0;
                    _nop_();_nop_();
                   // bit16_out ();
                    WDT_CONTR = 0X3C; //喂狗
                    huyuan_control();
                    WDT_CONTR = 0X3C; //喂狗
                    getout_bit1();
                    getout_bit2();
                    WDT_CONTR = 0X3C; //喂狗
                    yinhu_cantrol();
                    ///////弧电源的上电控制/////////
                    getin_bit1();
                    if (auto_man == 0)
                    {getout1 = getin1;}
                    else
                    {getout1 = yinhu_bit;}
                    //////////////////////////////////
                    ///////AUTO-MAN控制/////////
                    getin_bit2();
                    get_d2 = getin2 & 0x01;
                    if (get_d2 == 0)
                    {auto_man = 0;}
                    else
                    {auto_man = 1;}
                    //////////////////////////////////
                    EA = 1;
                }

                WDT_CONTR = 0X3C; //喂狗
                _nop_();_nop_();
                if (check == 1)
                {
                    check = 0;
                    EA = 0;
                    RS485_ZHC();
                    EA = 1;
                    WDT_CONTR = 0X3C; //喂狗
                }

	}
}




























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -