📄 x20gdnzh1.c
字号:
//*************************************************************************
//输出频率确定 通过遥控器设置改变存储器中0x16 ~15单元中的参数来选择信号制
//*************************************************************************
void inout(void)
{
union { //共用体:几种不同的变量存放在同一个地址开始的内存单元中,编码相同
float y;
unsigned char a[4];
unsigned int b[2];
unsigned int i;
}z;
unsigned char j;
out=reade(0x16); //输出频率选择
j=0x20+out*10; //out的取值范围是0~19 j=0x20+19*10=0xDE
z.i=reade(j); //写入分配的内存的前两个字节变量
fpb=z.a[0]; //分频参数选择;分频参数写在分配的4个字节内存中的第一个字节
if(z.a[1]>=0x20) { //高浓瓦斯和高低浓瓦斯通道选择标志写在第2个字节内存单元中
gdn=1; //高浓瓦斯
GN=1;
DN=0;
adchange=1; //选择AD通道 即传感头选择
}
else gdn=0; //高低浓瓦斯
if((z.a[1]&0x0f)==1) onetwo=0; //频率输出1段
else onetwo=1; //频率输出两段
z.b[0]=reade(j+1);
z.b[1]=reade(j+2);
fd=z.y; //低浓频率对应值
z.b[0]=reade(j+3);
z.b[1]=reade(j+4);
fj1=z.y; //低浓频率对应基值
z.b[0]=reade(j+5);
z.b[1]=reade(j+6);
fg=z.y; //高浓频率对应值
z.b[0]=reade(j+7);
z.b[1]=reade(j+8);
fj2=z.y; //高浓频率对应基值
timebc1=reade(j+9);
}
// ************************************************
//显示“0AA”
//*************************************************
void dirout(void)
{
tbuffer2=26;tbuffer3=out/10;tbuffer4=out%10;
led2p=0;led3p=0;
}
//-----------------------------------------------
//显示低浓零点EEPROM 01H.00H
void dirld(unsigned int i)
{
i*=0.09156;
i=HEX2BCD(i);
tbuffer2=i>>8;
tbuffer3=(i&0x00f0)>>4;
tbuffer4=i&0x000f;
led2p=0;led3p=0;
led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//低浓放大显示
void dirkw(unsigned char i)
{
unsigned int j;
j=HEX2BCD(i);
tbuffer2=j>>8;
tbuffer3=(j&0x00f0)>>4;
tbuffer4=j&0x000f;
led2p=1;led3p=0;
led2c=0;led3c=0;led4c=0;
delay(38500);//延时500ms
dog();
dirb();
delay(18500);//延时xxxms
dog();
led2c=0;led3c=0;led4c=0;
delay(38500);//延时500ms
dog();
}
//-----------------------------------------------
//非线性EEPROM 05H.04H
void inunline(void)
{
uline=reade(4);
if(uline>127) linezp=1;//非线性正负标志 =1负 =0正
else linezp=0;
}
//-----------------------------------------------
//***********************************************
//显示非线性
//***********************************************
void dirunline(void)
{
if(!linezp) {
tbuffer2=0;//显示'0'
tbuffer3=(uline*100/256)/10;
tbuffer4=(uline*100/256)%10;
}
else {
tbuffer2=20;//显示'-'
tbuffer3=(~uline*100/256)/10;
tbuffer4=(~uline*100/256)%10;
}
led2p=1;led3p=0;
led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//显示高浓非线性1
void dirulineg(unsigned char i,unsigned char j)
{
unsigned int k;
tbuffer2=i;//显示'-'
k=HEX2BCD(j*100/256);
tbuffer3=k>>4;
tbuffer4=k&0x000f;
led2p=1;led3p=0;
led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//显示报警点
void dir(unsigned char i,unsigned int j)
{
tbuffer2=i;
led2p=0;
if(j>=1000){
//tbuffer2=i;//'A'
tbuffer3=j/1000;
tbuffer4=(unsigned int)(j/100)%10;
//led2p=0;
led3p=0;
}
else {
// tbuffer2=i;//'A'
tbuffer3=j/100;
tbuffer4=(j/10)%10;
//led2p=0;
led3p=1;
}
}
//***********************************************
//频率输出
//***********************************************
void plout(float i)
{
unsigned int k;
if((unsigned char)i>=timebc1) i=timebc1; //timebc1:低浓
if(!gdzh&&!gdn) { //低浓频率输出
//timebc=timebc1;
//timebc=14;
if(dnegpos) { //dnegpos:低浓瓦斯正负标志 =1浓度为负 =0浓度正
i=0.01; BJ=0; DD=0;//BJ=P2_7 DD=P3_2 i=瓦斯浓度
} //浓度为负输出当前频率低限
if(fpb>=10) { //分频超过20Hz单元 0.4%,0.2%,10%
if(i>=20) { //fd:每单位瓦斯浓度对应的频率值 fj1:低浓对应频率基值如200HZ~1000HZ中的200HZ就是基值
i=(0x10000-0xe1000/((i*fd+fj1)*2)); //+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=0;
}
else {
i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=1;
}
}
else {
if((out!=10)&&(i>=fpb*0.1)) {
i=(0x10000-0xe1000/((i*fd+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=0;
}
else {
if(i<=0.01) i=0.01;
i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=1;
}
}
}
else {//高浓频率输出
//timebc=timebc2;
//timebc=14;
if(gnegpos) { //dnegpos:低浓瓦斯正负标志 =1浓度为负 =0浓度正
i=0.01;BJ=0;DD=0;
} //浓度为负输出当前频率低限
if(fpb>=10)
if((out!=10)&&(out!=17)&&(i>=20)) {
i=(0x10000-0xe1000/((i*fg+fj2)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=0;
}
else {
i=(0x10000-0xe1000/((i*fg*64+fj2)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=1;
}
else if(i>4) {
if(onetwo) i-=4;
i=(0x10000-0xe1000/((i*fg+fj2)*2));//+timebc;
fp=0;
}
else {
if(i>=fpb*0.1) {
i=(0x10000-0xe1000/((i*fd+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=0;
}
else {
if(i<=0.01) i=0.01;
i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
fp=1;
}
}
}
k=(unsigned int)i; //强制类型转换
k+=14; //补偿周期
timerl=k%256;timerh=k/256; //频率输出定时时间
}
//*********************************************
//断电判断
//*********************************************
void ddd(float i)
{
float m;
m=pout; //断电处理
if(i>=(m/100)) {
DD=1; //断电
}
else { //判断复电
m=fout; //复电处理
if(i<(m/100))DD=0;//复电
}
}
//-----------------------------------------------
//报警判断
void bjj(float l)
{
float m;
m=alarm; //报警处理
if(l>=(m/100)) alarmflag=1; //>报警点进行报警
else {
alarmflag=0; //<报警点不进行报警
BJ=0;
}
}
//-----------------------------------------------
//遥控器输入
void inyk(void)
{
unsigned int i;
if(enyk){//有效按键
enyk=0;//清有效按键标志
if(gnflag==0){//功能码没有按下过
if(YKCODE==0xC0){//是功能码按下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -