久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4243|回復: 0
收起左側

PROTEUS 雙層卸灰閥仿真

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








  1. #include <reg52.h>

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

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

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

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

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

  7. #define WAITTIME 0x01



  8. sfr ISP_DATA=0xe2;                               //定義數據寄存器地址

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

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

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

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

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



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

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



  16.        /*指示燈led*/

  17. sbit yx_led=P2^0;          //運行燈

  18. sbit jsms_led=P2^1;   //計時燈

  19. sbit jsums_led=P2^2;  //計數燈

  20. sbit sgdw_led=P2^3;   // 上關到位燈

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

  22. sbit xgdw_led=P2^5;   //  下關到位燈

  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;       //       設定按鈕

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

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

  30. sbit rest_key=P1^5;  //       復位按鈕



  31.    /*閥門位置信號*/

  32. sbit skdw_in=P3^0;   //    上閥開到位信號

  33. sbit sgdw_in=P3^1;   //  上閥關到位信號

  34. sbit xkdw_in=P3^2;         //    下閥開到位信號

  35. sbit xgdw_in=P3^3;   //    下閥關到位信號



  36. /*輸出啟動電機*/

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

  38. sbit sgq=P3^5;       //    上閥電機關得電

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

  40. sbit xgq=P3^7;       //    下閥電機關得電



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



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

  43. uchar jsgz=1,flg,x,err;                     //計時間隔,計時工作時間 e工作數 fl計時工作開始標志

  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 模式狀態  shang按鈕上  xia按鈕下鍵   seding設定鍵值  qiting啟停鍵變量   rest復位鍵變量

  48. sfk上閥開  sfg上閥關   xfk下閥開  xfg下閥關   dj定時器延時標志位

  49. jsgz計時工作   flg計時工作工作時間倒計時減標志位  x閥位連續開關狀態    err錯誤時用閃爍

  50. e計時工作時間     jsjg計時工作間隔時間   time閥開到位等待進放料時間   

  51. time2閥門開到位等待時間存在E2ROM值   flg1閥開到位倒計時標志位    flg2上下閥啟動但位置信號不復位

  52. fqwz上下閥開關啟動多久位置沒變化       fqwz2上下閥開關啟動多久們沒變化設定值

  53. sd1設定有邏輯故障是否繼續工作          ys測試閥電機得電幾秒鐘沒到位    flag3閥電機得電沒到位標志位倒計時

  54. ys1存EEPROM閥得電幾秒沒到位       js_jg能調整數值EEPROM存,賦給值   js_gz能調整數值EEPROM存,賦值

  55. jisu計數倒計數值  cbz錯標志位復位用

  56. //jisu time2 js_jg js_gz        */

  57.                                  

  58. /*led數碼管段選位選*/

  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. /**************毫秒延時函數*****************/

  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.        /*********按鍵掃描函數************/

  70. void  key_scan()

  71. {

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

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

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

  75.        {

  76.               delay(5);         //延時

  77.               if(ms_key!=1)

  78.               ms=ms+1;                     //       確定,計時模0或計數模式1

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

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

  81.        }                                                                        

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

  83.       

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

  85.        {

  86.               delay(5);              // 延時

  87.               if(shang_key!=1)

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

  89.        }

  90.        else shang=0;

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

  92.        {

  93.               delay(5);       //延時

  94.               if(seding_key!=1)

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

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

  97.               while(seding_key!=1);

  98.        }

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

  100.        {                              

  101.               delay(5);         //延時

  102.               if(qiting_key!=1)

  103.               qiting=1;                 //如果啟動還是低電平返回1

  104.               else qiting=0;

  105.        }

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

  107.        {

  108.               delay(5);              //延時

  109.               if(xia_key!=1)

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

  111.        }

  112.        else xia=0;

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

  114.        {

  115.               delay(5);              //延時

  116.               if(rest_key!=1)

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

  118.               else rest=0;

  119.        }

  120. }

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

  122. void fmwz()

  123. {

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

  125.        {

  126.               delay(5);              //延時

  127.               if(skdw_in!=1)

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

  129.        }

  130.        else sfk=0;

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

  132.        {

  133.               delay(5);              //延時

  134.               if(sgdw_in!=1)

  135.               sfg=1;                     //上閥如果真的在關的位置SF置位1

  136.        }

  137.        else sfg=0;

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

  139.        {

  140.               delay(5);              //延時

  141.               if(xkdw_in!=1)

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

  143.        }

  144.        else xfk=0;

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

  146.        {

  147.               delay(5);              //延時

  148.               if(xgdw_in!=1)

  149.               xfg=1;

  150.                                    //如果下閥還是在關位置,置XF為1

  151.        }

  152.        else xfg=0;

  153. }

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

  155. void fled()

  156. {

  157.        sgdw_led=!sfg;                    //上閥在關的位置,上關到位燈亮

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

  159.        xgdw_led=!xfg;                            //下閥在關的位置,下關到位燈亮

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

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

  162.        {   

  163.          jsums_led=0;                            //計數LED燈亮

  164.          jsms_led=1;                            //計時模式LED燈滅

  165.        }

  166.        else                                             //如果模式是0

  167.        {

  168.           jsms_led=0;                              //計時LED燈亮

  169.           jsums_led=1;                              //計數LED燈滅

  170.        }

  171. }

  172. /****************顯示數碼管函數*********************/

  173. void display(uchar a,uchar b)

  174. {

  175.        duan=1;                                      //開段選

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

  177.        duan=0;                                      //關段選

  178.        wei=1;                                      //開位選

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

  180.        wei=0;                                      //關位選

  181.        P0=0xff;                               //消隱

  182.     delay(2);      

  183. }



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

  185. void enable()

  186. {                                                                      //關閉總中斷

  187.        EA=0;

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

  189.        ISP_CONTR|=0x80;                                   //啟動ISP

  190. }



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

  192. void disable()

  193. {

  194.        ISP_CONTR=ISP_CONTR&0x7f;                     //關閉ISP

  195.        ISP_TRIG=0x00;                                          //清0

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

  197. }



  198. /*******************觸發********************************/

  199. void goon()

  200. {

  201.        enable();

  202.        ISP_TRIG|=0x46;

  203.        ISP_TRIG|=0xb9;

  204. }



  205. /******************讀一個字節**************************/

  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();                                                                 //觸發

  213.        disable();                                                        //關閉

  214.        return ISP_DATA;                                            //返回讀出數據

  215. }



  216. /*****************寫一個字節****************************/

  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();                                                                  //觸發

  224. //       disable();                                                           //關閉

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

  226. }            



  227. /******************擦除扇區*****************************/

  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();                                                               //觸發

  235.        disable();                                                        //關閉

  236. }



  237. /*******************寫入調整好的數值數組到EEPROM******************/

  238. void write()

  239. {

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

  241.     uchar x,y;

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

  243.        table[1]=js_jg;                       //計時間隔數值         (jsjg)

  244.        table[2]=jisu;            //計數數值                (jisu)

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

  246.        table[4]=ys1;             //電機得電檢測沒到位時間         (ys)

  247.        table[5]=fqwz2;           //電機啟動檢測沒離開位置時間  (fqwz)

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

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

  250.        {

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

  252.        }

  253.        disable();                                                 //關ISP

  254. }





  255. /***********開機初始化閥門回關位置顯示INI**************/

  256. void initia()

  257. {                                                      

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

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

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

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

  262.          {

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

  264.          }

  265.          js_gz=table[0];                //把讀出來數賦給計時工作變量

  266.          js_jg=table[1];                //把讀出來數賦給計時間隔變量

  267.          jisu=table[2];                 //把讀出來數賦給計數變量

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

  269.          ys1=table[4];                  //把讀出來數賦給檢測電機得電多久沒到位變量

  270.        // fqwz2=table[5];                //把讀出來數賦給檢測電機得電多久位置沒動變量

  271.        fqwz2=5;//臨時測試

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

  273.     {

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

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

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

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

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

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

  280.       if(sfg!=1)sgq=1;                     //如果上閥沒在關的位置,啟動關上閥電機

  281.          else sgq=0;                            //或者上閥關電機停

  282.          if(xfg!=1)xgq=1;                     //如果下閥沒在關的位置,啟協關下閥電機

  283.          else xgq=0;                            //或者下閥關電機停

  284.        }         

  285. }



  286. /********************顯示錯誤碼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;                 //錯誤標志位





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

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

  297.   

  298.                                                 

  299. }

  300. /************掃描錯閥位置邏輯錯誤*****************/

  301. void scan_error()

  302. {

  303.        if(sfk&sfg) error(); //如果上閥開,關到位信號同時來顯示錯誤

  304.        if(xfk&xfg) error(); //如果下閥開,關到位信號同時來顯示錯誤

  305.    

  306.        if(skq)                                      //上閥開電機啟動

  307.        {

  308.               flag3=1;                        //置標志位FLAG3為1

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

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

  311.               {

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

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

  314.                      skq=0;                                            //關開上閥電機

  315.                      ys=0;                                          //延時賦0

  316.                      if(!sfg)sgq=1;                            //如果上閥沒在關的位置,關上閥電機啟動

  317.                      else sgq=0;                                   //或在關位置,停關上閥電機

  318.                      if(!xfg)xgq=1;                            //如果下閥沒在關的位置,下閥關電機啟動

  319.                      else xgq=0;                                   //或者關下閥電機停止

  320.               }

  321.        }

  322.        if(sgq)                                      //上閥關電機啟動

  323.        {

  324.               flag3=1;                        //置標志位FLAG3為1

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

  326.               while(!sfg&(ys==0))              //如果過了設定延時,上關位還沒到進行死循環

  327.               {

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

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

  330.                      sgq=0;                                            //關上閥電機停

  331.                      ys=0;                                          //延時賦0

  332.                      if(!sfg)sgq=1;                            //如果上閥沒在關的位置,關上閥電機啟動

  333.                      else sgq=0;                                   //或在關位置,停關上閥電機

  334.                      if(!xfg)xgq=1;                            //如果下閥沒在關的位置,下閥關電機啟動

  335.                      else xgq=0;                                   //或者關下閥電機停止

  336.               }

  337.        }      

  338.        if(xkq)                                      //下閥開電機啟動

  339.        {

  340.               flag3=1;                        //置標志位FLAG3為1

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

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

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

  344.               {

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

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

  347.                      xkq=0;                                            //關開下閥電機

  348.                      ys=0;                                          //延時賦0

  349.                      if(!sfg)sgq=1;                            //如果上閥沒在關的位置,關上閥電機啟動

  350.                      else sgq=0;                                   //或在關位置,停關上閥電機

  351.                      if(!xfg)xgq=1;                            //如果下閥沒在關的位置,下閥關電機啟動

  352.                      else xgq=0;                                   //或者關下閥電機停止

  353.               }

  354.        }      

  355.        if(xgq)                                      //下閥關電機啟動

  356.        {

  357.               flag3=1;                        //置標志位FLAG3為1

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

  359.               while(!xfg&(ys==0))              //如果過了設定延時,下關位還沒到進行死循環

  360.               {

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

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

  363.                      xgq=0;                                            //下關閥電機停

  364.                      ys=0;                                          //延時賦0

  365.                      if(!sfg)sgq=1;                            //如果上閥沒在關的位置,關上閥電機啟動

  366.                      else sgq=0;                                   //或在關位置,停關上閥電機

  367.                      if(!xfg)xgq=1;                            //如果下閥沒在關的位置,下閥關電機啟動

  368.                      else xgq=0;                                   //或者關下閥電機停止

  369.               }

  370.        }

  371.       

  372.             





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

  374.        {

  375.               flg2=1;                     //置倒計時標志位為1

  376.               if(sfk)flg2=0;       //如果上閥在開位置,倒計時標志位清0

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

  378.               {

  379.               if((fqwz==0)&sfg)         //倒計時數等于0時間到,上閥還在關的位置

  380.             

  381.                  {       sd1=1;

  382.                        while(sd1)                              //如果設定數為(內參)進行循環顯示錯誤碼

  383.                      {

  384.                             error();                       //錯誤函數

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

  386.                             skq=0;                                             //關上閥開電機

  387.                      }

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

  389.               }                    

  390.                  }

  391.        }

  392.           if(sgq)                             //如果上閥關電機得電,

  393.        {

  394.               flg2=1;                     //置倒計時標志位為1

  395.               if(sfg)flg2=0;              //如果上閥在關位置,倒計時標志位清0

  396.               else                            //如果上閥沒在關的位置

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

  398.               {       sd1=1;

  399.                        while(sd1)                //如果設定數為(內參)進行循環顯示錯誤碼

  400.                      {

  401.                             error();              //錯誤函數

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

  403.                             sgq=0;                                          //關上閥關電機

  404.                      }

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

  406.               }                    

  407.                

  408.        }

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

  410.        {

  411.               flg2=1;                     //置倒計時標志位為1

  412.               if(xfk)flg2=0;                       //置倒計時標志位為1

  413.               else if((fqwz==0)&xfg)         //倒計時數等于0時間到,下閥還在關的位置

  414.               {       sd1=1;

  415.                        while(sd1)                       //如果設定數為(內參)進行循環顯示錯誤碼

  416.                      {

  417.                             error();                 //錯誤函數

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

  419.                             xkq=0;                                            //關下閥關電機

  420.                      }                                                      

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

  422.               }                    

  423.                

  424.        }

  425.               if(xgq)                            //如果下閥關電機得電,

  426.        {

  427.               flg2=1;                        //置倒計時標志位為1

  428.               if(xfg)flg2=0;                     //置倒計時標志位為1

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

  430.               {       sd1=1;

  431.                        while(sd1)                     //如果設定數為(內參)進行循環顯示錯誤碼

  432.                      {

  433.                             error();                //錯誤函數

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

  435.                             skq=0;

  436.                      }                                                          //關下閥開電機

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

  438.               }                    

  439.                

  440.        }

  441. }

  442. /*************待機狀態*************/

  443. void jsdaiji()

  444. {

  445.     uchar a,b,c,d;

  446.             a=js_jg/10;                                   //計時間隔十位

  447.          b=js_jg%10;                                   //計時間隔個位

  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);                     //顯示間隔數字十位

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

  455.          }      

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

  457.       {

  458.            display(11,7);

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

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

  461.          }                     

  462. }



  463. /**********計時工作運行函數***************/

  464. void jsigzuo()

  465. {

  466.   

  467.      uchar a,b,c,d;

  468.       

  469.        yx_led=0;                              //運行燈點亮

  470.        a=jsjg/10;                                   //計時間隔十位

  471.        b=jsjg%10;                                   //計時間隔個位

  472.        c=e/10;

  473.        d=e%10;

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

  475.        {      

  476.                  flg=0;                    //計時工作減標志位置0

  477.          if(jsjg==0)                 //如果計時間隔數值倒計時為0

  478.            {

  479.                 e=js_gz;                        //把計時工作時間重新賦給E

  480.                 TR1=0;                        //關閉定時器1,停止計時間隔倒計時

  481.               }

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

  483.        display(14,7);                       //點小數點

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

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



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

  487.           {

  488.                         skq=0;                                   //開上閥電機停

  489.                      xkq=0;                                   //開下閥電機停

  490.                      sgq=0;                                   //關上閥電機停

  491.                      xgq=0;                                   //關下閥電機停

  492.           }

  493.           else

  494.            {

  495.                      switch(x)

  496.                 {

  497.                     case 0:                                   //狀態等于0執行上閥開動作

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

  499.                            else

  500.                              {

  501.                                   skq=0;                            //或者上開閥電機停

  502.                                   flg1=1;                            //閥開到位倒計時標志位

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

  504.                                 }

  505.                              }       break;            

  506.                  case 1:                     //如果狀態是1執行上閥關

  507.                        {

  508.                               flg1=0;              //閥開到位倒計時標志位            

  509.                         sgq=1;                            //上閥關電機啟動

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

  511.                                 {

  512.                                    sgq=0;              //上閥關電機啟動

  513.                                    x=3;                  //改狀態為3

  514.                                 }

  515.                        } break;               

  516.                           case 3:                            //如果狀態為3執行下閥開電機啟動

  517.                

  518.                            {

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

  520.                                  else

  521.                                        {

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

  523.                                       flg1=1;              //閥開到位倒計時標志位

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

  525.                                     }

  526.                               }

  527.                                   break;

  528.                        case 4:                                   //狀態字為4執行下閥關

  529.                              {

  530.                                   flg1=0;                     //閥開到位倒計時標志位

  531.                                   if(xfk==1) xgq=1;         //如果狀態為4下閥關電機啟動

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

  533.                                    {

  534.                                        xgq=0;         //下閥關電機停

  535. //                                       z=0;

  536.                                        x=0;         //狀態字改為0

  537.                                 }

  538.                           }break;

  539.                 }

  540.               }

  541.     }

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

  543.      {                                       

  544.            

  545.               flg=1;                             //置計時工作減標志為1

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

  547.               display(14,7);

  548.               display(c,2);

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

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

  551.               {

  552.                  jsjg=js_jg;                 //重新給計時間隔賦值

  553.                  TR1=1;                        //開定時器1,啟動計時間隔減



  554.               }

  555.          switch(x)

  556.          {

  557.            case 0:                                   //狀態等于0執行上閥開動作

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

  559.                else

  560.                   {

  561.                         skq=0;                            //或者上開閥電機停

  562.                         flg1=1;                            //閥開到位倒計時標志位

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

  564.                      }

  565.               }       break;            

  566.         case 1:                     //如果狀態是1執行上閥關

  567.             {

  568.                    flg1=0;              //閥開到位倒計時標志位            

  569.              sgq=1;                            //上閥關電機啟動

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

  571.                        {

  572.                         sgq=0;              //上閥關電機啟動

  573.                         x=3;                  //改狀態為3

  574.                        }

  575.              } break;               

  576.                  case 3:                            //如果狀態為3執行下閥開電機啟動

  577.                

  578.                   {

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

  580.                         else

  581.                                {

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

  583.                                flg1=1;              //閥開到位倒計時標志位

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

  585.                             }

  586.                        }

  587.                        break;

  588.               case 4:                                   //狀態字為4執行下閥關

  589.                   {

  590.                      flg1=0;                     //閥開到位倒計時標志位

  591.                      if(xfk==1) xgq=1;         //如果狀態為4下閥關電機啟動

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

  593.                             {

  594.                                        xgq=0;         //下閥關電機停

  595.               //                         z=0;

  596.                                        x=0;         //狀態字改為0

  597.                           }

  598.                   }break;

  599.            }

  600.        }               

  601. }



  602. /*****************計數待機模式********************/

  603. void jsudaiji()

  604. {            

  605.        uchar a,b;

  606.           a=jisu/10;

  607.           b=jisu%10;                           

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

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

  610.        display(b,1);                     //顯示倒計數數字個位

  611. }

  612. /****************計數模式運行函數*****************/

  613. void jsugzuo()

  614. {

  615.        uchar a,b,c,d;

  616.        a=jisu/10;

  617.        b=jisu%10;

  618.        yx_led=0;                                 //運行燈點亮

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

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

  621.      display(d,1);                     //顯示倒計數數字個位



  622. }



  623. /************計時計數工作模式數值調整************/

  624. void jstz()

  625. {

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

  627.        if((ms==0)&(~qiting)&(seding==1))                 //如果工作在計時待機模式,調整間隔數值

  628.        {

  629.           a=js_jg/10;

  630.           b=js_jg%10;

  631.          

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

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

  634.            {

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

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

  637.               }

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

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

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

  641.            {

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

  643.            }                    

  644.        }

  645.        if((ms==0)&(~qiting)&(seding==2))  //如果工作在計時待機模式,調整計時工作數值

  646.        {

  647.           c=js_gz/10;

  648.           d=js_gz%10;

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

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

  651.            {

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

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

  654.               }

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

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

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

  658.            {

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

  660.            }

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

  662.        }

  663.        if((ms==1)&(~qiting)&(seding==1))//如果工作在計數待機模式,調整計數數值      

  664.        {

  665.            e=jisu/10;

  666.               f=jisu%10;

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

  668.         if(dj)

  669.               {

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

  671.             display(f,1);                     //顯示倒計數數字個位

  672.               }

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

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

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

  676.            {

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

  678.            }

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

  680.        }                    

  681. }

  682. /*********定時器0初始化***********/

  683. void initime0()

  684. {

  685.     TMOD=0X11;             //開啟定時器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;                               //開定時器0中斷

  692.        ET1=1;

  693.        TR0=1;

  694.        TR1=1;                               //啟動定時器0

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

  696.        ys=ys1;                //閥門電機得電多久沒到位時間賦值

  697. }

  698. /****************計時,計數變量賦值*******************/

  699. void fz()

  700. {

  701.       

  702. }



  703. void main()

  704. {      

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

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

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

  708.          while(1)                                            //大循環

  709.        {        

  710.          

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

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

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

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

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

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

  717.     //       else

  718.       

  719.            {      

  720.                     jstz();                                //計時數值調整函數

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

  722.                      {

  723.                         jsdaiji();                                            //計時待機

  724.                         jsjg=js_jg;                                          //把設定的好的計時間隔時間傳遞給計時間隔變量

  725.                         e=js_gz;

  726.                      }

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

  728.                      {

  729.                         jsigzuo();                   //計時工作函數

  730.             

  731.                      }

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

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

  734.            }

  735.        }

  736. }

  737.    /**********定時器0中斷函數***************/

  738. void time0()interrupt 1

  739. {

  740.     static a,er;                                   //定義靜態變量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;              //錯誤顯示如果ER變量中斷大于等于30次

  749.        }

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

  751.        {

  752.               a=0;                                   //A清0

  753.               if(flg1)time--;                     //閥門開到位等待標志位是1,倒計時減1

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

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

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

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

  758.               if(flg)                                   //如果計時工作變量標志是1

  759.               {

  760.                      e--;                            //計時工作變量E減1

  761.               }

  762.               if(flg2)fqwz--;

  763.               else fqwz=fqwz2;                                 

  764.        }

  765. }

  766. /**********定時器1中斷函數****************/

  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--;                       //計時間隔變量減1

  777.                     

  778.        }

  779. }
