



- #include <reg52.h>
- #define uchar unsigned char //宏定义uchar为无符型字节
- #define uint unsigned int //宏定义uint为无符型整数
- #define RCOMMAND 0x01 //宏定义读命令
- #define WCOMMAND 0x02 //宏定义写命令
- #define ECOMMAND 0x03 //宏定义擦写命令
- #define WAITTIME 0x01
-
- sfr ISP_DATA=0xe2; //定义数据寄存器地址
- sfr ISP_ADDRH=0xe3; //定义地址寄存器地址高位
- sfr ISP_ADDRL=0xe4; //定义地址寄存器地址低位
- sfr ISP_CMD=0xe5; //定义命令寄存器地址
- sfr ISP_TRIG=0xe6; //定义触发命令地址
- sfr ISP_CONTR=0xe7; //定义控制寄存器地址
-
- sbit duan=P1^6 ; //定义段选
- sbit wei=P1^7 ; //定义位选
-
- /*指示灯led*/
- sbit yx_led=P2^0; //运行灯
- sbit jsms_led=P2^1; //计时灯
- sbit jsums_led=P2^2; //计数灯
- sbit sgdw_led=P2^3; // 上关到位灯
- sbit skdw_led=P2^4; // 上开到位灯
- sbit xgdw_led=P2^5; // 下关到位灯
- sbit xkdw_led=P2^6; // 下开到位灯
-
- /*按钮*/
- sbit ms_key=P1^0; // 模式按钮
- sbit shang_key=P1^1; // 向上键
- sbit seding_key=P1^2; // 设定按钮
- sbit qiting_key=P1^3; // 启停按钮
- sbit xia_key=P1^4; // 向下按钮
- sbit rest_key=P1^5; // 复位按钮
-
- /*阀门位置信号*/
- sbit skdw_in=P3^0; // 上阀开到位信号
- sbit sgdw_in=P3^1; // 上阀关到位信号
- sbit xkdw_in=P3^2; // 下阀开到位信号
- sbit xgdw_in=P3^3; // 下阀关到位信号
-
- /*输出启动电机*/
- sbit skq=P3^4; // 上阀电机开得电
- sbit sgq=P3^5; // 上阀电机关得电
- sbit xkq=P3^6; // 下阀电机开得电
- sbit xgq=P3^7; // 下阀电机关得电
-
- uchar table[8]; //定义字符数组存放EEPROM里存的变量,和调整后存入EEPROM里
-
- uchar ms,shang,xia,seding,qiting,rest,sfk,xfk,xfg,sfg,dj;
- uchar jsgz=1,flg,x,err; //计时间隔,计时工作时间 e工作数 fl计时工作开始标志
- uchar js_jg=10,js_gz=20,jsu_cs,un,jisu;
- char e,jsjg,time,time2=3,flg1,flg2,fqwz,fqwz2=3,sd1,ys,ys1=5,flag3,cbz;
- /******************变量名称***************************
- ms 模式状态 shang按钮上 xia按钮下键 seding设定键值 qiting启停键变量 rest复位键变量
- sfk上阀开 sfg上阀关 xfk下阀开 xfg下阀关 dj定时器延时标志位
- jsgz计时工作 flg计时工作工作时间倒计时减标志位 x阀位连续开关状态 err错误时用闪烁
- e计时工作时间 jsjg计时工作间隔时间 time阀开到位等待进放料时间
- time2阀门开到位等待时间存在E2ROM值 flg1阀开到位倒计时标志位 flg2上下阀启动但位置信号不复位
- fqwz上下阀开关启动多久位置没变化 fqwz2上下阀开关启动多久们没变化设定值
- sd1设定有逻辑故障是否继续工作 ys测试阀电机得电几秒钟没到位 flag3阀电机得电没到位标志位倒计时
- ys1存EEPROM阀得电几秒没到位 js_jg能调整数值EEPROM存,赋给值 js_gz能调整数值EEPROM存,赋值
- jisu计数倒计数值 cbz错标志位复位用
- //jisu time2 js_jg js_gz */
-
- /*led数码管段选位选*/
- uchar code dm[]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xd8,0x80,0x90,0xaf,0xa3,0xfb,0xab,0x7f,0x86,0x87};
- uchar code wm[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,} ;
-
- /**************毫秒延时函数*****************/
- void delay(unsigned int a)
- {
- unsigned int i,x;
- for(i=0;i<a;i++)
- for(x=0;x<110;x++);
- }
- /*********按键扫描函数************/
- void key_scan()
- {
- // uchar k; //定义变量返回值
- ms_key=1; //送高电平到模式位
- if(ms_key!=1) //检测如果不等于高电平
- {
- delay(5); //延时
- if(ms_key!=1)
- ms=ms+1; // 确定,计时模0或计数模式1
- if(ms>=2)ms=0;
- while(ms_key!=1); //等侍按键抬起
- }
- // else ms=0; //如果还是低电平返回0
-
- if(shang_key!=1) //如果检测上键不是高电平
- {
- delay(5); // 延时
- if(shang_key!=1)
- shang=1; //如果上键还是低电平返回1
- }
- else shang=0;
- if(seding_key!=1) //如果检测设定不是高电平
- {
- delay(5); //延时
- if(seding_key!=1)
- seding++; //如果检测设定还是低电平返回1
- if(seding>=3)seding=0;
- while(seding_key!=1);
- }
- if(qiting_key!=1) //检测起动按钮如果是低电平
- {
- delay(5); //延时
- if(qiting_key!=1)
- qiting=1; //如果启动还是低电平返回1
- else qiting=0;
- }
- if(xia_key!=1) //如果下检测是低电平
- {
- delay(5); //延时
- if(xia_key!=1)
- xia=1; //如果下不是低电平返回1
- }
- else xia=0;
- if(rest_key!=1) //检测复位按钮如果是低电平
- {
- delay(5); //延时
- if(rest_key!=1)
- rest=1; //如果复位按钮还是低电平返回1
- else rest=0;
- }
- }
- /********阀门位置扫描***********/
- void fmwz()
- {
- if(skdw_in!=1) // 测试如果上阀在开的位置
- {
- delay(5); //延时
- if(skdw_in!=1)
- sfk=1; //上阀如果真的在开的位置SF复位0
- }
- else sfk=0;
- if(sgdw_in!=1) // 测试如果上阀在关的位置
- {
- delay(5); //延时
- if(sgdw_in!=1)
- sfg=1; //上阀如果真的在关的位置SF置位1
- }
- else sfg=0;
- if(xkdw_in!=1) //测试如果下阀在开的位置
- {
- delay(5); //延时
- if(xkdw_in!=1)
- xfk=1; //如果下阀还在开的位置,复位XF为0
- }
- else xfk=0;
- if(xgdw_in!=1) // 测试如果下阀在关的位置
- {
- delay(5); //延时
- if(xgdw_in!=1)
- xfg=1;
- //如果下阀还是在关位置,置XF为1
- }
- else xfg=0;
- }
- /************阀门位置指示灯****************************/
- void fled()
- {
- sgdw_led=!sfg; //上阀在关的位置,上关到位灯亮
- skdw_led=!sfk; //上阀在开的位置,上开到位灯亮
- xgdw_led=!xfg; //下阀在关的位置,下关到位灯亮
- xkdw_led=!xfk; //下阀在开的位置,下开到位灯亮
- if(ms) //如果模式是不是0
- {
- jsums_led=0; //计数LED灯亮
- jsms_led=1; //计时模式LED灯灭
- }
- else //如果模式是0
- {
- jsms_led=0; //计时LED灯亮
- jsums_led=1; //计数LED灯灭
- }
- }
- /****************显示数码管函数*********************/
- void display(uchar a,uchar b)
- {
- duan=1; //开段选
- P0=dm[a]; //段码给P0口
- duan=0; //关段选
- wei=1; //开位选
- P0=wm[b]; //位码给P0口
- wei=0; //关位选
- P0=0xff; //消隐
- delay(2);
- }
-
- /**************ISP使能**********************************/
- void enable()
- { //关闭总中断
- EA=0;
- ISP_CONTR=ISP_CONTR|WAITTIME; //写入硬件等待时间
- ISP_CONTR|=0x80; //启动ISP
- }
-
- /***************ISP 禁止*******************************/
- void disable()
- {
- ISP_CONTR=ISP_CONTR&0x7f; //关闭ISP
- ISP_TRIG=0x00; //清0
- EA=1; //开总中断
- }
-
- /*******************触发********************************/
- void goon()
- {
- enable();
- ISP_TRIG|=0x46;
- ISP_TRIG|=0xb9;
- }
-
- /******************读一个字节**************************/
- uchar read_byte(uint a)
- {
- ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH); //地址高位写入
- ISP_ADDRL=(uchar)(a|0x00ff); //地址低位写入
- ISP_CMD=ISP_CMD&0xf8; //清低3位
- ISP_CMD=ISP_CMD|RCOMMAND; //写入读命令
- goon(); //触发
- disable(); //关闭
- return ISP_DATA; //返回读出数据
- }
-
- /*****************写一个字节****************************/
- void write_byte(uint b,uchar c)
- {
- ISP_ADDRH=(uchar)((b>>8)|ISP_ADDRH); //赋值地址高位
- ISP_ADDRL=(uchar)(b|0x00ff); //赋值地址低位
- ISP_CMD=ISP_CMD&0xf8; //清低3位
- ISP_CMD=ISP_CMD|WCOMMAND; //写入写命令
- goon(); //触发
- // disable(); //关闭
- ISP_DATA=c; //把要写入字节赋给寄存器
- }
-
- /******************擦除扇区*****************************/
- void sector_erase(uint a)
- {
- ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH); //赋值地址高位
- ISP_ADDRL=0; //赋值低位
- ISP_CMD=ISP_CMD&0xf8; //清低3位
- ISP_CMD=ISP_CMD|ECOMMAND; //写入擦除命令
- goon(); //触发
- disable(); //关闭
- }
-
- /*******************写入调整好的数值数组到EEPROM******************/
- void write()
- {
- uchar *pa=0x2000; //定义指针变量地址是2000
- uchar x,y;
- table[0]=js_gz; //计时工作工作时间 (e)
- table[1]=js_jg; //计时间隔数值 (jsjg)
- table[2]=jisu; //计数数值 (jisu)
- table[3]=time2; //阀门开到位待待进,放料时间 (time)
- table[4]=ys1; //电机得电检测没到位时间 (ys)
- table[5]=fqwz2; //电机启动检测没离开位置时间 (fqwz)
- sector_erase(pa); //擦除2000地址扇区
- for(x=0;x<8;x++) //循环
- {
- write_byte(pa+x,table[x]); //把数组写入EEPROM里
- }
- disable(); //关ISP
- }
-
-
- /***********开机初始化阀门回关位置显示INI**************/
- void initia()
- {
- uchar a=4,x; //定义延时变量
- uchar *pa=0x2000; //定义指针变量并赋值为2000
- P3=0x0f; //把P3口初化下
- for(x=0;x<8;x++) //循环
- {
- table[x]=read_byte(pa+x); //读出EEPROM 2000以后连续数赋给数组
- }
- js_gz=table[0]; //把读出来数赋给计时工作变量
- js_jg=table[1]; //把读出来数赋给计时间隔变量
- jisu=table[2]; //把读出来数赋给计数变量
- time2=table[3]; //把读出来数赋给阀开到位进,放料等待变量
- ys1=table[4]; //把读出来数赋给检测电机得电多久没到位变量
- // fqwz2=table[5]; //把读出来数赋给检测电机得电多久位置没动变量
- fqwz2=5;//臨時測試
- while(a|((sfg&xfg)!=1)) //如果延时和上阀关下阀关都等于1
- {
- fmwz(); //检测阀门位置
- fled(); //阀门位置LED
- if(dj)a--; //阀门延时变量4秒--
- display(12,5); //显示I
- display(13,4); //显示N
- display(12,3); //显示I
- if(sfg!=1)sgq=1; //如果上阀没在关的位置,启动关上阀电机
- else sgq=0; //或者上阀关电机停
- if(xfg!=1)xgq=1; //如果下阀没在关的位置,启协关下阀电机
- else xgq=0; //或者下阀关电机停
- }
- }
-
- /********************显示错误码Error****************/
- void error()
- {
- display(15,6); //显示字符E
- display(10,5); //显示字符R
- display(10,4); //显示字符R
- display(11,3); //显示字符O
- display(10,2); //显示字符R
- cbz=1; //错误标志位
-
-
- // display(0xff,0x08); //全部不显示
- // delay(60); //延时
-
-
- }
- /************扫描错阀位置逻辑错误*****************/
- void scan_error()
- {
- if(sfk&sfg) error(); //如果上阀开,关到位信号同时来显示错误
- if(xfk&xfg) error(); //如果下阀开,关到位信号同时来显示错误
-
- if(skq) //上阀开电机启动
- {
- flag3=1; //置标志位FLAG3为1
- if(sfk&(ys>0))flag3=0; //如果上阀在开位和倒计时大于0成立,清FLAG3为0
- while(!sfk&(ys==0)) //如果过了设定延时,上开位还没到进行死循环
- {
- error(); //显示错误码
- if(err)skdw_led=~skdw_led; //上阀开到位LED灯闪烁
- skq=0; //关开上阀电机
- ys=0; //延时赋0
- if(!sfg)sgq=1; //如果上阀没在关的位置,关上阀电机启动
- else sgq=0; //或在关位置,停关上阀电机
- if(!xfg)xgq=1; //如果下阀没在关的位置,下阀关电机启动
- else xgq=0; //或者关下阀电机停止
- }
- }
- if(sgq) //上阀关电机启动
- {
- flag3=1; //置标志位FLAG3为1
- if(sfg&(ys>0))flag3=0; //如果上阀在关位和倒计时大于0成立,清FLAG3为0
- while(!sfg&(ys==0)) //如果过了设定延时,上关位还没到进行死循环
- {
- error(); //显示错误码
- if(err)sgdw_led=~sgdw_led; //上阀关到位LED灯闪烁
- sgq=0; //关上阀电机停
- ys=0; //延时赋0
- if(!sfg)sgq=1; //如果上阀没在关的位置,关上阀电机启动
- else sgq=0; //或在关位置,停关上阀电机
- if(!xfg)xgq=1; //如果下阀没在关的位置,下阀关电机启动
- else xgq=0; //或者关下阀电机停止
- }
- }
- if(xkq) //下阀开电机启动
- {
- flag3=1; //置标志位FLAG3为1
- if(xfk&(ys>0))flag3=0; //如果下阀在开位和倒计时大于0成立,清FLAG3为0
- if(xfk&(ys>0))flag3=0; //如果下阀在开位和倒计时大于0成立,清FLAG3为0
- while(!xfk&(ys==0)) //如果过了设定延时,下开位还没到进行死循环
- {
- error(); //显示错误码
- if(err)xkdw_led=~xkdw_led; //下阀开到位LED灯闪烁
- xkq=0; //关开下阀电机
- ys=0; //延时赋0
- if(!sfg)sgq=1; //如果上阀没在关的位置,关上阀电机启动
- else sgq=0; //或在关位置,停关上阀电机
- if(!xfg)xgq=1; //如果下阀没在关的位置,下阀关电机启动
- else xgq=0; //或者关下阀电机停止
- }
- }
- if(xgq) //下阀关电机启动
- {
- flag3=1; //置标志位FLAG3为1
- if(xfg&(ys>0))flag3=0; //如果下阀在关位和倒计时大于0成立,清FLAG3为0
- while(!xfg&(ys==0)) //如果过了设定延时,下关位还没到进行死循环
- {
- error(); //显示错误码
- if(err)xgdw_led=~xgdw_led; //下阀关到位LED灯闪烁
- xgq=0; //下关阀电机停
- ys=0; //延时赋0
- if(!sfg)sgq=1; //如果上阀没在关的位置,关上阀电机启动
- else sgq=0; //或在关位置,停关上阀电机
- if(!xfg)xgq=1; //如果下阀没在关的位置,下阀关电机启动
- else xgq=0; //或者关下阀电机停止
- }
- }
-
-
-
-
- if(skq) //如果上阀开电机得电,
- {
- flg2=1; //置倒计时标志位为1
- if(sfk)flg2=0; //如果上阀在开位置,倒计时标志位清0
- else //如果上阀没在开的位置
- {
- if((fqwz==0)&sfg) //倒计时数等于0时间到,上阀还在关的位置
-
- { sd1=1;
- while(sd1) //如果设定数为(内参)进行循环显示错误码
- {
- error(); //错误函数
- if(err)sgdw_led=~sgdw_led; //上关到位LED灯闪烁
- skq=0; //关上阀开电机
- }
- // if(err)sgdw_led=~sgdw_led; //如果设定(内参)为0只上关到位LED闪显示
- }
- }
- }
- if(sgq) //如果上阀关电机得电,
- {
- flg2=1; //置倒计时标志位为1
- if(sfg)flg2=0; //如果上阀在关位置,倒计时标志位清0
- else //如果上阀没在关的位置
- if((fqwz==0)&sfk) //倒计时数等于0时间到,上阀还在开的位置
- { sd1=1;
- while(sd1) //如果设定数为(内参)进行循环显示错误码
- {
- error(); //错误函数
- if(err)skdw_led=~skdw_led; //上开到位LED灯闪烁
- sgq=0; //关上阀关电机
- }
- // if(err)skdw_led=~skdw_led; //如果设定(内参)为0只上开到位LED闪显示
- }
-
- }
- if(xkq) //如果下阀开电机得电,
- {
- flg2=1; //置倒计时标志位为1
- if(xfk)flg2=0; //置倒计时标志位为1
- else if((fqwz==0)&xfg) //倒计时数等于0时间到,下阀还在关的位置
- { sd1=1;
- while(sd1) //如果设定数为(内参)进行循环显示错误码
- {
- error(); //错误函数
- if(err)xgdw_led=~xgdw_led; //下关到位LED灯闪烁
- xkq=0; //关下阀关电机
- }
- // if(err)xgdw_led=~xgdw_led; //如果设定(内参)为0只下关到位LED闪显示
- }
-
- }
- if(xgq) //如果下阀关电机得电,
- {
- flg2=1; //置倒计时标志位为1
- if(xfg)flg2=0; //置倒计时标志位为1
- else if((fqwz==0)&xfk) //倒计时数等于0时间到,下阀还在开的位置
- { sd1=1;
- while(sd1) //如果设定数为(内参)进行循环显示错误码
- {
- error(); //错误函数
- if(err)xkdw_led=~xkdw_led; //下开到位LED灯闪烁
- skq=0;
- } //关下阀开电机
- // if(err)xkdw_led=~xkdw_led; //如果设定(内参)为0只下开到位LED闪显示
- }
-
- }
- }
- /*************待机状态*************/
- void jsdaiji()
- {
- uchar a,b,c,d;
- a=js_jg/10; //计时间隔十位
- b=js_jg%10; //计时间隔个位
- c=js_gz/10;
- d=js_gz%10;
- if(dj) //如果变量DJ等于1
- {
- display(10,7); //显示R字符
- display(a,2); //显示间隔数字十位
- display(b,1); //显示间隔数字个位
- }
- else //或者变量DJ等于0
- {
- display(11,7);
- display(c,2); //显示工作时间0
- display(d,1); //显示工作时间
- }
- }
-
- /**********计时工作运行函数***************/
- void jsigzuo()
- {
-
- uchar a,b,c,d;
-
- yx_led=0; //运行灯点亮
- a=jsjg/10; //计时间隔十位
- b=jsjg%10; //计时间隔个位
- c=e/10;
- d=e%10;
- if(e<1) //计时工作倒计时小于1,计时间隔开始工作
- {
- flg=0; //计时工作减标志位置0
- if(jsjg==0) //如果计时间隔数值倒计时为0
- {
- e=js_gz; //把计时工作时间重新赋给E
- TR1=0; //关闭定时器1,停止计时间隔倒计时
- }
- if(dj)display(10,7); //每隔一秒闪一次显示间隔字符
- display(14,7); //点小数点
- display(a,2); //显示间隔时间
- display(b,1); //显示间隔时间
-
- if(xfg&sfg) //工作模式工作没完成,上下阀都在关
- {
- skq=0; //开上阀电机停
- xkq=0; //开下阀电机停
- sgq=0; //关上阀电机停
- xgq=0; //关下阀电机停
- }
- else
- {
- switch(x)
- {
- case 0: //状态等于0执行上阀开动作
- { if(sfk==0)skq=1; //如果上阀没要开位,上开阀电机得电启动
- else
- {
- skq=0; //或者上开阀电机停
- flg1=1; //阀开到位倒计时标志位
- if(time==1)x=1; //改状态为1 //上阀开到位,等待时间到
- }
- } break;
- case 1: //如果状态是1执行上阀关
- {
- flg1=0; //阀开到位倒计时标志位
- sgq=1; //上阀关电机启动
- if(sfg==1) //如果上阀关到位,上阀电机停
- {
- sgq=0; //上阀关电机启动
- x=3; //改状态为3
- }
- } break;
- case 3: //如果状态为3执行下阀开电机启动
-
- {
- if(xfk==0)xkq=1; //如果下阀没开到位下开电机得电
- else
- {
- xkq=0; //或下阀开到位,下阀开电机停
- flg1=1; //阀开到位倒计时标志位
- if(time==1)x=4; //等待时间到改状态字为4
- }
- }
- break;
- case 4: //状态字为4执行下阀关
- {
- flg1=0; //阀开到位倒计时标志位
- if(xfk==1) xgq=1; //如果状态为4下阀关电机启动
- if(xfg==1) // 如果下阀到关位置,
- {
- xgq=0; //下阀关电机停
- // z=0;
- x=0; //状态字改为0
- }
- }break;
- }
- }
- }
- if(e>=1) //计时工铁倒计时小于等于1,开始工作
- {
-
- flg=1; //置计时工作减标志为1
- if(dj)display(11,7); //每隔一秒闪一次显示工作字符
- display(14,7);
- display(c,2);
- display(d,1); //显示工作时间
- if(e==1) //如果计时工作变量倒计时等于1
- {
- jsjg=js_jg; //重新给计时间隔赋值
- TR1=1; //开定时器1,启动计时间隔减
-
- }
- switch(x)
- {
- case 0: //状态等于0执行上阀开动作
- { if(sfk==0)skq=1; //如果上阀没要开位,上开阀电机得电启动
- else
- {
- skq=0; //或者上开阀电机停
- flg1=1; //阀开到位倒计时标志位
- if(time==1)x=1; //改状态为1 //上阀开到位,等待时间到
- }
- } break;
- case 1: //如果状态是1执行上阀关
- {
- flg1=0; //阀开到位倒计时标志位
- sgq=1; //上阀关电机启动
- if(sfg==1) //如果上阀关到位,上阀电机停
- {
- sgq=0; //上阀关电机启动
- x=3; //改状态为3
- }
- } break;
- case 3: //如果状态为3执行下阀开电机启动
-
- {
- if(xfk==0)xkq=1; //如果下阀没开到位下开电机得电
- else
- {
- xkq=0; //或下阀开到位,下阀开电机停
- flg1=1; //阀开到位倒计时标志位
- if(time==1)x=4; //等待时间到改状态字为4
- }
- }
- break;
- case 4: //状态字为4执行下阀关
- {
- flg1=0; //阀开到位倒计时标志位
- if(xfk==1) xgq=1; //如果状态为4下阀关电机启动
- if(xfg==1) // 如果下阀到关位置,
- {
- xgq=0; //下阀关电机停
- // z=0;
- x=0; //状态字改为0
- }
- }break;
- }
- }
- }
-
- /*****************计数待机模式********************/
- void jsudaiji()
- {
- uchar a,b;
- a=jisu/10;
- b=jisu%10;
- display(16,7); //显示倒计数字符
- display(a,2); //显示倒计数字十位
- display(b,1); //显示倒计数数字个位
- }
- /****************计数模式运行函数*****************/
- void jsugzuo()
- {
- uchar a,b,c,d;
- a=jisu/10;
- b=jisu%10;
- yx_led=0; //运行灯点亮
- if(dj)display(16,7); //显示倒计数字符
- display(c,2); //显示倒计数字十位
- display(d,1); //显示倒计数数字个位
-
- }
-
- /************计时计数工作模式数值调整************/
- void jstz()
- {
- uchar a,b,c,d,e,f;
- if((ms==0)&(~qiting)&(seding==1)) //如果工作在计时待机模式,调整间隔数值
- {
- a=js_jg/10;
- b=js_jg%10;
-
- display(10,7); //显示R字符
- if(dj) //如果T0里计时变量DJ是1
- {
- display(a,2); //显示间隔数字十位
- display(b,1); //显示间隔数字个位
- }
- if(shang)js_jg++; //如果上按键按下,计时间隔变量加1
- if(xia)js_jg--; //如果下按键按下,计时间隔变量减1
- while(shang|xia) //检测等待上,下按键抬起
- {
- key_scan(); //循环扫描按键
- }
- }
- if((ms==0)&(~qiting)&(seding==2)) //如果工作在计时待机模式,调整计时工作数值
- {
- c=js_gz/10;
- d=js_gz%10;
- display(11,7); //显示o字符
- if(dj) //如果T0里计时变量DJ是1
- {
- display(c,2); //显示间隔数字十位
- display(d,1); //显示间隔数字个位
- }
- if(shang)js_gz++; //如果上按键按下,计时工作变量加1
- if(xia)js_gz--; //如果下按键按下,计时工作变量减1
- while(shang|xia) //等待上,下按键抬起
- {
- key_scan(); //循环扫按键
- }
- write(); //把修改后数值写入EEPROM
- }
- if((ms==1)&(~qiting)&(seding==1))//如果工作在计数待机模式,调整计数数值
- {
- e=jisu/10;
- f=jisu%10;
- display(16,7); //显示倒计数字符
- if(dj)
- {
- display(e,2); //显示倒计数字十位
- display(f,1); //显示倒计数数字个位
- }
- if(shang)jisu++; //如果上按键按下,计数变量加1
- if(xia)jisu--; //如果下按键按下,计数变量减1
- while(shang|xia) //检测等待上,下按键抬起
- {
- key_scan(); //循环扫描按键
- }
- write(); //把修改后数值写入EEPROM
- }
- }
- /*********定时器0初始化***********/
- void initime0()
- {
- TMOD=0X11; //开启定时器0
- TH0=(65536-45782)/256; //装初值
- TL0=(65536-45782)%256; //装初值
- TH1=(65536-45782)/256;
- TH0=(65536-45782)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- ET1=1;
- TR0=1;
- TR1=1; //启动定时器0
- time=time2; //阀门开到位等待时间赋值
- ys=ys1; //阀门电机得电多久没到位时间赋值
- }
- /****************计时,计数变量赋值*******************/
- void fz()
- {
-
- }
-
- void main()
- {
- // uchar d ,c; //定义变量
- initime0(); //定时器初始化
- initia(); //开机初始化
- while(1) //大循环
- {
-
- fmwz(); //阀门位置
- fled(); //阀门位置灯
- key_scan(); //键盘扫描
- if(cbz&rest)ISP_CONTR=0x20; //如果有错误复位按键按下
- // if((sfk&sfg)||(xfk&xfg)) //如果阀门位置有逻辑错误
- scan_error(); //检测阀位置逻辑错误
- // else
-
- {
- jstz(); //计时数值调整函数
- if((qiting==0)&(ms==0)&(seding==0)) //启停按钮,模式,设定都是0,执行待机程序
- {
- jsdaiji(); //计时待机
- jsjg=js_jg; //把设定的好的计时间隔时间传递给计时间隔变量
- e=js_gz;
- }
- if(qiting&(ms==0)) //启停按钮和计时模式都是1,执行计时程序
- {
- jsigzuo(); //计时工作函数
-
- }
- if((qiting==0)&(ms==1))jsudaiji(); //如果启停按钮和计数模式都是1,执行计数程序
- if(qiting&(ms==1)) jsugzuo(); //计数工作函数
- }
- }
- }
- /**********定时器0中断函数***************/
- void time0()interrupt 1
- {
- static a,er; //定义静态变量A
- TH0=(65536-45872)/256; //重新装初值
- TL0=(65536-45872)%256;
- a++; //变量A加1
- er++;
-
- if(er>=30)
- {
- er=0;
- err=~err; //错误显示如果ER变量中断大于等于30次
- }
- if(a>=20) //如果计满大于等于20次次
- {
- a=0; //A清0
- if(flg1)time--; //阀门开到位等待标志位是1,倒计时减1
- else time=time2; //如果阀门开到位标志位是0,重新把设定值赋给
- if(flag3)ys--; //如果阀电机得电标志位,几秒没到是1延时变量值减1
- else ys==ys1 ; //如果是0重新赋值
- dj=~dj; //变量DJ取反
- if(flg) //如果计时工作变量标志是1
- {
- e--; //计时工作变量E减1
- }
- if(flg2)fqwz--;
- else fqwz=fqwz2;
- }
- }
- /**********定时器1中断函数****************/
- void time1()interrupt 3
- {
- static b;
- TH1=(65536-45782)/256;
- TL1=(65536-45782)%256;
- b++; //中断一次B增加1
- if(b>=20) //如果中断20次就是一秒
- {
- b=0; //变量赋0
- jsjg--; //计时间隔变量减1
-
- }
- }
复制代码
|