|




- #include <reg52.h>
- #define uchar unsigned char //宏定義uchar為無符型字節(jié)
- #define uint unsigned int //宏定義uint為無符型整數(shù)
- #define RCOMMAND 0x01 //宏定義讀命令
- #define WCOMMAND 0x02 //宏定義寫命令
- #define ECOMMAND 0x03 //宏定義擦寫命令
- #define WAITTIME 0x01
-
- sfr ISP_DATA=0xe2; //定義數(shù)據(jù)寄存器地址
- sfr ISP_ADDRH=0xe3; //定義地址寄存器地址高位
- sfr ISP_ADDRL=0xe4; //定義地址寄存器地址低位
- sfr ISP_CMD=0xe5; //定義命令寄存器地址
- sfr ISP_TRIG=0xe6; //定義觸發(fā)命令地址
- sfr ISP_CONTR=0xe7; //定義控制寄存器地址
-
- sbit duan=P1^6 ; //定義段選
- sbit wei=P1^7 ; //定義位選
-
- /*指示燈led*/
- sbit yx_led=P2^0; //運(yùn)行燈
- sbit jsms_led=P2^1; //計(jì)時(shí)燈
- sbit jsums_led=P2^2; //計(jì)數(shù)燈
- sbit sgdw_led=P2^3; // 上關(guān)到位燈
- sbit skdw_led=P2^4; // 上開到位燈
- sbit xgdw_led=P2^5; // 下關(guān)到位燈
- sbit xkdw_led=P2^6; // 下開到位燈
-
- /*按鈕*/
- sbit ms_key=P1^0; // 模式按鈕
- sbit shang_key=P1^1; // 向上鍵
- sbit seding_key=P1^2; // 設(shè)定按鈕
- sbit qiting_key=P1^3; // 啟停按鈕
- sbit xia_key=P1^4; // 向下按鈕
- sbit rest_key=P1^5; // 復(fù)位按鈕
-
- /*閥門位置信號(hào)*/
- sbit skdw_in=P3^0; // 上閥開到位信號(hào)
- sbit sgdw_in=P3^1; // 上閥關(guān)到位信號(hào)
- sbit xkdw_in=P3^2; // 下閥開到位信號(hào)
- sbit xgdw_in=P3^3; // 下閥關(guān)到位信號(hào)
-
- /*輸出啟動(dòng)電機(jī)*/
- sbit skq=P3^4; // 上閥電機(jī)開得電
- sbit sgq=P3^5; // 上閥電機(jī)關(guān)得電
- sbit xkq=P3^6; // 下閥電機(jī)開得電
- sbit xgq=P3^7; // 下閥電機(jī)關(guān)得電
-
- uchar table[8]; //定義字符數(shù)組存放EEPROM里存的變量,和調(diào)整后存入EEPROM里
-
- uchar ms,shang,xia,seding,qiting,rest,sfk,xfk,xfg,sfg,dj;
- uchar jsgz=1,flg,x,err; //計(jì)時(shí)間隔,計(jì)時(shí)工作時(shí)間 e工作數(shù) fl計(jì)時(shí)工作開始標(biāo)志
- 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 模式狀態(tài) shang按鈕上 xia按鈕下鍵 seding設(shè)定鍵值 qiting啟停鍵變量 rest復(fù)位鍵變量
- sfk上閥開 sfg上閥關(guān) xfk下閥開 xfg下閥關(guān) dj定時(shí)器延時(shí)標(biāo)志位
- jsgz計(jì)時(shí)工作 flg計(jì)時(shí)工作工作時(shí)間倒計(jì)時(shí)減標(biāo)志位 x閥位連續(xù)開關(guān)狀態(tài) err錯(cuò)誤時(shí)用閃爍
- e計(jì)時(shí)工作時(shí)間 jsjg計(jì)時(shí)工作間隔時(shí)間 time閥開到位等待進(jìn)放料時(shí)間
- time2閥門開到位等待時(shí)間存在E2ROM值 flg1閥開到位倒計(jì)時(shí)標(biāo)志位 flg2上下閥啟動(dòng)但位置信號(hào)不復(fù)位
- fqwz上下閥開關(guān)啟動(dòng)多久位置沒變化 fqwz2上下閥開關(guān)啟動(dòng)多久們沒變化設(shè)定值
- sd1設(shè)定有邏輯故障是否繼續(xù)工作 ys測(cè)試閥電機(jī)得電幾秒鐘沒到位 flag3閥電機(jī)得電沒到位標(biāo)志位倒計(jì)時(shí)
- ys1存EEPROM閥得電幾秒沒到位 js_jg能調(diào)整數(shù)值EEPROM存,賦給值 js_gz能調(diào)整數(shù)值EEPROM存,賦值
- jisu計(jì)數(shù)倒計(jì)數(shù)值 cbz錯(cuò)標(biāo)志位復(fù)位用
- //jisu time2 js_jg js_gz */
-
- /*led數(shù)碼管段選位選*/
- 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,} ;
-
- /**************毫秒延時(shí)函數(shù)*****************/
- void delay(unsigned int a)
- {
- unsigned int i,x;
- for(i=0;i<a;i++)
- for(x=0;x<110;x++);
- }
- /*********按鍵掃描函數(shù)************/
- void key_scan()
- {
- // uchar k; //定義變量返回值
- ms_key=1; //送高電平到模式位
- if(ms_key!=1) //檢測(cè)如果不等于高電平
- {
- delay(5); //延時(shí)
- if(ms_key!=1)
- ms=ms+1; // 確定,計(jì)時(shí)模0或計(jì)數(shù)模式1
- if(ms>=2)ms=0;
- while(ms_key!=1); //等侍按鍵抬起
- }
- // else ms=0; //如果還是低電平返回0
-
- if(shang_key!=1) //如果檢測(cè)上鍵不是高電平
- {
- delay(5); // 延時(shí)
- if(shang_key!=1)
- shang=1; //如果上鍵還是低電平返回1
- }
- else shang=0;
- if(seding_key!=1) //如果檢測(cè)設(shè)定不是高電平
- {
- delay(5); //延時(shí)
- if(seding_key!=1)
- seding++; //如果檢測(cè)設(shè)定還是低電平返回1
- if(seding>=3)seding=0;
- while(seding_key!=1);
- }
- if(qiting_key!=1) //檢測(cè)起動(dòng)按鈕如果是低電平
- {
- delay(5); //延時(shí)
- if(qiting_key!=1)
- qiting=1; //如果啟動(dòng)還是低電平返回1
- else qiting=0;
- }
- if(xia_key!=1) //如果下檢測(cè)是低電平
- {
- delay(5); //延時(shí)
- if(xia_key!=1)
- xia=1; //如果下不是低電平返回1
- }
- else xia=0;
- if(rest_key!=1) //檢測(cè)復(fù)位按鈕如果是低電平
- {
- delay(5); //延時(shí)
- if(rest_key!=1)
- rest=1; //如果復(fù)位按鈕還是低電平返回1
- else rest=0;
- }
- }
- /********閥門位置掃描***********/
- void fmwz()
- {
- if(skdw_in!=1) // 測(cè)試如果上閥在開的位置
- {
- delay(5); //延時(shí)
- if(skdw_in!=1)
- sfk=1; //上閥如果真的在開的位置SF復(fù)位0
- }
- else sfk=0;
- if(sgdw_in!=1) // 測(cè)試如果上閥在關(guān)的位置
- {
- delay(5); //延時(shí)
- if(sgdw_in!=1)
- sfg=1; //上閥如果真的在關(guān)的位置SF置位1
- }
- else sfg=0;
- if(xkdw_in!=1) //測(cè)試如果下閥在開的位置
- {
- delay(5); //延時(shí)
- if(xkdw_in!=1)
- xfk=1; //如果下閥還在開的位置,復(fù)位XF為0
- }
- else xfk=0;
- if(xgdw_in!=1) // 測(cè)試如果下閥在關(guān)的位置
- {
- delay(5); //延時(shí)
- if(xgdw_in!=1)
- xfg=1;
- //如果下閥還是在關(guān)位置,置XF為1
- }
- else xfg=0;
- }
- /************閥門位置指示燈****************************/
- void fled()
- {
- sgdw_led=!sfg; //上閥在關(guān)的位置,上關(guān)到位燈亮
- skdw_led=!sfk; //上閥在開的位置,上開到位燈亮
- xgdw_led=!xfg; //下閥在關(guān)的位置,下關(guān)到位燈亮
- xkdw_led=!xfk; //下閥在開的位置,下開到位燈亮
- if(ms) //如果模式是不是0
- {
- jsums_led=0; //計(jì)數(shù)LED燈亮
- jsms_led=1; //計(jì)時(shí)模式LED燈滅
- }
- else //如果模式是0
- {
- jsms_led=0; //計(jì)時(shí)LED燈亮
- jsums_led=1; //計(jì)數(shù)LED燈滅
- }
- }
- /****************顯示數(shù)碼管函數(shù)*********************/
- void display(uchar a,uchar b)
- {
- duan=1; //開段選
- P0=dm[a]; //段碼給P0口
- duan=0; //關(guān)段選
- wei=1; //開位選
- P0=wm[b]; //位碼給P0口
- wei=0; //關(guān)位選
- P0=0xff; //消隱
- delay(2);
- }
-
- /**************ISP使能**********************************/
- void enable()
- { //關(guān)閉總中斷
- EA=0;
- ISP_CONTR=ISP_CONTR|WAITTIME; //寫入硬件等待時(shí)間
- ISP_CONTR|=0x80; //啟動(dòng)ISP
- }
-
- /***************ISP 禁止*******************************/
- void disable()
- {
- ISP_CONTR=ISP_CONTR&0x7f; //關(guān)閉ISP
- ISP_TRIG=0x00; //清0
- EA=1; //開總中斷
- }
-
- /*******************觸發(fā)********************************/
- void goon()
- {
- enable();
- ISP_TRIG|=0x46;
- ISP_TRIG|=0xb9;
- }
-
- /******************讀一個(gè)字節(jié)**************************/
- 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(); //觸發(fā)
- disable(); //關(guān)閉
- return ISP_DATA; //返回讀出數(shù)據(jù)
- }
-
- /*****************寫一個(gè)字節(jié)****************************/
- 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(); //觸發(fā)
- // disable(); //關(guān)閉
- ISP_DATA=c; //把要寫入字節(jié)賦給寄存器
- }
-
- /******************擦除扇區(qū)*****************************/
- 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(); //觸發(fā)
- disable(); //關(guān)閉
- }
-
- /*******************寫入調(diào)整好的數(shù)值數(shù)組到EEPROM******************/
- void write()
- {
- uchar *pa=0x2000; //定義指針變量地址是2000
- uchar x,y;
- table[0]=js_gz; //計(jì)時(shí)工作工作時(shí)間 (e)
- table[1]=js_jg; //計(jì)時(shí)間隔數(shù)值 (jsjg)
- table[2]=jisu; //計(jì)數(shù)數(shù)值 (jisu)
- table[3]=time2; //閥門開到位待待進(jìn),放料時(shí)間 (time)
- table[4]=ys1; //電機(jī)得電檢測(cè)沒到位時(shí)間 (ys)
- table[5]=fqwz2; //電機(jī)啟動(dòng)檢測(cè)沒離開位置時(shí)間 (fqwz)
- sector_erase(pa); //擦除2000地址扇區(qū)
- for(x=0;x<8;x++) //循環(huán)
- {
- write_byte(pa+x,table[x]); //把數(shù)組寫入EEPROM里
- }
- disable(); //關(guān)ISP
- }
-
-
- /***********開機(jī)初始化閥門回關(guān)位置顯示INI**************/
- void initia()
- {
- uchar a=4,x; //定義延時(shí)變量
- uchar *pa=0x2000; //定義指針變量并賦值為2000
- P3=0x0f; //把P3口初化下
- for(x=0;x<8;x++) //循環(huán)
- {
- table[x]=read_byte(pa+x); //讀出EEPROM 2000以后連續(xù)數(shù)賦給數(shù)組
- }
- js_gz=table[0]; //把讀出來數(shù)賦給計(jì)時(shí)工作變量
- js_jg=table[1]; //把讀出來數(shù)賦給計(jì)時(shí)間隔變量
- jisu=table[2]; //把讀出來數(shù)賦給計(jì)數(shù)變量
- time2=table[3]; //把讀出來數(shù)賦給閥開到位進(jìn),放料等待變量
- ys1=table[4]; //把讀出來數(shù)賦給檢測(cè)電機(jī)得電多久沒到位變量
- // fqwz2=table[5]; //把讀出來數(shù)賦給檢測(cè)電機(jī)得電多久位置沒動(dòng)變量
- fqwz2=5;//臨時(shí)測(cè)試
- while(a|((sfg&xfg)!=1)) //如果延時(shí)和上閥關(guān)下閥關(guān)都等于1
- {
- fmwz(); //檢測(cè)閥門位置
- fled(); //閥門位置LED
- if(dj)a--; //閥門延時(shí)變量4秒--
- display(12,5); //顯示I
- display(13,4); //顯示N
- display(12,3); //顯示I
- if(sfg!=1)sgq=1; //如果上閥沒在關(guān)的位置,啟動(dòng)關(guān)上閥電機(jī)
- else sgq=0; //或者上閥關(guān)電機(jī)停
- if(xfg!=1)xgq=1; //如果下閥沒在關(guān)的位置,啟協(xié)關(guān)下閥電機(jī)
- else xgq=0; //或者下閥關(guān)電機(jī)停
- }
- }
-
- /********************顯示錯(cuò)誤碼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; //錯(cuò)誤標(biāo)志位
-
-
- // display(0xff,0x08); //全部不顯示
- // delay(60); //延時(shí)
-
-
- }
- /************掃描錯(cuò)閥位置邏輯錯(cuò)誤*****************/
- void scan_error()
- {
- if(sfk&sfg) error(); //如果上閥開,關(guān)到位信號(hào)同時(shí)來顯示錯(cuò)誤
- if(xfk&xfg) error(); //如果下閥開,關(guān)到位信號(hào)同時(shí)來顯示錯(cuò)誤
-
- if(skq) //上閥開電機(jī)啟動(dòng)
- {
- flag3=1; //置標(biāo)志位FLAG3為1
- if(sfk&(ys>0))flag3=0; //如果上閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0
- while(!sfk&(ys==0)) //如果過了設(shè)定延時(shí),上開位還沒到進(jìn)行死循環(huán)
- {
- error(); //顯示錯(cuò)誤碼
- if(err)skdw_led=~skdw_led; //上閥開到位LED燈閃爍
- skq=0; //關(guān)開上閥電機(jī)
- ys=0; //延時(shí)賦0
- if(!sfg)sgq=1; //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)
- else sgq=0; //或在關(guān)位置,停關(guān)上閥電機(jī)
- if(!xfg)xgq=1; //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)
- else xgq=0; //或者關(guān)下閥電機(jī)停止
- }
- }
- if(sgq) //上閥關(guān)電機(jī)啟動(dòng)
- {
- flag3=1; //置標(biāo)志位FLAG3為1
- if(sfg&(ys>0))flag3=0; //如果上閥在關(guān)位和倒計(jì)時(shí)大于0成立,清FLAG3為0
- while(!sfg&(ys==0)) //如果過了設(shè)定延時(shí),上關(guān)位還沒到進(jìn)行死循環(huán)
- {
- error(); //顯示錯(cuò)誤碼
- if(err)sgdw_led=~sgdw_led; //上閥關(guān)到位LED燈閃爍
- sgq=0; //關(guān)上閥電機(jī)停
- ys=0; //延時(shí)賦0
- if(!sfg)sgq=1; //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)
- else sgq=0; //或在關(guān)位置,停關(guān)上閥電機(jī)
- if(!xfg)xgq=1; //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)
- else xgq=0; //或者關(guān)下閥電機(jī)停止
- }
- }
- if(xkq) //下閥開電機(jī)啟動(dòng)
- {
- flag3=1; //置標(biāo)志位FLAG3為1
- if(xfk&(ys>0))flag3=0; //如果下閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0
- if(xfk&(ys>0))flag3=0; //如果下閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0
- while(!xfk&(ys==0)) //如果過了設(shè)定延時(shí),下開位還沒到進(jìn)行死循環(huán)
- {
- error(); //顯示錯(cuò)誤碼
- if(err)xkdw_led=~xkdw_led; //下閥開到位LED燈閃爍
- xkq=0; //關(guān)開下閥電機(jī)
- ys=0; //延時(shí)賦0
- if(!sfg)sgq=1; //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)
- else sgq=0; //或在關(guān)位置,停關(guān)上閥電機(jī)
- if(!xfg)xgq=1; //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)
- else xgq=0; //或者關(guān)下閥電機(jī)停止
- }
- }
- if(xgq) //下閥關(guān)電機(jī)啟動(dòng)
- {
- flag3=1; //置標(biāo)志位FLAG3為1
- if(xfg&(ys>0))flag3=0; //如果下閥在關(guān)位和倒計(jì)時(shí)大于0成立,清FLAG3為0
- while(!xfg&(ys==0)) //如果過了設(shè)定延時(shí),下關(guān)位還沒到進(jìn)行死循環(huán)
- {
- error(); //顯示錯(cuò)誤碼
- if(err)xgdw_led=~xgdw_led; //下閥關(guān)到位LED燈閃爍
- xgq=0; //下關(guān)閥電機(jī)停
- ys=0; //延時(shí)賦0
- if(!sfg)sgq=1; //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)
- else sgq=0; //或在關(guān)位置,停關(guān)上閥電機(jī)
- if(!xfg)xgq=1; //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)
- else xgq=0; //或者關(guān)下閥電機(jī)停止
- }
- }
-
-
-
-
- if(skq) //如果上閥開電機(jī)得電,
- {
- flg2=1; //置倒計(jì)時(shí)標(biāo)志位為1
- if(sfk)flg2=0; //如果上閥在開位置,倒計(jì)時(shí)標(biāo)志位清0
- else //如果上閥沒在開的位置
- {
- if((fqwz==0)&sfg) //倒計(jì)時(shí)數(shù)等于0時(shí)間到,上閥還在關(guān)的位置
-
- { sd1=1;
- while(sd1) //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼
- {
- error(); //錯(cuò)誤函數(shù)
- if(err)sgdw_led=~sgdw_led; //上關(guān)到位LED燈閃爍
- skq=0; //關(guān)上閥開電機(jī)
- }
- // if(err)sgdw_led=~sgdw_led; //如果設(shè)定(內(nèi)參)為0只上關(guān)到位LED閃顯示
- }
- }
- }
- if(sgq) //如果上閥關(guān)電機(jī)得電,
- {
- flg2=1; //置倒計(jì)時(shí)標(biāo)志位為1
- if(sfg)flg2=0; //如果上閥在關(guān)位置,倒計(jì)時(shí)標(biāo)志位清0
- else //如果上閥沒在關(guān)的位置
- if((fqwz==0)&sfk) //倒計(jì)時(shí)數(shù)等于0時(shí)間到,上閥還在開的位置
- { sd1=1;
- while(sd1) //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼
- {
- error(); //錯(cuò)誤函數(shù)
- if(err)skdw_led=~skdw_led; //上開到位LED燈閃爍
- sgq=0; //關(guān)上閥關(guān)電機(jī)
- }
- // if(err)skdw_led=~skdw_led; //如果設(shè)定(內(nèi)參)為0只上開到位LED閃顯示
- }
-
- }
- if(xkq) //如果下閥開電機(jī)得電,
- {
- flg2=1; //置倒計(jì)時(shí)標(biāo)志位為1
- if(xfk)flg2=0; //置倒計(jì)時(shí)標(biāo)志位為1
- else if((fqwz==0)&xfg) //倒計(jì)時(shí)數(shù)等于0時(shí)間到,下閥還在關(guān)的位置
- { sd1=1;
- while(sd1) //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼
- {
- error(); //錯(cuò)誤函數(shù)
- if(err)xgdw_led=~xgdw_led; //下關(guān)到位LED燈閃爍
- xkq=0; //關(guān)下閥關(guān)電機(jī)
- }
- // if(err)xgdw_led=~xgdw_led; //如果設(shè)定(內(nèi)參)為0只下關(guān)到位LED閃顯示
- }
-
- }
- if(xgq) //如果下閥關(guān)電機(jī)得電,
- {
- flg2=1; //置倒計(jì)時(shí)標(biāo)志位為1
- if(xfg)flg2=0; //置倒計(jì)時(shí)標(biāo)志位為1
- else if((fqwz==0)&xfk) //倒計(jì)時(shí)數(shù)等于0時(shí)間到,下閥還在開的位置
- { sd1=1;
- while(sd1) //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼
- {
- error(); //錯(cuò)誤函數(shù)
- if(err)xkdw_led=~xkdw_led; //下開到位LED燈閃爍
- skq=0;
- } //關(guān)下閥開電機(jī)
- // if(err)xkdw_led=~xkdw_led; //如果設(shè)定(內(nèi)參)為0只下開到位LED閃顯示
- }
-
- }
- }
- /*************待機(jī)狀態(tài)*************/
- void jsdaiji()
- {
- uchar a,b,c,d;
- a=js_jg/10; //計(jì)時(shí)間隔十位
- b=js_jg%10; //計(jì)時(shí)間隔個(gè)位
- c=js_gz/10;
- d=js_gz%10;
- if(dj) //如果變量DJ等于1
- {
- display(10,7); //顯示R字符
- display(a,2); //顯示間隔數(shù)字十位
- display(b,1); //顯示間隔數(shù)字個(gè)位
- }
- else //或者變量DJ等于0
- {
- display(11,7);
- display(c,2); //顯示工作時(shí)間0
- display(d,1); //顯示工作時(shí)間
- }
- }
-
- /**********計(jì)時(shí)工作運(yùn)行函數(shù)***************/
- void jsigzuo()
- {
-
- uchar a,b,c,d;
-
- yx_led=0; //運(yùn)行燈點(diǎn)亮
- a=jsjg/10; //計(jì)時(shí)間隔十位
- b=jsjg%10; //計(jì)時(shí)間隔個(gè)位
- c=e/10;
- d=e%10;
- if(e<1) //計(jì)時(shí)工作倒計(jì)時(shí)小于1,計(jì)時(shí)間隔開始工作
- {
- flg=0; //計(jì)時(shí)工作減標(biāo)志位置0
- if(jsjg==0) //如果計(jì)時(shí)間隔數(shù)值倒計(jì)時(shí)為0
- {
- e=js_gz; //把計(jì)時(shí)工作時(shí)間重新賦給E
- TR1=0; //關(guān)閉定時(shí)器1,停止計(jì)時(shí)間隔倒計(jì)時(shí)
- }
- if(dj)display(10,7); //每隔一秒閃一次顯示間隔字符
- display(14,7); //點(diǎn)小數(shù)點(diǎn)
- display(a,2); //顯示間隔時(shí)間
- display(b,1); //顯示間隔時(shí)間
-
- if(xfg&sfg) //工作模式工作沒完成,上下閥都在關(guān)
- {
- skq=0; //開上閥電機(jī)停
- xkq=0; //開下閥電機(jī)停
- sgq=0; //關(guān)上閥電機(jī)停
- xgq=0; //關(guān)下閥電機(jī)停
- }
- else
- {
- switch(x)
- {
- case 0: //狀態(tài)等于0執(zhí)行上閥開動(dòng)作
- { if(sfk==0)skq=1; //如果上閥沒要開位,上開閥電機(jī)得電啟動(dòng)
- else
- {
- skq=0; //或者上開閥電機(jī)停
- flg1=1; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(time==1)x=1; //改狀態(tài)為1 //上閥開到位,等待時(shí)間到
- }
- } break;
- case 1: //如果狀態(tài)是1執(zhí)行上閥關(guān)
- {
- flg1=0; //閥開到位倒計(jì)時(shí)標(biāo)志位
- sgq=1; //上閥關(guān)電機(jī)啟動(dòng)
- if(sfg==1) //如果上閥關(guān)到位,上閥電機(jī)停
- {
- sgq=0; //上閥關(guān)電機(jī)啟動(dòng)
- x=3; //改狀態(tài)為3
- }
- } break;
- case 3: //如果狀態(tài)為3執(zhí)行下閥開電機(jī)啟動(dòng)
-
- {
- if(xfk==0)xkq=1; //如果下閥沒開到位下開電機(jī)得電
- else
- {
- xkq=0; //或下閥開到位,下閥開電機(jī)停
- flg1=1; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(time==1)x=4; //等待時(shí)間到改狀態(tài)字為4
- }
- }
- break;
- case 4: //狀態(tài)字為4執(zhí)行下閥關(guān)
- {
- flg1=0; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(xfk==1) xgq=1; //如果狀態(tài)為4下閥關(guān)電機(jī)啟動(dòng)
- if(xfg==1) // 如果下閥到關(guān)位置,
- {
- xgq=0; //下閥關(guān)電機(jī)停
- // z=0;
- x=0; //狀態(tài)字改為0
- }
- }break;
- }
- }
- }
- if(e>=1) //計(jì)時(shí)工鐵倒計(jì)時(shí)小于等于1,開始工作
- {
-
- flg=1; //置計(jì)時(shí)工作減標(biāo)志為1
- if(dj)display(11,7); //每隔一秒閃一次顯示工作字符
- display(14,7);
- display(c,2);
- display(d,1); //顯示工作時(shí)間
- if(e==1) //如果計(jì)時(shí)工作變量倒計(jì)時(shí)等于1
- {
- jsjg=js_jg; //重新給計(jì)時(shí)間隔賦值
- TR1=1; //開定時(shí)器1,啟動(dòng)計(jì)時(shí)間隔減
-
- }
- switch(x)
- {
- case 0: //狀態(tài)等于0執(zhí)行上閥開動(dòng)作
- { if(sfk==0)skq=1; //如果上閥沒要開位,上開閥電機(jī)得電啟動(dòng)
- else
- {
- skq=0; //或者上開閥電機(jī)停
- flg1=1; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(time==1)x=1; //改狀態(tài)為1 //上閥開到位,等待時(shí)間到
- }
- } break;
- case 1: //如果狀態(tài)是1執(zhí)行上閥關(guān)
- {
- flg1=0; //閥開到位倒計(jì)時(shí)標(biāo)志位
- sgq=1; //上閥關(guān)電機(jī)啟動(dòng)
- if(sfg==1) //如果上閥關(guān)到位,上閥電機(jī)停
- {
- sgq=0; //上閥關(guān)電機(jī)啟動(dòng)
- x=3; //改狀態(tài)為3
- }
- } break;
- case 3: //如果狀態(tài)為3執(zhí)行下閥開電機(jī)啟動(dòng)
-
- {
- if(xfk==0)xkq=1; //如果下閥沒開到位下開電機(jī)得電
- else
- {
- xkq=0; //或下閥開到位,下閥開電機(jī)停
- flg1=1; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(time==1)x=4; //等待時(shí)間到改狀態(tài)字為4
- }
- }
- break;
- case 4: //狀態(tài)字為4執(zhí)行下閥關(guān)
- {
- flg1=0; //閥開到位倒計(jì)時(shí)標(biāo)志位
- if(xfk==1) xgq=1; //如果狀態(tài)為4下閥關(guān)電機(jī)啟動(dòng)
- if(xfg==1) // 如果下閥到關(guān)位置,
- {
- xgq=0; //下閥關(guān)電機(jī)停
- // z=0;
- x=0; //狀態(tài)字改為0
- }
- }break;
- }
- }
- }
-
- /*****************計(jì)數(shù)待機(jī)模式********************/
- void jsudaiji()
- {
- uchar a,b;
- a=jisu/10;
- b=jisu%10;
- display(16,7); //顯示倒計(jì)數(shù)字符
- display(a,2); //顯示倒計(jì)數(shù)字十位
- display(b,1); //顯示倒計(jì)數(shù)數(shù)字個(gè)位
- }
- /****************計(jì)數(shù)模式運(yùn)行函數(shù)*****************/
- void jsugzuo()
- {
- uchar a,b,c,d;
- a=jisu/10;
- b=jisu%10;
- yx_led=0; //運(yùn)行燈點(diǎn)亮
- if(dj)display(16,7); //顯示倒計(jì)數(shù)字符
- display(c,2); //顯示倒計(jì)數(shù)字十位
- display(d,1); //顯示倒計(jì)數(shù)數(shù)字個(gè)位
-
- }
-
- /************計(jì)時(shí)計(jì)數(shù)工作模式數(shù)值調(diào)整************/
- void jstz()
- {
- uchar a,b,c,d,e,f;
- if((ms==0)&(~qiting)&(seding==1)) //如果工作在計(jì)時(shí)待機(jī)模式,調(diào)整間隔數(shù)值
- {
- a=js_jg/10;
- b=js_jg%10;
-
- display(10,7); //顯示R字符
- if(dj) //如果T0里計(jì)時(shí)變量DJ是1
- {
- display(a,2); //顯示間隔數(shù)字十位
- display(b,1); //顯示間隔數(shù)字個(gè)位
- }
- if(shang)js_jg++; //如果上按鍵按下,計(jì)時(shí)間隔變量加1
- if(xia)js_jg--; //如果下按鍵按下,計(jì)時(shí)間隔變量減1
- while(shang|xia) //檢測(cè)等待上,下按鍵抬起
- {
- key_scan(); //循環(huán)掃描按鍵
- }
- }
- if((ms==0)&(~qiting)&(seding==2)) //如果工作在計(jì)時(shí)待機(jī)模式,調(diào)整計(jì)時(shí)工作數(shù)值
- {
- c=js_gz/10;
- d=js_gz%10;
- display(11,7); //顯示o字符
- if(dj) //如果T0里計(jì)時(shí)變量DJ是1
- {
- display(c,2); //顯示間隔數(shù)字十位
- display(d,1); //顯示間隔數(shù)字個(gè)位
- }
- if(shang)js_gz++; //如果上按鍵按下,計(jì)時(shí)工作變量加1
- if(xia)js_gz--; //如果下按鍵按下,計(jì)時(shí)工作變量減1
- while(shang|xia) //等待上,下按鍵抬起
- {
- key_scan(); //循環(huán)掃按鍵
- }
- write(); //把修改后數(shù)值寫入EEPROM
- }
- if((ms==1)&(~qiting)&(seding==1))//如果工作在計(jì)數(shù)待機(jī)模式,調(diào)整計(jì)數(shù)數(shù)值
- {
- e=jisu/10;
- f=jisu%10;
- display(16,7); //顯示倒計(jì)數(shù)字符
- if(dj)
- {
- display(e,2); //顯示倒計(jì)數(shù)字十位
- display(f,1); //顯示倒計(jì)數(shù)數(shù)字個(gè)位
- }
- if(shang)jisu++; //如果上按鍵按下,計(jì)數(shù)變量加1
- if(xia)jisu--; //如果下按鍵按下,計(jì)數(shù)變量減1
- while(shang|xia) //檢測(cè)等待上,下按鍵抬起
- {
- key_scan(); //循環(huán)掃描按鍵
- }
- write(); //把修改后數(shù)值寫入EEPROM
- }
- }
- /*********定時(shí)器0初始化***********/
- void initime0()
- {
- TMOD=0X11; //開啟定時(shí)器0
- TH0=(65536-45782)/256; //裝初值
- TL0=(65536-45782)%256; //裝初值
- TH1=(65536-45782)/256;
- TH0=(65536-45782)%256;
- EA=1; //開總中斷
- ET0=1; //開定時(shí)器0中斷
- ET1=1;
- TR0=1;
- TR1=1; //啟動(dòng)定時(shí)器0
- time=time2; //閥門開到位等待時(shí)間賦值
- ys=ys1; //閥門電機(jī)得電多久沒到位時(shí)間賦值
- }
- /****************計(jì)時(shí),計(jì)數(shù)變量賦值*******************/
- void fz()
- {
-
- }
-
- void main()
- {
- // uchar d ,c; //定義變量
- initime0(); //定時(shí)器初始化
- initia(); //開機(jī)初始化
- while(1) //大循環(huán)
- {
-
- fmwz(); //閥門位置
- fled(); //閥門位置燈
- key_scan(); //鍵盤掃描
- if(cbz&rest)ISP_CONTR=0x20; //如果有錯(cuò)誤復(fù)位按鍵按下
- // if((sfk&sfg)||(xfk&xfg)) //如果閥門位置有邏輯錯(cuò)誤
- scan_error(); //檢測(cè)閥位置邏輯錯(cuò)誤
- // else
-
- {
- jstz(); //計(jì)時(shí)數(shù)值調(diào)整函數(shù)
- if((qiting==0)&(ms==0)&(seding==0)) //啟停按鈕,模式,設(shè)定都是0,執(zhí)行待機(jī)程序
- {
- jsdaiji(); //計(jì)時(shí)待機(jī)
- jsjg=js_jg; //把設(shè)定的好的計(jì)時(shí)間隔時(shí)間傳遞給計(jì)時(shí)間隔變量
- e=js_gz;
- }
- if(qiting&(ms==0)) //啟停按鈕和計(jì)時(shí)模式都是1,執(zhí)行計(jì)時(shí)程序
- {
- jsigzuo(); //計(jì)時(shí)工作函數(shù)
-
- }
- if((qiting==0)&(ms==1))jsudaiji(); //如果啟停按鈕和計(jì)數(shù)模式都是1,執(zhí)行計(jì)數(shù)程序
- if(qiting&(ms==1)) jsugzuo(); //計(jì)數(shù)工作函數(shù)
- }
- }
- }
- /**********定時(shí)器0中斷函數(shù)***************/
- void time0()interrupt 1
- {
- static a,er; //定義靜態(tài)變量A
- TH0=(65536-45872)/256; //重新裝初值
- TL0=(65536-45872)%256;
- a++; //變量A加1
- er++;
-
- if(er>=30)
- {
- er=0;
- err=~err; //錯(cuò)誤顯示如果ER變量中斷大于等于30次
- }
- if(a>=20) //如果計(jì)滿大于等于20次次
- {
- a=0; //A清0
- if(flg1)time--; //閥門開到位等待標(biāo)志位是1,倒計(jì)時(shí)減1
- else time=time2; //如果閥門開到位標(biāo)志位是0,重新把設(shè)定值賦給
- if(flag3)ys--; //如果閥電機(jī)得電標(biāo)志位,幾秒沒到是1延時(shí)變量值減1
- else ys==ys1 ; //如果是0重新賦值
- dj=~dj; //變量DJ取反
- if(flg) //如果計(jì)時(shí)工作變量標(biāo)志是1
- {
- e--; //計(jì)時(shí)工作變量E減1
- }
- if(flg2)fqwz--;
- else fqwz=fqwz2;
- }
- }
- /**********定時(shí)器1中斷函數(shù)****************/
- 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--; //計(jì)時(shí)間隔變量減1
-
- }
- }
復(fù)制代碼
|
|