



- #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
-
- }
- }
復制代碼
|