復制代碼



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠躁躁夜夜躁波多野结依 | 99精品一区二区 | 一区二区三区久久 | 国产成人精品视频 | 久久久久综合 | 欧美激情亚洲 | 欧美日本免费 | 国产精品日本一区二区不卡视频 | 久久国产高清 | 国产一区二区三区www | 色一情一乱一伦一区二区三区 | 中文字幕在线一区二区三区 | 国产精品一区在线 | 精品久久久久久久 | 三级在线免费观看 | 久久亚洲国产精品日日av夜夜 | 欧美综合一区二区三区 | 青青草视频网 | 精品欧美一区二区三区久久久 | 日韩在线观看中文字幕 | 国产h视频| 91一区二区三区在线观看 | 九色视频网站 | 一区二区国产精品 | 视频一区二区在线观看 | 国产资源在线播放 | 成人片免费看 | 亚洲精品粉嫩美女一区 | 久久青草av | 国产乱码精品一区二三赶尸艳谈 | 久久亚洲欧美日韩精品专区 | 色婷婷国产精品综合在线观看 | 亚洲黄色国产 | 免费视频久久久久 | 亚洲国产精品美女 | 日本精品视频在线 | 亚洲精品国产综合区久久久久久久 | 狠狠做深爱婷婷综合一区 | 日韩高清av | www.五月天婷婷.com | 国产天天操|