找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4176|回復(fù): 0
收起左側(cè)

PROTEUS 雙層卸灰閥仿真

[復(fù)制鏈接]
ID:72519 發(fā)表于 2015-1-21 21:31 | 顯示全部樓層 |閱讀模式








  1. #include <reg52.h>

  2. #define uchar unsigned char                 //宏定義uchar為無符型字節(jié)

  3. #define uint unsigned int                 //宏定義uint為無符型整數(shù)

  4. #define RCOMMAND 0x01                        //宏定義讀命令

  5. #define WCOMMAND 0x02                        //宏定義寫命令

  6. #define ECOMMAND 0x03                        //宏定義擦寫命令

  7. #define WAITTIME 0x01



  8. sfr ISP_DATA=0xe2;                               //定義數(shù)據(jù)寄存器地址

  9. sfr ISP_ADDRH=0xe3;                               //定義地址寄存器地址高位

  10. sfr ISP_ADDRL=0xe4;                               //定義地址寄存器地址低位

  11. sfr ISP_CMD=0xe5;                               //定義命令寄存器地址

  12. sfr ISP_TRIG=0xe6;                               //定義觸發(fā)命令地址

  13. sfr ISP_CONTR=0xe7;                               //定義控制寄存器地址



  14. sbit duan=P1^6 ;              //定義段選

  15. sbit wei=P1^7  ;              //定義位選



  16.        /*指示燈led*/

  17. sbit yx_led=P2^0;          //運(yùn)行燈

  18. sbit jsms_led=P2^1;   //計(jì)時(shí)燈

  19. sbit jsums_led=P2^2;  //計(jì)數(shù)燈

  20. sbit sgdw_led=P2^3;   // 上關(guān)到位燈

  21. sbit skdw_led=P2^4;   // 上開到位燈

  22. sbit xgdw_led=P2^5;   //  下關(guān)到位燈

  23. sbit xkdw_led=P2^6;  //       下開到位燈



  24. /*按鈕*/

  25. sbit ms_key=P1^0;         //       模式按鈕

  26. sbit shang_key=P1^1;  //       向上鍵

  27. sbit seding_key=P1^2;       //       設(shè)定按鈕

  28. sbit qiting_key=P1^3;       //       啟停按鈕

  29. sbit xia_key=P1^4;          //       向下按鈕

  30. sbit rest_key=P1^5;  //       復(fù)位按鈕



  31.    /*閥門位置信號(hào)*/

  32. sbit skdw_in=P3^0;   //    上閥開到位信號(hào)

  33. sbit sgdw_in=P3^1;   //  上閥關(guān)到位信號(hào)

  34. sbit xkdw_in=P3^2;         //    下閥開到位信號(hào)

  35. sbit xgdw_in=P3^3;   //    下閥關(guān)到位信號(hào)



  36. /*輸出啟動(dòng)電機(jī)*/

  37. sbit skq=P3^4;       //    上閥電機(jī)開得電

  38. sbit sgq=P3^5;       //    上閥電機(jī)關(guān)得電

  39. sbit xkq=P3^6;       //    下閥電機(jī)開得電

  40. sbit xgq=P3^7;       //    下閥電機(jī)關(guān)得電



  41. uchar table[8];         //定義字符數(shù)組存放EEPROM里存的變量,和調(diào)整后存入EEPROM里



  42. uchar ms,shang,xia,seding,qiting,rest,sfk,xfk,xfg,sfg,dj;

  43. uchar jsgz=1,flg,x,err;                     //計(jì)時(shí)間隔,計(jì)時(shí)工作時(shí)間 e工作數(shù) fl計(jì)時(shí)工作開始標(biāo)志

  44. uchar js_jg=10,js_gz=20,jsu_cs,un,jisu;

  45. char e,jsjg,time,time2=3,flg1,flg2,fqwz,fqwz2=3,sd1,ys,ys1=5,flag3,cbz;

  46. /******************變量名稱***************************

  47. ms 模式狀態(tài)  shang按鈕上  xia按鈕下鍵   seding設(shè)定鍵值  qiting啟停鍵變量   rest復(fù)位鍵變量

  48. sfk上閥開  sfg上閥關(guān)   xfk下閥開  xfg下閥關(guān)   dj定時(shí)器延時(shí)標(biāo)志位

  49. jsgz計(jì)時(shí)工作   flg計(jì)時(shí)工作工作時(shí)間倒計(jì)時(shí)減標(biāo)志位  x閥位連續(xù)開關(guān)狀態(tài)    err錯(cuò)誤時(shí)用閃爍

  50. e計(jì)時(shí)工作時(shí)間     jsjg計(jì)時(shí)工作間隔時(shí)間   time閥開到位等待進(jìn)放料時(shí)間   

  51. time2閥門開到位等待時(shí)間存在E2ROM值   flg1閥開到位倒計(jì)時(shí)標(biāo)志位    flg2上下閥啟動(dòng)但位置信號(hào)不復(fù)位

  52. fqwz上下閥開關(guān)啟動(dòng)多久位置沒變化       fqwz2上下閥開關(guān)啟動(dòng)多久們沒變化設(shè)定值

  53. sd1設(shè)定有邏輯故障是否繼續(xù)工作          ys測(cè)試閥電機(jī)得電幾秒鐘沒到位    flag3閥電機(jī)得電沒到位標(biāo)志位倒計(jì)時(shí)

  54. ys1存EEPROM閥得電幾秒沒到位       js_jg能調(diào)整數(shù)值EEPROM存,賦給值   js_gz能調(diào)整數(shù)值EEPROM存,賦值

  55. jisu計(jì)數(shù)倒計(jì)數(shù)值  cbz錯(cuò)標(biāo)志位復(fù)位用

  56. //jisu time2 js_jg js_gz        */

  57.                                  

  58. /*led數(shù)碼管段選位選*/

  59. uchar code dm[]={0xc0,0xf9,0xa4,0xb0,0x99,

  60. 0x92,0x82,0xd8,0x80,0x90,0xaf,0xa3,0xfb,0xab,0x7f,0x86,0x87};

  61. uchar code wm[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,} ;



  62. /**************毫秒延時(shí)函數(shù)*****************/

  63. void delay(unsigned int a)

  64. {

  65.        unsigned int i,x;

  66.        for(i=0;i<a;i++)

  67.           for(x=0;x<110;x++);

  68. }

  69.        /*********按鍵掃描函數(shù)************/

  70. void  key_scan()

  71. {

  72.    // uchar k;                //定義變量返回值

  73.        ms_key=1;                //送高電平到模式位

  74.        if(ms_key!=1)         //檢測(cè)如果不等于高電平

  75.        {

  76.               delay(5);         //延時(shí)

  77.               if(ms_key!=1)

  78.               ms=ms+1;                     //       確定,計(jì)時(shí)模0或計(jì)數(shù)模式1

  79.               if(ms>=2)ms=0;  

  80.               while(ms_key!=1);  //等侍按鍵抬起            

  81.        }                                                                        

  82. //       else ms=0;                 //如果還是低電平返回0

  83.       

  84.        if(shang_key!=1)  //如果檢測(cè)上鍵不是高電平

  85.        {

  86.               delay(5);              // 延時(shí)

  87.               if(shang_key!=1)

  88.               shang=1;                     //如果上鍵還是低電平返回1            

  89.        }

  90.        else shang=0;

  91.        if(seding_key!=1)          //如果檢測(cè)設(shè)定不是高電平

  92.        {

  93.               delay(5);       //延時(shí)

  94.               if(seding_key!=1)

  95.               seding++;                 //如果檢測(cè)設(shè)定還是低電平返回1

  96.               if(seding>=3)seding=0;

  97.               while(seding_key!=1);

  98.        }

  99.        if(qiting_key!=1)          //檢測(cè)起動(dòng)按鈕如果是低電平

  100.        {                              

  101.               delay(5);         //延時(shí)

  102.               if(qiting_key!=1)

  103.               qiting=1;                 //如果啟動(dòng)還是低電平返回1

  104.               else qiting=0;

  105.        }

  106.        if(xia_key!=1)           //如果下檢測(cè)是低電平

  107.        {

  108.               delay(5);              //延時(shí)

  109.               if(xia_key!=1)

  110.               xia=1;                     //如果下不是低電平返回1

  111.        }

  112.        else xia=0;

  113.        if(rest_key!=1)              //檢測(cè)復(fù)位按鈕如果是低電平

  114.        {

  115.               delay(5);              //延時(shí)

  116.               if(rest_key!=1)

  117.            rest=1;                     //如果復(fù)位按鈕還是低電平返回1

  118.               else rest=0;

  119.        }

  120. }

  121.        /********閥門位置掃描***********/

  122. void fmwz()

  123. {

  124.        if(skdw_in!=1)                     //       測(cè)試如果上閥在開的位置

  125.        {

  126.               delay(5);              //延時(shí)

  127.               if(skdw_in!=1)

  128.               sfk=1;                     //上閥如果真的在開的位置SF復(fù)位0

  129.        }

  130.        else sfk=0;

  131.        if(sgdw_in!=1)                     //       測(cè)試如果上閥在關(guān)的位置      

  132.        {

  133.               delay(5);              //延時(shí)

  134.               if(sgdw_in!=1)

  135.               sfg=1;                     //上閥如果真的在關(guān)的位置SF置位1

  136.        }

  137.        else sfg=0;

  138.        if(xkdw_in!=1)                     //測(cè)試如果下閥在開的位置

  139.        {

  140.               delay(5);              //延時(shí)

  141.               if(xkdw_in!=1)

  142.               xfk=1;                     //如果下閥還在開的位置,復(fù)位XF為0

  143.        }

  144.        else xfk=0;

  145.        if(xgdw_in!=1)                     // 測(cè)試如果下閥在關(guān)的位置

  146.        {

  147.               delay(5);              //延時(shí)

  148.               if(xgdw_in!=1)

  149.               xfg=1;

  150.                                    //如果下閥還是在關(guān)位置,置XF為1

  151.        }

  152.        else xfg=0;

  153. }

  154. /************閥門位置指示燈****************************/

  155. void fled()

  156. {

  157.        sgdw_led=!sfg;                    //上閥在關(guān)的位置,上關(guān)到位燈亮

  158.        skdw_led=!sfk;                              //上閥在開的位置,上開到位燈亮

  159.        xgdw_led=!xfg;                            //下閥在關(guān)的位置,下關(guān)到位燈亮

  160.        xkdw_led=!xfk;                            //下閥在開的位置,下開到位燈亮

  161.        if(ms)                                          //如果模式是不是0

  162.        {   

  163.          jsums_led=0;                            //計(jì)數(shù)LED燈亮

  164.          jsms_led=1;                            //計(jì)時(shí)模式LED燈滅

  165.        }

  166.        else                                             //如果模式是0

  167.        {

  168.           jsms_led=0;                              //計(jì)時(shí)LED燈亮

  169.           jsums_led=1;                              //計(jì)數(shù)LED燈滅

  170.        }

  171. }

  172. /****************顯示數(shù)碼管函數(shù)*********************/

  173. void display(uchar a,uchar b)

  174. {

  175.        duan=1;                                      //開段選

  176.        P0=dm[a];                               //段碼給P0口

  177.        duan=0;                                      //關(guān)段選

  178.        wei=1;                                      //開位選

  179.        P0=wm[b];                               //位碼給P0口

  180.        wei=0;                                      //關(guān)位選

  181.        P0=0xff;                               //消隱

  182.     delay(2);      

  183. }



  184. /**************ISP使能**********************************/

  185. void enable()

  186. {                                                                      //關(guān)閉總中斷

  187.        EA=0;

  188.        ISP_CONTR=ISP_CONTR|WAITTIME;              //寫入硬件等待時(shí)間

  189.        ISP_CONTR|=0x80;                                   //啟動(dòng)ISP

  190. }



  191. /***************ISP 禁止*******************************/

  192. void disable()

  193. {

  194.        ISP_CONTR=ISP_CONTR&0x7f;                     //關(guān)閉ISP

  195.        ISP_TRIG=0x00;                                          //清0

  196.        EA=1;                                                        //開總中斷

  197. }



  198. /*******************觸發(fā)********************************/

  199. void goon()

  200. {

  201.        enable();

  202.        ISP_TRIG|=0x46;

  203.        ISP_TRIG|=0xb9;

  204. }



  205. /******************讀一個(gè)字節(jié)**************************/

  206. uchar read_byte(uint a)

  207. {

  208.        ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH);         //地址高位寫入

  209.        ISP_ADDRL=(uchar)(a|0x00ff);                       //地址低位寫入

  210.        ISP_CMD=ISP_CMD&0xf8;                                     //清低3位

  211.        ISP_CMD=ISP_CMD|RCOMMAND;                              //寫入讀命令

  212.        goon();                                                                 //觸發(fā)

  213.        disable();                                                        //關(guān)閉

  214.        return ISP_DATA;                                            //返回讀出數(shù)據(jù)

  215. }



  216. /*****************寫一個(gè)字節(jié)****************************/

  217. void write_byte(uint b,uchar c)

  218. {

  219.        ISP_ADDRH=(uchar)((b>>8)|ISP_ADDRH);          //賦值地址高位

  220.        ISP_ADDRL=(uchar)(b|0x00ff);                        //賦值地址低位

  221.        ISP_CMD=ISP_CMD&0xf8;                                      //清低3位

  222.        ISP_CMD=ISP_CMD|WCOMMAND;                               //寫入寫命令

  223.        goon();                                                                  //觸發(fā)

  224. //       disable();                                                           //關(guān)閉

  225.        ISP_DATA=c;                                                           //把要寫入字節(jié)賦給寄存器

  226. }            



  227. /******************擦除扇區(qū)*****************************/

  228. void sector_erase(uint a)

  229. {

  230.        ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH);       //賦值地址高位

  231.        ISP_ADDRL=0;                                                 //賦值低位

  232.        ISP_CMD=ISP_CMD&0xf8;                                   //清低3位

  233.        ISP_CMD=ISP_CMD|ECOMMAND;                            //寫入擦除命令

  234.        goon();                                                               //觸發(fā)

  235.        disable();                                                        //關(guān)閉

  236. }



  237. /*******************寫入調(diào)整好的數(shù)值數(shù)組到EEPROM******************/

  238. void write()

  239. {

  240.     uchar *pa=0x2000;                 //定義指針變量地址是2000

  241.     uchar x,y;

  242.        table[0]=js_gz;                //計(jì)時(shí)工作工作時(shí)間  (e)

  243.        table[1]=js_jg;                       //計(jì)時(shí)間隔數(shù)值         (jsjg)

  244.        table[2]=jisu;            //計(jì)數(shù)數(shù)值                (jisu)

  245.        table[3]=time2;                       //閥門開到位待待進(jìn),放料時(shí)間  (time)

  246.        table[4]=ys1;             //電機(jī)得電檢測(cè)沒到位時(shí)間         (ys)

  247.        table[5]=fqwz2;           //電機(jī)啟動(dòng)檢測(cè)沒離開位置時(shí)間  (fqwz)

  248.        sector_erase(pa);                //擦除2000地址扇區(qū)

  249.        for(x=0;x<8;x++)                 //循環(huán)

  250.        {

  251.               write_byte(pa+x,table[x]);              //把數(shù)組寫入EEPROM里

  252.        }

  253.        disable();                                                 //關(guān)ISP

  254. }





  255. /***********開機(jī)初始化閥門回關(guān)位置顯示INI**************/

  256. void initia()

  257. {                                                      

  258.      uchar a=4,x;                            //定義延時(shí)變量

  259.        uchar *pa=0x2000;              //定義指針變量并賦值為2000                    

  260.       P3=0x0f;                                   //把P3口初化下

  261.          for(x=0;x<8;x++)                     //循環(huán)

  262.          {

  263.                 table[x]=read_byte(pa+x);       //讀出EEPROM 2000以后連續(xù)數(shù)賦給數(shù)組

  264.          }

  265.          js_gz=table[0];                //把讀出來數(shù)賦給計(jì)時(shí)工作變量

  266.          js_jg=table[1];                //把讀出來數(shù)賦給計(jì)時(shí)間隔變量

  267.          jisu=table[2];                 //把讀出來數(shù)賦給計(jì)數(shù)變量

  268.          time2=table[3];                //把讀出來數(shù)賦給閥開到位進(jìn),放料等待變量

  269.          ys1=table[4];                  //把讀出來數(shù)賦給檢測(cè)電機(jī)得電多久沒到位變量

  270.        // fqwz2=table[5];                //把讀出來數(shù)賦給檢測(cè)電機(jī)得電多久位置沒動(dòng)變量

  271.        fqwz2=5;//臨時(shí)測(cè)試

  272.        while(a|((sfg&xfg)!=1))        //如果延時(shí)和上閥關(guān)下閥關(guān)都等于1

  273.     {

  274.          fmwz();                                   //檢測(cè)閥門位置

  275.          fled();                                   //閥門位置LED

  276.          if(dj)a--;                            //閥門延時(shí)變量4秒--

  277.       display(12,5);                     //顯示I

  278.       display(13,4);                      //顯示N

  279.       display(12,3);                     //顯示I

  280.       if(sfg!=1)sgq=1;                     //如果上閥沒在關(guān)的位置,啟動(dòng)關(guān)上閥電機(jī)

  281.          else sgq=0;                            //或者上閥關(guān)電機(jī)停

  282.          if(xfg!=1)xgq=1;                     //如果下閥沒在關(guān)的位置,啟協(xié)關(guān)下閥電機(jī)

  283.          else xgq=0;                            //或者下閥關(guān)電機(jī)停

  284.        }         

  285. }



  286. /********************顯示錯(cuò)誤碼Error****************/

  287. void error()

  288. {

  289.                     display(15,6);               //顯示字符E

  290.                  display(10,5);              //顯示字符R

  291.                  display(10,4);              //顯示字符R

  292.                  display(11,3);              //顯示字符O

  293.                  display(10,2);              //顯示字符R

  294.                  cbz=1;                 //錯(cuò)誤標(biāo)志位





  295. //              display(0xff,0x08);       //全部不顯示

  296. //              delay(60);                     //延時(shí)

  297.   

  298.                                                 

  299. }

  300. /************掃描錯(cuò)閥位置邏輯錯(cuò)誤*****************/

  301. void scan_error()

  302. {

  303.        if(sfk&sfg) error(); //如果上閥開,關(guān)到位信號(hào)同時(shí)來顯示錯(cuò)誤

  304.        if(xfk&xfg) error(); //如果下閥開,關(guān)到位信號(hào)同時(shí)來顯示錯(cuò)誤

  305.    

  306.        if(skq)                                      //上閥開電機(jī)啟動(dòng)

  307.        {

  308.               flag3=1;                        //置標(biāo)志位FLAG3為1

  309.               if(sfk&(ys>0))flag3=0;    //如果上閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0

  310.               while(!sfk&(ys==0))              //如果過了設(shè)定延時(shí),上開位還沒到進(jìn)行死循環(huán)

  311.               {

  312.                      error();                        //顯示錯(cuò)誤碼

  313.                      if(err)skdw_led=~skdw_led;         //上閥開到位LED燈閃爍

  314.                      skq=0;                                            //關(guān)開上閥電機(jī)

  315.                      ys=0;                                          //延時(shí)賦0

  316.                      if(!sfg)sgq=1;                            //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)

  317.                      else sgq=0;                                   //或在關(guān)位置,停關(guān)上閥電機(jī)

  318.                      if(!xfg)xgq=1;                            //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)

  319.                      else xgq=0;                                   //或者關(guān)下閥電機(jī)停止

  320.               }

  321.        }

  322.        if(sgq)                                      //上閥關(guān)電機(jī)啟動(dòng)

  323.        {

  324.               flag3=1;                        //置標(biāo)志位FLAG3為1

  325.               if(sfg&(ys>0))flag3=0;    //如果上閥在關(guān)位和倒計(jì)時(shí)大于0成立,清FLAG3為0

  326.               while(!sfg&(ys==0))              //如果過了設(shè)定延時(shí),上關(guān)位還沒到進(jìn)行死循環(huán)

  327.               {

  328.                      error();                        //顯示錯(cuò)誤碼

  329.                      if(err)sgdw_led=~sgdw_led;         //上閥關(guān)到位LED燈閃爍

  330.                      sgq=0;                                            //關(guān)上閥電機(jī)停

  331.                      ys=0;                                          //延時(shí)賦0

  332.                      if(!sfg)sgq=1;                            //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)

  333.                      else sgq=0;                                   //或在關(guān)位置,停關(guān)上閥電機(jī)

  334.                      if(!xfg)xgq=1;                            //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)

  335.                      else xgq=0;                                   //或者關(guān)下閥電機(jī)停止

  336.               }

  337.        }      

  338.        if(xkq)                                      //下閥開電機(jī)啟動(dòng)

  339.        {

  340.               flag3=1;                        //置標(biāo)志位FLAG3為1

  341.               if(xfk&(ys>0))flag3=0;    //如果下閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0

  342.               if(xfk&(ys>0))flag3=0;    //如果下閥在開位和倒計(jì)時(shí)大于0成立,清FLAG3為0

  343.               while(!xfk&(ys==0))              //如果過了設(shè)定延時(shí),下開位還沒到進(jìn)行死循環(huán)

  344.               {

  345.                      error();                        //顯示錯(cuò)誤碼

  346.                      if(err)xkdw_led=~xkdw_led;         //下閥開到位LED燈閃爍

  347.                      xkq=0;                                            //關(guān)開下閥電機(jī)

  348.                      ys=0;                                          //延時(shí)賦0

  349.                      if(!sfg)sgq=1;                            //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)

  350.                      else sgq=0;                                   //或在關(guān)位置,停關(guān)上閥電機(jī)

  351.                      if(!xfg)xgq=1;                            //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)

  352.                      else xgq=0;                                   //或者關(guān)下閥電機(jī)停止

  353.               }

  354.        }      

  355.        if(xgq)                                      //下閥關(guān)電機(jī)啟動(dòng)

  356.        {

  357.               flag3=1;                        //置標(biāo)志位FLAG3為1

  358.               if(xfg&(ys>0))flag3=0;    //如果下閥在關(guān)位和倒計(jì)時(shí)大于0成立,清FLAG3為0

  359.               while(!xfg&(ys==0))              //如果過了設(shè)定延時(shí),下關(guān)位還沒到進(jìn)行死循環(huán)

  360.               {

  361.                      error();                        //顯示錯(cuò)誤碼

  362.                      if(err)xgdw_led=~xgdw_led;         //下閥關(guān)到位LED燈閃爍

  363.                      xgq=0;                                            //下關(guān)閥電機(jī)停

  364.                      ys=0;                                          //延時(shí)賦0

  365.                      if(!sfg)sgq=1;                            //如果上閥沒在關(guān)的位置,關(guān)上閥電機(jī)啟動(dòng)

  366.                      else sgq=0;                                   //或在關(guān)位置,停關(guān)上閥電機(jī)

  367.                      if(!xfg)xgq=1;                            //如果下閥沒在關(guān)的位置,下閥關(guān)電機(jī)啟動(dòng)

  368.                      else xgq=0;                                   //或者關(guān)下閥電機(jī)停止

  369.               }

  370.        }

  371.       

  372.             





  373.        if(skq)                            //如果上閥開電機(jī)得電,

  374.        {

  375.               flg2=1;                     //置倒計(jì)時(shí)標(biāo)志位為1

  376.               if(sfk)flg2=0;       //如果上閥在開位置,倒計(jì)時(shí)標(biāo)志位清0

  377.               else                       //如果上閥沒在開的位置

  378.               {

  379.               if((fqwz==0)&sfg)         //倒計(jì)時(shí)數(shù)等于0時(shí)間到,上閥還在關(guān)的位置

  380.             

  381.                  {       sd1=1;

  382.                        while(sd1)                              //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼

  383.                      {

  384.                             error();                       //錯(cuò)誤函數(shù)

  385.                             if(err)sgdw_led=~sgdw_led;          //上關(guān)到位LED燈閃爍

  386.                             skq=0;                                             //關(guān)上閥開電機(jī)

  387.                      }

  388.               //       if(err)sgdw_led=~sgdw_led;                 //如果設(shè)定(內(nèi)參)為0只上關(guān)到位LED閃顯示

  389.               }                    

  390.                  }

  391.        }

  392.           if(sgq)                             //如果上閥關(guān)電機(jī)得電,

  393.        {

  394.               flg2=1;                     //置倒計(jì)時(shí)標(biāo)志位為1

  395.               if(sfg)flg2=0;              //如果上閥在關(guān)位置,倒計(jì)時(shí)標(biāo)志位清0

  396.               else                            //如果上閥沒在關(guān)的位置

  397.                 if((fqwz==0)&sfk)       //倒計(jì)時(shí)數(shù)等于0時(shí)間到,上閥還在開的位置

  398.               {       sd1=1;

  399.                        while(sd1)                //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼

  400.                      {

  401.                             error();              //錯(cuò)誤函數(shù)

  402.                             if(err)skdw_led=~skdw_led;       //上開到位LED燈閃爍

  403.                             sgq=0;                                          //關(guān)上閥關(guān)電機(jī)

  404.                      }

  405.               //       if(err)skdw_led=~skdw_led;              //如果設(shè)定(內(nèi)參)為0只上開到位LED閃顯示

  406.               }                    

  407.                

  408.        }

  409.           if(xkq)                             //如果下閥開電機(jī)得電,

  410.        {

  411.               flg2=1;                     //置倒計(jì)時(shí)標(biāo)志位為1

  412.               if(xfk)flg2=0;                       //置倒計(jì)時(shí)標(biāo)志位為1

  413.               else if((fqwz==0)&xfg)         //倒計(jì)時(shí)數(shù)等于0時(shí)間到,下閥還在關(guān)的位置

  414.               {       sd1=1;

  415.                        while(sd1)                       //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼

  416.                      {

  417.                             error();                 //錯(cuò)誤函數(shù)

  418.                             if(err)xgdw_led=~xgdw_led;       //下關(guān)到位LED燈閃爍

  419.                             xkq=0;                                            //關(guān)下閥關(guān)電機(jī)

  420.                      }                                                      

  421.        //              if(err)xgdw_led=~xgdw_led;              //如果設(shè)定(內(nèi)參)為0只下關(guān)到位LED閃顯示

  422.               }                    

  423.                

  424.        }

  425.               if(xgq)                            //如果下閥關(guān)電機(jī)得電,

  426.        {

  427.               flg2=1;                        //置倒計(jì)時(shí)標(biāo)志位為1

  428.               if(xfg)flg2=0;                     //置倒計(jì)時(shí)標(biāo)志位為1

  429.               else if((fqwz==0)&xfk)       //倒計(jì)時(shí)數(shù)等于0時(shí)間到,下閥還在開的位置

  430.               {       sd1=1;

  431.                        while(sd1)                     //如果設(shè)定數(shù)為(內(nèi)參)進(jìn)行循環(huán)顯示錯(cuò)誤碼

  432.                      {

  433.                             error();                //錯(cuò)誤函數(shù)

  434.                             if(err)xkdw_led=~xkdw_led;         //下開到位LED燈閃爍

  435.                             skq=0;

  436.                      }                                                          //關(guān)下閥開電機(jī)

  437.        //              if(err)xkdw_led=~xkdw_led;                //如果設(shè)定(內(nèi)參)為0只下開到位LED閃顯示

  438.               }                    

  439.                

  440.        }

  441. }

  442. /*************待機(jī)狀態(tài)*************/

  443. void jsdaiji()

  444. {

  445.     uchar a,b,c,d;

  446.             a=js_jg/10;                                   //計(jì)時(shí)間隔十位

  447.          b=js_jg%10;                                   //計(jì)時(shí)間隔個(gè)位

  448.          c=js_gz/10;

  449.          d=js_gz%10;

  450.   if(dj)                                           //如果變量DJ等于1

  451.       {                                                  

  452.           display(10,7);                     //顯示R字符            

  453.        display(a,2);                     //顯示間隔數(shù)字十位

  454.        display(b,1);                     //顯示間隔數(shù)字個(gè)位

  455.          }      

  456.   else                                                  //或者變量DJ等于0

  457.       {

  458.            display(11,7);

  459.                 display(c,2);                     //顯示工作時(shí)間0

  460.               display(d,1);                     //顯示工作時(shí)間

  461.          }                     

  462. }



  463. /**********計(jì)時(shí)工作運(yùn)行函數(shù)***************/

  464. void jsigzuo()

  465. {

  466.   

  467.      uchar a,b,c,d;

  468.       

  469.        yx_led=0;                              //運(yùn)行燈點(diǎn)亮

  470.        a=jsjg/10;                                   //計(jì)時(shí)間隔十位

  471.        b=jsjg%10;                                   //計(jì)時(shí)間隔個(gè)位

  472.        c=e/10;

  473.        d=e%10;

  474.        if(e<1)                         //計(jì)時(shí)工作倒計(jì)時(shí)小于1,計(jì)時(shí)間隔開始工作

  475.        {      

  476.                  flg=0;                    //計(jì)時(shí)工作減標(biāo)志位置0

  477.          if(jsjg==0)                 //如果計(jì)時(shí)間隔數(shù)值倒計(jì)時(shí)為0

  478.            {

  479.                 e=js_gz;                        //把計(jì)時(shí)工作時(shí)間重新賦給E

  480.                 TR1=0;                        //關(guān)閉定時(shí)器1,停止計(jì)時(shí)間隔倒計(jì)時(shí)

  481.               }

  482.           if(dj)display(10,7);                     //每隔一秒閃一次顯示間隔字符

  483.        display(14,7);                       //點(diǎn)小數(shù)點(diǎn)

  484.           display(a,2);                            //顯示間隔時(shí)間

  485.           display(b,1);                            //顯示間隔時(shí)間



  486.           if(xfg&sfg)                                   //工作模式工作沒完成,上下閥都在關(guān)

  487.           {

  488.                         skq=0;                                   //開上閥電機(jī)停

  489.                      xkq=0;                                   //開下閥電機(jī)停

  490.                      sgq=0;                                   //關(guān)上閥電機(jī)停

  491.                      xgq=0;                                   //關(guān)下閥電機(jī)停

  492.           }

  493.           else

  494.            {

  495.                      switch(x)

  496.                 {

  497.                     case 0:                                   //狀態(tài)等于0執(zhí)行上閥開動(dòng)作

  498.                           {   if(sfk==0)skq=1;              //如果上閥沒要開位,上開閥電機(jī)得電啟動(dòng)

  499.                            else

  500.                              {

  501.                                   skq=0;                            //或者上開閥電機(jī)停

  502.                                   flg1=1;                            //閥開到位倒計(jì)時(shí)標(biāo)志位

  503.                                if(time==1)x=1;              //改狀態(tài)為1       //上閥開到位,等待時(shí)間到

  504.                                 }

  505.                              }       break;            

  506.                  case 1:                     //如果狀態(tài)是1執(zhí)行上閥關(guān)

  507.                        {

  508.                               flg1=0;              //閥開到位倒計(jì)時(shí)標(biāo)志位            

  509.                         sgq=1;                            //上閥關(guān)電機(jī)啟動(dòng)

  510.                                  if(sfg==1)         //如果上閥關(guān)到位,上閥電機(jī)停

  511.                                 {

  512.                                    sgq=0;              //上閥關(guān)電機(jī)啟動(dòng)

  513.                                    x=3;                  //改狀態(tài)為3

  514.                                 }

  515.                        } break;               

  516.                           case 3:                            //如果狀態(tài)為3執(zhí)行下閥開電機(jī)啟動(dòng)

  517.                

  518.                            {

  519.                                  if(xfk==0)xkq=1;         //如果下閥沒開到位下開電機(jī)得電

  520.                                  else

  521.                                        {

  522.                                    xkq=0;              //或下閥開到位,下閥開電機(jī)停

  523.                                       flg1=1;              //閥開到位倒計(jì)時(shí)標(biāo)志位

  524.                                       if(time==1)x=4;       //等待時(shí)間到改狀態(tài)字為4

  525.                                     }

  526.                               }

  527.                                   break;

  528.                        case 4:                                   //狀態(tài)字為4執(zhí)行下閥關(guān)

  529.                              {

  530.                                   flg1=0;                     //閥開到位倒計(jì)時(shí)標(biāo)志位

  531.                                   if(xfk==1) xgq=1;         //如果狀態(tài)為4下閥關(guān)電機(jī)啟動(dòng)

  532.                                if(xfg==1)                       // 如果下閥到關(guān)位置,

  533.                                    {

  534.                                        xgq=0;         //下閥關(guān)電機(jī)停

  535. //                                       z=0;

  536.                                        x=0;         //狀態(tài)字改為0

  537.                                 }

  538.                           }break;

  539.                 }

  540.               }

  541.     }

  542.        if(e>=1)                                   //計(jì)時(shí)工鐵倒計(jì)時(shí)小于等于1,開始工作

  543.      {                                       

  544.            

  545.               flg=1;                             //置計(jì)時(shí)工作減標(biāo)志為1

  546.           if(dj)display(11,7);                     //每隔一秒閃一次顯示工作字符

  547.               display(14,7);

  548.               display(c,2);

  549.               display(d,1);                     //顯示工作時(shí)間

  550.               if(e==1)                            //如果計(jì)時(shí)工作變量倒計(jì)時(shí)等于1

  551.               {

  552.                  jsjg=js_jg;                 //重新給計(jì)時(shí)間隔賦值

  553.                  TR1=1;                        //開定時(shí)器1,啟動(dòng)計(jì)時(shí)間隔減



  554.               }

  555.          switch(x)

  556.          {

  557.            case 0:                                   //狀態(tài)等于0執(zhí)行上閥開動(dòng)作

  558.                  {   if(sfk==0)skq=1;              //如果上閥沒要開位,上開閥電機(jī)得電啟動(dòng)

  559.                else

  560.                   {

  561.                         skq=0;                            //或者上開閥電機(jī)停

  562.                         flg1=1;                            //閥開到位倒計(jì)時(shí)標(biāo)志位

  563.                      if(time==1)x=1;              //改狀態(tài)為1       //上閥開到位,等待時(shí)間到

  564.                      }

  565.               }       break;            

  566.         case 1:                     //如果狀態(tài)是1執(zhí)行上閥關(guān)

  567.             {

  568.                    flg1=0;              //閥開到位倒計(jì)時(shí)標(biāo)志位            

  569.              sgq=1;                            //上閥關(guān)電機(jī)啟動(dòng)

  570.                      if(sfg==1)         //如果上閥關(guān)到位,上閥電機(jī)停

  571.                        {

  572.                         sgq=0;              //上閥關(guān)電機(jī)啟動(dòng)

  573.                         x=3;                  //改狀態(tài)為3

  574.                        }

  575.              } break;               

  576.                  case 3:                            //如果狀態(tài)為3執(zhí)行下閥開電機(jī)啟動(dòng)

  577.                

  578.                   {

  579.                         if(xfk==0)xkq=1;         //如果下閥沒開到位下開電機(jī)得電

  580.                         else

  581.                                {

  582.                             xkq=0;              //或下閥開到位,下閥開電機(jī)停

  583.                                flg1=1;              //閥開到位倒計(jì)時(shí)標(biāo)志位

  584.                                if(time==1)x=4;       //等待時(shí)間到改狀態(tài)字為4

  585.                             }

  586.                        }

  587.                        break;

  588.               case 4:                                   //狀態(tài)字為4執(zhí)行下閥關(guān)

  589.                   {

  590.                      flg1=0;                     //閥開到位倒計(jì)時(shí)標(biāo)志位

  591.                      if(xfk==1) xgq=1;         //如果狀態(tài)為4下閥關(guān)電機(jī)啟動(dòng)

  592.                    if(xfg==1)                       // 如果下閥到關(guān)位置,

  593.                             {

  594.                                        xgq=0;         //下閥關(guān)電機(jī)停

  595.               //                         z=0;

  596.                                        x=0;         //狀態(tài)字改為0

  597.                           }

  598.                   }break;

  599.            }

  600.        }               

  601. }



  602. /*****************計(jì)數(shù)待機(jī)模式********************/

  603. void jsudaiji()

  604. {            

  605.        uchar a,b;

  606.           a=jisu/10;

  607.           b=jisu%10;                           

  608.           display(16,7);                     //顯示倒計(jì)數(shù)字符            

  609.        display(a,2);                     //顯示倒計(jì)數(shù)字十位

  610.        display(b,1);                     //顯示倒計(jì)數(shù)數(shù)字個(gè)位

  611. }

  612. /****************計(jì)數(shù)模式運(yùn)行函數(shù)*****************/

  613. void jsugzuo()

  614. {

  615.        uchar a,b,c,d;

  616.        a=jisu/10;

  617.        b=jisu%10;

  618.        yx_led=0;                                 //運(yùn)行燈點(diǎn)亮

  619.        if(dj)display(16,7);              //顯示倒計(jì)數(shù)字符

  620.        display(c,2);                     //顯示倒計(jì)數(shù)字十位

  621.      display(d,1);                     //顯示倒計(jì)數(shù)數(shù)字個(gè)位



  622. }



  623. /************計(jì)時(shí)計(jì)數(shù)工作模式數(shù)值調(diào)整************/

  624. void jstz()

  625. {

  626.        uchar a,b,c,d,e,f;

  627.        if((ms==0)&(~qiting)&(seding==1))                 //如果工作在計(jì)時(shí)待機(jī)模式,調(diào)整間隔數(shù)值

  628.        {

  629.           a=js_jg/10;

  630.           b=js_jg%10;

  631.          

  632.           display(10,7);                         //顯示R字符            

  633.        if(dj)                                          //如果T0里計(jì)時(shí)變量DJ是1

  634.            {

  635.                  display(a,2);                     //顯示間隔數(shù)字十位

  636.            display(b,1);                     //顯示間隔數(shù)字個(gè)位

  637.               }

  638.         if(shang)js_jg++;                     //如果上按鍵按下,計(jì)時(shí)間隔變量加1

  639.            if(xia)js_jg--;                            //如果下按鍵按下,計(jì)時(shí)間隔變量減1

  640.            while(shang|xia)                     //檢測(cè)等待上,下按鍵抬起

  641.            {

  642.                  key_scan();                            //循環(huán)掃描按鍵

  643.            }                    

  644.        }

  645.        if((ms==0)&(~qiting)&(seding==2))  //如果工作在計(jì)時(shí)待機(jī)模式,調(diào)整計(jì)時(shí)工作數(shù)值

  646.        {

  647.           c=js_gz/10;

  648.           d=js_gz%10;

  649.           display(11,7);                     //顯示o字符            

  650.        if(dj)                                   //如果T0里計(jì)時(shí)變量DJ是1

  651.            {

  652.                  display(c,2);                     //顯示間隔數(shù)字十位

  653.            display(d,1);                     //顯示間隔數(shù)字個(gè)位

  654.               }

  655.       if(shang)js_gz++;                            //如果上按鍵按下,計(jì)時(shí)工作變量加1

  656.          if(xia)js_gz--;                            //如果下按鍵按下,計(jì)時(shí)工作變量減1

  657.          while(shang|xia)                            //等待上,下按鍵抬起

  658.            {

  659.                  key_scan();                            //循環(huán)掃按鍵

  660.            }

  661.               write();                    //把修改后數(shù)值寫入EEPROM

  662.        }

  663.        if((ms==1)&(~qiting)&(seding==1))//如果工作在計(jì)數(shù)待機(jī)模式,調(diào)整計(jì)數(shù)數(shù)值      

  664.        {

  665.            e=jisu/10;

  666.               f=jisu%10;

  667.               display(16,7);                     //顯示倒計(jì)數(shù)字符            

  668.         if(dj)

  669.               {

  670.                   display(e,2);                     //顯示倒計(jì)數(shù)字十位

  671.             display(f,1);                     //顯示倒計(jì)數(shù)數(shù)字個(gè)位

  672.               }

  673.               if(shang)jisu++;                     //如果上按鍵按下,計(jì)數(shù)變量加1

  674.            if(xia)jisu--;                            //如果下按鍵按下,計(jì)數(shù)變量減1

  675.            while(shang|xia)                     //檢測(cè)等待上,下按鍵抬起

  676.            {

  677.                  key_scan();                            //循環(huán)掃描按鍵

  678.            }

  679.                      write();                    //把修改后數(shù)值寫入EEPROM                                 

  680.        }                    

  681. }

  682. /*********定時(shí)器0初始化***********/

  683. void initime0()

  684. {

  685.     TMOD=0X11;             //開啟定時(shí)器0

  686.        TH0=(65536-45782)/256; //裝初值

  687.        TL0=(65536-45782)%256; //裝初值

  688.        TH1=(65536-45782)/256;

  689.        TH0=(65536-45782)%256;

  690.        EA=1;                               //開總中斷

  691.        ET0=1;                               //開定時(shí)器0中斷

  692.        ET1=1;

  693.        TR0=1;

  694.        TR1=1;                               //啟動(dòng)定時(shí)器0

  695.        time=time2;            //閥門開到位等待時(shí)間賦值

  696.        ys=ys1;                //閥門電機(jī)得電多久沒到位時(shí)間賦值

  697. }

  698. /****************計(jì)時(shí),計(jì)數(shù)變量賦值*******************/

  699. void fz()

  700. {

  701.       

  702. }



  703. void main()

  704. {      

  705. //   uchar d ,c;                            //定義變量

  706.          initime0();                            //定時(shí)器初始化

  707.        initia();                            //開機(jī)初始化

  708.          while(1)                                            //大循環(huán)

  709.        {        

  710.          

  711.                 fmwz();                                     //閥門位置

  712.           fled();                                     //閥門位置燈

  713.                 key_scan();                               //鍵盤掃描

  714.                 if(cbz&rest)ISP_CONTR=0x20;   //如果有錯(cuò)誤復(fù)位按鍵按下

  715.        //   if((sfk&sfg)||(xfk&xfg))            //如果閥門位置有邏輯錯(cuò)誤

  716.              scan_error();                               //檢測(cè)閥位置邏輯錯(cuò)誤

  717.     //       else

  718.       

  719.            {      

  720.                     jstz();                                //計(jì)時(shí)數(shù)值調(diào)整函數(shù)

  721.                   if((qiting==0)&(ms==0)&(seding==0))       //啟停按鈕,模式,設(shè)定都是0,執(zhí)行待機(jī)程序

  722.                      {

  723.                         jsdaiji();                                            //計(jì)時(shí)待機(jī)

  724.                         jsjg=js_jg;                                          //把設(shè)定的好的計(jì)時(shí)間隔時(shí)間傳遞給計(jì)時(shí)間隔變量

  725.                         e=js_gz;

  726.                      }

  727.                   if(qiting&(ms==0))          //啟停按鈕和計(jì)時(shí)模式都是1,執(zhí)行計(jì)時(shí)程序

  728.                      {

  729.                         jsigzuo();                   //計(jì)時(shí)工作函數(shù)

  730.             

  731.                      }

  732.                      if((qiting==0)&(ms==1))jsudaiji();         //如果啟停按鈕和計(jì)數(shù)模式都是1,執(zhí)行計(jì)數(shù)程序

  733.                   if(qiting&(ms==1)) jsugzuo();                //計(jì)數(shù)工作函數(shù)

  734.            }

  735.        }

  736. }

  737.    /**********定時(shí)器0中斷函數(shù)***************/

  738. void time0()interrupt 1

  739. {

  740.     static a,er;                                   //定義靜態(tài)變量A

  741.        TH0=(65536-45872)/256;              //重新裝初值

  742.        TL0=(65536-45872)%256;

  743.        a++;                                          //變量A加1

  744.        er++;



  745.        if(er>=30)

  746.        {

  747.            er=0;

  748.            err=~err;              //錯(cuò)誤顯示如果ER變量中斷大于等于30次

  749.        }

  750.        if(a>=20)                                   //如果計(jì)滿大于等于20次次      

  751.        {

  752.               a=0;                                   //A清0

  753.               if(flg1)time--;                     //閥門開到位等待標(biāo)志位是1,倒計(jì)時(shí)減1

  754.               else time=time2;        //如果閥門開到位標(biāo)志位是0,重新把設(shè)定值賦給

  755.               if(flag3)ys--;          //如果閥電機(jī)得電標(biāo)志位,幾秒沒到是1延時(shí)變量值減1

  756.               else ys==ys1 ;            //如果是0重新賦值

  757.               dj=~dj;                                   //變量DJ取反

  758.               if(flg)                                   //如果計(jì)時(shí)工作變量標(biāo)志是1

  759.               {

  760.                      e--;                            //計(jì)時(shí)工作變量E減1

  761.               }

  762.               if(flg2)fqwz--;

  763.               else fqwz=fqwz2;                                 

  764.        }

  765. }

  766. /**********定時(shí)器1中斷函數(shù)****************/

  767. void time1()interrupt 3

  768. {

  769.     static b;

  770.        TH1=(65536-45782)/256;

  771.        TL1=(65536-45782)%256;

  772.        b++;                                     //中斷一次B增加1

  773.        if(b>=20)                              //如果中斷20次就是一秒

  774.        {

  775.               b=0;                              //變量賦0

  776.               jsjg--;                       //計(jì)時(shí)間隔變量減1

  777.                     

  778.        }

  779. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表