📄 whx40318.c
字号:
/*********************************************************************************************/
/*新电路板。实现4个接收电流环(即四个4-20毫安到1-5伏转换,加入3-fell)ok , 修互感器 */
/*日期:2003年12月24日。时间:08点40分.1本实验为cod与监控仪的通信实验;(扩展了串行口的情况下)*/
/*2>流量计与监控仪的子窜口进行通信,加上了电脑的通信协议,实现双流量计通信 */
/*进行485的传输,与宋利强的电脑连接 */
/*加入了cod显示子程,包括BCD_FLOAT子程. */
/*加入了交大的30秒传一次;仅传输流量值和cod值。 */
/* 以rs232来采集流量计瞬时值 0xf948; */
/*加入FAH命令用于采集怡文的COD值。加入4-20ma的采集部分。 */
/*加入短信模块,手机号码用键盘输入。服务器传送控制命令1:实时值。2定时发送值.稳定 3加延迟。 */
/*改rx_232接收命令 ,区分互感器与4-20ma. 可修改流量计量程。 */
/*********************************************************************************************/
#include<math.h>
#include<absacc.h>
#include<intrins.h>
#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define YEAR_ADR XBYTE[0xf909]
#define MONTH_ADR XBYTE[0xf908]
#define DAY_ADR XBYTE[0xf907]
#define HOUR_ADR XBYTE[0xf904]
#define MIN_ADR XBYTE[0xf902]
#define SEC_ADR XBYTE[0xf900]
#define PC_8255 XBYTE[0xfb10]
#define PA_8255 XBYTE[0xfb00]
#define PB_8255 XBYTE[0xfb08]
#define CON_8255 XBYTE[0xfb18]
#define AD_0809 XBYTE[0xfa00]
#define SEC_12887 XBYTE[0xf901]
#define MIN_12887 XBYTE[0xf903]
#define HOUR_12887 XBYTE[0xf905]
#define CONA_12887 XBYTE[0xf90a]
#define CONB_12887 XBYTE[0xf90b]
#define CONC_12887 XBYTE[0xf90c]
#define LCD_CON XBYTE[0xfc00]
#define LCD_DATA XBYTE[0xfc01]
#define LCD_STATE XBYTE[0xfc02]
#define MIMA 33333
bit secflg;
bit ruflg;
bit sms_change_ok,sms_ok,sms_state,sms_send_begin;
bit sms_state_v1,sms_state_v2;
bit rx_ack2=1,rx_data2=1;rx_end2=1;
sbit wdog =0xB3;
sbit P16 =0x96; /*控制MAX485*/
sbit P17 =0x97; /*控制fsoc为9600的RS232*/
sbit ADRO_0=0x90; /*上位机传输数据*/
sbit ADRO_1=0x91;
sbit ADRI_0=0x93; /*下位机传输数据*/
sbit ADRI_1=0x94;
unsigned char k;
xdata float sl; /*瞬时流量 */
xdata float fsl; /*缓存流量值*/
xdata float cod; /*cod值 */
/*float fsl1;*/
xdata float codma=0,itv2=0,itv3=0,itv4=0; /*用4-20ma来采集模拟cod值*/
unsigned char ADC_VALUE;
float zjsl; /*流量计的立方单位计数器*/
unsigned char count30s=0,count59s=0; /*rs232或485的计数脉冲*/
xdata unsigned char ary[10];
xdata unsigned char chflag[8];
xdata unsigned char phonenum[6];
idata unsigned char year;
idata unsigned char month;
idata unsigned char day;
xdata unsigned char insyear,insmonth,insday,curmonth,curyear;
xdata unsigned char lastday[12],lm[8],ln[8],led_bz;
xdata unsigned long total;
xdata unsigned int hday[12][31];
xdata unsigned int worktime[8][12][31];
xdata unsigned char data_cod_value[8][7];
xdata unsigned char temp_data_cod_value[7];
idata unsigned char *ppp; /*datatrans用的指针*/
idata unsigned char verify0=0,ii=0;
bit rx_ack=1,rx_data=1,rx_end=1;
idata unsigned char *pp; /*子串口1用的指针*/
idata unsigned char verify10=0,verify11=0,ii1=0,ii11=-1;
bit rx_ack1=1;
idata unsigned char *pp1; /*子串口2,cod用的指针*/
xdata unsigned char temp_verify=0;
idata unsigned char ii2=0,ii20=0,ii21=0; /*子串口3用的指针*/
xdata unsigned char TIME_MIN,TIME_HOUR,SMS_COMMAND,DELAY_MIN;
unsigned int btoi(unsigned int x, unsigned int y)/*byte to int */
{xdata unsigned int i,temp=0;
for(i=0;i<=y;i++)
temp=XBYTE[x+i]*pow(10,y-i)+temp;
return temp; /*x=0xf920;x=0xf924;*/
}
void cod_tran_code(bit adr0,bit adr1,unsigned char temp)/*子串口传输字节数据子程*/
{ TI =0;
ADRI_0= adr0;
ADRI_1= adr1;
SBUF = temp;
while(!TI);
TI = 0;
ADRI_0= 1;
ADRI_1= 1;
}
void watchdog()
{ wdog=1;
;;
wdog=0;
;;
}
receive() interrupt 4
{ EA=0;
if(RI)
{ RI=0;
switch ( P1&0x03 )
{case 0:if (rx_ack2)
{ if (SBUF==0xD7) { ii2=1;goto end; }
if (ii2==1)
{ if (SBUF<=147) { ii21=SBUF; rx_ack2=0; ii2=0;goto end; }
else { switch (SBUF)
{ case 0xFF: break; /*字节长度不符*/
case 0xFD: sms_change_ok=1; break; /*模块工作,灯全亮*/
case 0xFC: if (ii20<3){ sms_state=1; ii20++;} /*发送失败三次,不发*/
else { sms_state=0; ii20=0;}
break;
case 0xFB: sms_state=1; break; /*模块忙*/
case 0xFA: sms_change_ok=1; ii20=0;break; /*发送成功*/
default : break;
} rx_ack2=1;ii2=0;
}
}
}
else if ( rx_data2 )
{ if (ii2<=5&&SBUF==phonenum[ii2] ) { ii2++ ; goto end; }
else if (ii2==6)
switch(SBUF)
{ case 0: if (ii21==8) { SMS_COMMAND=0;sms_send_begin=1;} break;
case 1: ii2++;sms_state_v1=1;goto end;
case 2: ii2++;sms_state_v2=1;goto end;
default: break;
}
else if (sms_state_v1)
{ TIME_MIN=1440/SBUF;/*次数转换为分钟数*/
if (TIME_MIN>=60) TIME_HOUR=TIME_MIN/60;
SMS_COMMAND=1; sms_send_begin=1;
}
else if (sms_state_v2)
{ DELAY_MIN=SBUF; SMS_COMMAND=2;sms_send_begin=1;}
}
err3: rx_ack2=1;rx_data2=1;rx_end2=1;sms_state_v1=0;sms_state_v2=0;ii2=0;ii21=0; break;
case 1:if(rx_ack1)
{ for(;ii1<14;)
{ ii1++;
if(ii1<8) { *pp1=SBUF; verify10^=SBUF; pp1++; } /*异或校验*/
else verify11^=SBUF;
if (ii1<14) goto end;
}
if ( (ii1==14)&&(verify11==verify10) ) { rx_ack1=0; goto end;}
err1: rx_ack1=1;ii1=0;verify10=0;verify11=0;pp1=&temp_data_cod_value;
}
break;
case 2: if(rx_ack)
{ for(;ii<=4&&SBUF==0x40;)
{ ii++;
if(ii==5) { rx_ack=0; ii=0; }
goto end;
}
if(ii<5||ii>5) goto err;
}
else if(rx_data)
{ for(;ii<=3;)
{ ii++;
*pp=SBUF;
verify0^=*pp; /*异或校验*/
pp++;
goto end;
}
if( (ii<4||ii>4)||(SBUF!=verify0) ) goto err;
rx_data=0;
ii=0;
goto end;
}
else if(rx_end)
for(;ii<=4&&SBUF==0x23;)
{ ii++;
if(ii==5) { sl=fsl; goto err; }
goto end;
}
err: rx_ack=1;rx_data=1;rx_end=1;ii=0;verify0=0;pp=&fsl;
break;
case 3:break;
default: break;
}
}
end: TI=0;EA=1;
}
float BCD_FLOAT(x,y)
unsigned char x,y;
{ unsigned char H_valuex,L_valuex,H_valuey,L_valuey;
L_valuex=x&0x0f; /*个*/
L_valuey=y&0x0f; /*百*/
H_valuex=(x&0xf0)>>4; /*十*/
H_valuey=(y&0xf0)>>4; /*千*/
return ( H_valuey*1000+L_valuey*100+H_valuex*10+L_valuex );
}
void datatrans_232()
{
char *pp;
unsigned char xx=0;
unsigned char verify=0;
unsigned int ii=0;
TI=1;
for(ii=0;ii<=4;ii++)
{
while(!TI);
TI=0;
SBUF=0x40;
}
for(ii=0;ii<=7;ii++)
{
while(!TI);
TI=0;
xx=chflag[ii];
SBUF=xx;
verify=verify^xx;
}
for(ii=8;ii<=11;ii++)
{
while(!TI);
TI=0;
SBUF=0x03;xx=0x03;verify=verify^xx;
}
pp=&sl;
for(ii=0;ii<=3;ii++)
{while(!TI);
TI=0;
SBUF=*pp;xx=*pp;verify=verify^xx;
pp=pp+1;
}
for(ii=0;ii<=27;ii++)
{ while(!TI);
TI=0;
SBUF=0;xx=0;verify=verify^xx;
}
pp=&cod;
for(ii=0;ii<=3;ii++)
{ while(!TI);
TI=0;
SBUF=*pp;xx=*pp;verify=verify^xx;
pp=pp+1;
}
for(ii=0;ii<=499;ii++)
{
while(!TI);
TI=0;
SBUF=0;xx=0;verify=verify^xx;
}
while(!TI);
TI=0;
SBUF=verify;
for(ii=0;ii<=4;ii++)
{
while(!TI);
TI=0;
SBUF=0x23;
}
}
busy()
{ bit flg=1;
char s;
while(flg)
{ s=LCD_STATE;
flg=(bit)(s&0x80);
}
}
readtime()
{ curyear=YEAR_ADR;
year=YEAR_ADR;
month=MONTH_ADR;
day=DAY_ADR;
}
delay(unsigned char t) /*delay 200us,t=30;Because adc0809 is 460kHZ,so it change is 157us*/
{ unsigned char i;
for(i=0;i<=t;i++)
;
}
xs(sdz,str,su)
unsigned char sdz,str[10],su;
{ char i;
busy();
LCD_CON=sdz;
for(i=0;i<=su;i++)
{
busy();
LCD_DATA=str[i];
}
}
qinping()
{ LCD_CON=1;
LCD_CON=1;
}
lcd_init()
{ char i;
for(i=0;i<=3;i++)
{
LCD_CON=0x30;
delay(250);
}
LCD_CON=0x38;
delay(10);
LCD_CON=0x08;
delay(10);
LCD_CON=0x01;
delay(10);
LCD_CON=0x06;
delay(250);
LCD_CON=0x0c;
delay(250);
}
sys_init()
{ sms_state=0;
sms_change_ok=0;
sms_send_begin=0;
sms_ok=0;
sms_state_v1=0;
sms_state_v2=0;
EA=0;
SCON=0x50;
IP=0x10; /*置中断优先极,串口的高*/
TMOD=0x21; /*主机波特率为9600,从为2400*/
PCON=0x80;
TH1=0xfa;
TL1=0xfa;
CON_8255=0x88; /*8255的口为A-B, C低四位输出;C高4为输入*/
CONB_12887=0xa6;
SEC_12887=0xc0;
MIN_12887=0xc0;
HOUR_12887=0xc0;
CONB_12887=0x26;
CONA_12887=0x20;
lcd_init();
qinping();
xs(0xc3,"HANJIE ",6);
xs(0xcb,"SHUMA",4);
xs(0x9b,"--OK--",5);
secflg=1;
zjsl=0;
TR1=1;
IT0=1; /*脉冲方式*/
IE=0x91;
}
month_clr(unsigned char mon)
{ unsigned char i,j;
if(mon!=curmonth)
{
for(i=0;i<=30;i++)
{
hday[mon][i]=0;
}
for(i=0;i<=7;i++)
{
for(j=0;j<=30;j++)
{
worktime[i][mon][j]=0;
}
}
}
curmonth=mon;
}
unsigned char a_d(unsigned char ch)
{ unsigned int y=0;
unsigned char adc,i;
for (i=0;i<=9;i++)
{ AD_0809=ch;
delay(30);
adc=AD_0809;
y=y+adc;
}
adc=y/10;
return(adc);
}
unsigned char adc(unsigned char ch)/*4-20mA用的*/
{ xdata unsigned int y=0;
xdata unsigned char adc,j,m=0;
for (j=0;j<=19;j++)
{ AD_0809=ch;
delay(30); /*delay 200us ,Because adc0809 is 460kHZ,so it change is 157us*/
adc=AD_0809;
if (adc>=51)
{ m++;
adc=adc-51;
y=y+adc;
}
}
if (m==0)
return(0);
else
{ adc=y/m;
return(adc);
}
}
itv_caiji( unsigned char i,float *temp,unsigned int j)
{ xdata float temp_itv=0;
ADC_VALUE=adc(i); /*4-20ma的1*/
temp_itv=ADC_VALUE;
if (temp_itv!=0)
{ temp_itv=temp_itv*1.25;
temp_itv=temp_itv*btoi(j,3);
*temp =temp_itv/255;
}
}
zd1s() interrupt 0
{
unsigned char d,m,h,min,x,i,bb,s;
watchdog();
secflg=1;
x=CONC_12887; /*12887的中断复位*/
if(ruflg!=1)
{ m=MONTH_ADR;
d=DAY_ADR;
h=HOUR_ADR;
min=MIN_ADR;
s=SEC_ADR;
month_clr(m);
lastday[m-1]=d;
if(chflag[4]==3) itv_caiji(4,&codma,0xf920);/*互感器不工作,4-20ma工作*/
if(chflag[5]==3) itv_caiji(5,&itv2 ,0xf924);
if(chflag[6]==3) itv_caiji(6,&itv3 ,0xf928);
if(chflag[7]==3) itv_caiji(7,&itv4 ,0xf92c);
x=a_d(3);
sl=1.51*x;
sl=pow(sl,1.85);
sl=0.00246*sl*0.25; /* 流量50*x */
sl=sl*btoi(0xf944,3);
zjsl=zjsl+sl;
if(zjsl>=1000)
{ total+=1;
hday[m-1][d-1]+=1;
zjsl=zjsl-1000;
}
worktime[3][m-1][d-1]+=1;
bb=1;
led_bz=0;
for (i=0;i<=7;i++)
{ if (XBYTE[0xf930+i]==0)
chflag[i]=3;
else
{ chflag[i]=0;
x=a_d(i);
if (x<lm[i]&&x>ln[i])
{ chflag[i]=1;
led_bz=led_bz|bb;
}
if(s==0)
worktime[i][m-1][d-1]+=1;
}
bb=bb<<1;
}
PB_8255=led_bz;
}
count30s++;
count59s++;
if(TIME_MIN>=60) x=0;
else x=1;
if ( sms_state || (s==0 && ((x && (min+DELAY_MIN)%TIME_MIN==0)||(min==DELAY_MIN && h%TIME_HOUR==0))) ) /*电脑为59秒传送一次*/
{ count59s=0; /*高电平RS485有效*/
EA=0;
TI=1;
while(!TI);TI=0;SBUF=0xD7; /*包头D7*/
while(!TI);TI=0;SBUF=54;
for (i=0;i<=5;i++) { while(!TI);TI=0;SBUF=phonenum[i];} /*电话号码*/
while(!TI);TI=0;
if(sms_state) SBUF=SMS_COMMAND; /*回控制字*/
else SBUF=255;
for (i=0;i<=7;i++) { while(!TI);TI=0;SBUF=chflag[i]; } /*设备运行状况*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -