📄 单片机modbusrtu通信协议.txt
字号:
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 + -