📄 fourchannel.c
字号:
{ overtime=0; //无脉冲超时错误
CMOD=0x01;CCON=0x00;IE|=0xc0;
if(cnnumb==0) //测量组通道,0测量AB通道,1测量CD通道
{ CCAPM0=CCAPM1=CCAPM2=CCAPM3=0;
PlusError=0;
PlusOver0=PlusOver1=PlusCount0=PlusCount1=0;
starovertime();
UseFlag=0; CCAPM0=0x21; CH=CL=0X00; CCON=0X40; //单组测量,上升沿触发,中断开,清除PCA中断标记,置位CR运行PCA
while(overtimeflag) {if(UseFlag==1) break;} //首个脉冲值出现后跳出;<overtimeflag==0:无脉冲而导致超时错误,循环停止>
CCAPM0=CCAPM1=0X31;
while(overtimeflag) //上升下降沿触发;<overtimeflag==0:无脉冲而导致超时错误,循环停止>
{ if(PlusOver0>2||PlusOver1>2) {PlusError=1; break;}
if((PlusCount0==GS)&&(PlusCount1==GS)) break;
}
CCON=0x00;CCAPM0=CCAPM1=0X00; //单组通道测量完毕
stopovertime();
if(overtimeflag==0)
{ init(); wrcommand(0x0c); setxy(0x89); dispen(0x41); dispen(0x42); disphz(0xcd,0xa8);
disphz(0xb5,0xc0);disphz(0xce,0xde); disphz(0xc2,0xf6); disphz(0xb3,0xe5); //AB无脉冲
delay();delay();init();wrcommand(0x0c); break;
}
if(PlusError==1||1==datamanage_plus(cnnumb,group)) //利用PlusError==1则后面的不执行
{ if(errorcount++>6){break;}}
else break;
}
else
{ CCAPM0=CCAPM1=CCAPM2=CCAPM3=0;
PlusError=0;
PlusCount0=PlusCount1=PlusOver0=PlusOver1=0;
starovertime();
UseFlag=0; CCAPM2=0x21; CH=CL=0X00; CCON=0X40; //单组测量,上升沿触发,中断开,清除PCA中断标记,置位CR运行PCA
while(overtimeflag){if(UseFlag==1) break;} //首个脉冲值出现后跳出;<overtimeflag==0:无脉冲而导致超时错误,循环停止>
CCAPM2=CCAPM3=0X31;
while(overtimeflag) //上升下降沿触发;<overtimeflag==0:无脉冲而导致超时错误,循环停止>
{ if(PlusOver0>2||PlusOver1>2){PlusError=1;break;}
if((PlusCount0==GS)&&(PlusCount1==GS)) break;
}
CCON=0x00;CCAPM2=CCAPM3=0X00; //单组通道测量完毕
stopovertime();
if(overtimeflag==0)
{ init(); wrcommand(0x0c); setxy(0x89); dispen(0x43); dispen(0x44); disphz(0xcd,0xa8);
disphz(0xb5,0xc0);disphz(0xce,0xde); disphz(0xc2,0xf6); disphz(0xb3,0xe5); //CD无脉冲
delay(); delay(); init(); wrcommand(0x0c);break;
}
if(PlusError==1||1==datamanage_plus(cnnumb,group))
{ if(errorcount++>6) {break;}}
else break;
}
}
}
void pulse(uchar group) //双通道,四通道切换测量
{ if(channeltype==2) cycleall(0,group);
else {cycleall(0,group); cycleall(2,group);} //测量四通道
}
uchar readad(uchar chan) //从0809读取采样值,port将采样的通道号
{ uchar data i;
uchar idata k;
ad_star=0; P0=chan; ad_star=1; ad_star=1; ad_star=0; ad_star=0; P0=0xff; ad_oe=1; i=254;//P0输出通道号
while(i--){;} //延时116uS,等待数据转换完毕.
P0=0xff;k=P0;ad_oe=0; //置ad_oe=0则0809的数据端口高阻 ,k=P0;
return(k);
}
void accon(uchar k) //测量AD高电平
{ uchar i,aderrorcount;
while(1)
{ ad_star=0; ad_oe=0;
starovertime();
for(i=0;i<GS2;i++)
{ UseFlag=0; //清除使用标记
while(UseFlag==0&&overtimeflag==1){;} //通道触发沿出现,跳出循环;overtimeflag==0:跳出循环
ComputTemp[i]=readad(k);
}
stopovertime();
if(1==datamanage_del()) //判断脉冲电平值是否在数理统计范围内
{ if(aderrorcount++>7){break;}
}
else break;
}
}
void ad(uchar group) //ad测量
{ CCAPM0=CCAPM1=CCAPM2=CCAPM3=0x00; stb=1;
IE|=0xc0; CCON=0x40; //打开EA,ECCF(PCA中断),使用AD高低电平标记,1/6分频
if(channeltype==4)
{ CCAPM2=0x21; accon(2); Disp[group][2].HLevel=(uchar)(HWidth*0.5737864); CCAPM2=0x00;
CCAPM3=0x21; accon(3); Disp[group][3].HLevel=(uchar)(HWidth*0.5737864); CCAPM3=0x00; //最高低电平
CCAPM2=0x11; accon(2); Disp[group][2].LLevel=(uchar)(LWidth*5.737864); CCAPM2=0x00;
CCAPM3=0x11; accon(3); Disp[group][3].LLevel=(uchar)(LWidth*5.737864); CCAPM3=0x00;} //注意;没有'ELSE',如果'channeltype'=0,进行四通道测量
{ CCAPM0=0x21; accon(0); Disp[group][0].HLevel=(uchar)(HWidth*0.5737864); CCAPM0=0x00;
CCAPM1=0x21; accon(1); Disp[group][1].HLevel=(uchar)(HWidth*0.5737864); CCAPM1=0x00;
CCAPM0=0x11; accon(0); Disp[group][0].LLevel=(uchar)(LWidth*5.737864); CCAPM0=0x00;
CCAPM1=0x11; accon(1); Disp[group][1].LLevel=(uchar)(LWidth*5.737864); CCAPM1=0x00;}
IE&=0xbf; CCON=0x00;
}
void dataconversion(uchar group) //屏显数据处理<group:0:人工测量;0,1,2:自动测量>
{ uchar idata i,cct,ctemp;
if(channeltype==4)cct=4; else cct=2;
for(i=0;i<cct;i++)
{ ctemp=(uchar)(10000000/(Disp[group][i].APlusWidth*5.425276)/rev_num[mi]); //显示脉冲个数 0屏显高位
if(ctemp<=202&&ctemp>=198)ctemp=200; //微小调整
if(ctemp!=200)DError[i]|=0x80; //脉冲数不等于200,错误
Disp[group][i].PlusCount[0]=ctemp/100;
if(Disp[group][i].PlusCount[0]>9) Disp[group][i].PlusCount[0]=0; //防止显示乱码
ctemp=ctemp%100;
Disp[group][i].PlusCount[1]=ctemp/10;
Disp[group][i].PlusCount[2]=ctemp%10;
ctemp=Disp[group][i].HDutyRatio; //显示最大占空比0:十位1:个位
if(ctemp<30||ctemp>70)DError[i]|=0x10;
Disp[group][i].DHDutyRatio[0]=ctemp/10;
if(Disp[group][i].DHDutyRatio[0]>9) Disp[group][i].DHDutyRatio[0]=0; //防止显示乱码
Disp[group][i].DHDutyRatio[1]=ctemp%10;
ctemp=Disp[group][i].LDutyRatio; //显示最小占空比0:十位1:个位
if(ctemp<30||ctemp>70)DError[i]|=0x06;
Disp[group][i].DLDutyRatio[0]=ctemp/10;
if(Disp[group][i].DLDutyRatio[0]>9) Disp[group][i].DLDutyRatio[0]=0; //防止显示乱码
Disp[group][i].DLDutyRatio[1]=ctemp%10;
ctemp=Disp[group][i].HPhaseDiff; //显示最大相位差0:十位1:个位
if(ctemp<45||ctemp>135)DError[i]|=0x04;
Disp[group][i].DHPhaseDiff[0]=ctemp/100;
if(Disp[group][i].DHPhaseDiff[0]>9) Disp[group][i].DHPhaseDiff[0]=0; //防止显示乱码
ctemp=ctemp%100;
Disp[group][i].DHPhaseDiff[1]=ctemp/10;
Disp[group][i].DHPhaseDiff[2]=ctemp%10;
ctemp=Disp[group][i].LPhaseDiff;
if(ctemp<45||ctemp>135)DError[i]|=0x02;
Disp[group][i].DLPhaseDiff[0]=ctemp/100;
if(Disp[group][i].DLPhaseDiff[0]>9) Disp[group][i].DLPhaseDiff[0]=0; //防止显示乱码
ctemp=ctemp%100; //显示最小相位差0:十位1:个位
Disp[group][i].DLPhaseDiff[1]=ctemp/10;
Disp[group][i].DLPhaseDiff[2]=ctemp%10;
ctemp=Disp[group][i].HLevel; //Disp[][].HLevel定义为uchar型,并且在accon()函数中已算好.高电平0:10v 1:1v 2:0.1v
if(ctemp<90)DError[i]|=0x40; //高电平<9V,错误
Disp[group][i].DHLevel[0]=ctemp/100;
if(Disp[group][i].DHLevel[0]>9) Disp[group][i].DHLevel[0]=0; //防止显示乱码
ctemp=ctemp%100;
Disp[group][i].DHLevel[1]=ctemp/10;
Disp[group][i].DHLevel[2]=ctemp%10;
ctemp=Disp[group][i].LLevel; //Disp[][].HLevel定义为uchar型,并且在accon()函数中已算好.低电平0:1v 1:0.1v 2:0.01v AD分压比:2.958127
if(ctemp>200)DError[i]|=0x20; //低电平>2V,错误
Disp[group][i].DLLevel[0]=ctemp/100;
if(Disp[group][i].DLLevel[0]>9) Disp[group][i].DLLevel[0]=0; //防止显示乱码
ctemp=ctemp%100;
Disp[group][i].DLLevel[1]=ctemp/10;
Disp[group][i].DLLevel[2]=ctemp%10;
}
}void delay(void) //显示延时
{uchar delayi,delayj,delayk; //六时钟模式
for(delayi=12;delayi!=0;delayi--) //每秒两个数字
for(delayj=200;delayj!=0;delayj--) //0.5s
for(delayk=200;delayk!=0;delayk--){;}
}
void smalldelay(void) //键盘延时0.5s
{uchar delayj,delayk; //六时钟模式
for(delayj=200;delayj!=0;delayj--) //40ms
for(delayk=200;delayk!=0;delayk--){;}
}uchar key(void) //键盘扫描,返回键值40mS
{ uchar idata line,row,fs=0xff,kv,keyvalu;
P2=0xf0;keyvalu=P2&0xf0; //-------键盘接线图-------//
if(P2==0xf0)return(15); ////////////////////////////
else{smalldelay();keyvalu=P2&0xf0;} // P2.0 P2.7 //
if(keyvalu==0xf0)return(15); // |||| | | | | //
else{line=0x00; // ||||__null 1 2 3 //
for(row=1;row<5;row++) // |||___print 4 5 6 //
{ fs=fs<<1;P2=fs; // ||____up 7 8 9 //
if((P2&0xf0)!=0xf0) goto attu; // |_____down ok 0 cancel //
} ////////////////////////////
return(15);
}
attu:line=0xf0&P2;
switch(row)
{ case 1:switch(line)
{ case 0x70:kv=13;break; //cancel
case 0xb0:kv=0; break;
case 0xd0:kv=12;break; //ok
case 0xe0:kv=11;break; //down
default:kv=15;break;} //null
break;
case 2:switch(line)
{ case 0x70:kv=9;break;
case 0xb0:kv=8;break;
case 0xd0:kv=7;break;
case 0xe0:kv=10;break; //up
default:kv=15;}
break;
case 3:switch(line)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -