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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1664|回復: 1
收起左側

單片機控制4電機循環測試(數碼管顯示)構思與實現源代碼

[復制鏈接]
ID:308173 發表于 2019-4-12 23:56 | 顯示全部樓層 |閱讀模式
實驗構思:
      一,  兩位共陰數碼管4個,要求顯示范圍0.0~9.9  分別對應4個電機運行時間;  開機無顯示,
     當電機運行時,對應的數碼管從0開始計時,設定的時間到電機停止運行,數碼管保持停止時間上.當下個電機運行時熄滅.
      二 按鍵加減范圍1~99  ,按設置鍵3秒進入電機1時間設置 ,(K_SET) 進入設置后,上次設置的數字閃爍, 用 K_UP和K_DN進行數字加減; 步進1,相當于時間0.1秒, 步數100個(0~99);進入設置后,再按設置鍵,每按一次,進行電機1,2,3,4,1.....循環,同時對應的數碼管閃爍,分別顯示AA,BB,CC,DD來區分,按下設置鍵,或者設置完成后3秒無任何按鍵操作;保存當前數據并退出設置狀態. ,在設置的時候不得影響程序的正常運行,設置保存后,程序立即運行新設置的數據.                                                        
           P0               P0            P0            P0                                      
         P1^1  P1^0      P1^3 P1^2    P1^5  P1^4   P1^7  P1^6
         數碼顯示1       數碼顯示2     數碼顯示3    數碼顯示4                                                           
                                                                                      
開始----------->電機1-------------->電機2---------->電機3-------------電機4-------------->擋桿
PIN_POW   PIN_DJA      PIN_DJB      PIN_DJC      PIN_DJD        PIN_STOP
P2^2          P2^3          P2^4         P2^5          P2^6              P2^7                           
       控制1         控制2                                    控制3                             
     PA1   P3^0      PA2    P3^1                           PA3^2                 
K_POW按一次開機,再按一次停機.   K_POW=P3^4, K_SET=P3^5,   K_UP=P3^6,   K_DN=P3^7,
控制觸發是低電平有效   輸出為低電平            單片機STC89C52   程序C,不要匯編等.
工作過程:
        開始(PIN_POW=0,其他=1),等待控制1觸發,
        控制1觸發 (PIN_POW=1,PIN_STOP=0, PIN_DJA =0)
        電機1運轉時間到,PIN_DJA =1,等待控制2觸發.
        控制2觸發.PIN_DJB =0,
        電機2運轉時間到 PIN_DJB =1,PIN_DJC =0,電機3接著運行
        電機3運轉時間到 PIN_DJC =1,PIN_DJD =0,電機4接著運行
        電機4運轉時間到 PIN_DJD =1,等待控制3觸發.
        控制3觸發.PIN_STOP=1,PIN_POW=0,.
  整個過程無限循環,只有有開關機鍵控制;
按關機鍵后,等運行到PIN_POW=0時關機,不得在工作過程中途停機.

要求主程序和子程序分類;建立單獨的.h文件.此設計中需要設置的數據保存,斷電重新開機運行的是上次修改的參數.不得每次開機重新設定.
腳位功能在程序中直接定義,除數碼管P0口外,其他單個腳位不得使用代碼代替;

以上是題目,貼出全部單片機代碼
  1. main.c

  2. #include<STC15F2K60S2.H>
  3. #include"delay.h"
  4. #include"dj.h"
  5. #include"key.h"
  6. #include "eeprom.h"

  7. uint  time_DJA=3000;
  8. uint  time_DJB=3000;
  9. uint  time_DJC=3000;
  10. uint  time_DJD=3000;
  11. extern bit flag_DJA1;
  12. extern bit flag_DJB1;
  13. extern bit flag_DJC1;
  14. extern bit flag_DJD1;
  15. extern bit flag_kaiguan;


  16. sbit PA1=P2^0;
  17. sbit PA2=P3^6;
  18. sbit PA3=P3^7;

  19. void main()
  20. {
  21.         Init_Timer0();
  22.         PA1=1;                 //測試的時候用的
  23.         PA2=1;                  //測試的時候用的
  24.         PA3=1;                //測試的時候用的
  25.         /*初始值從EEPROM 中讀取*/
  26.         time_DJA=iap_READ(iap_ADDRESS)*1000+iap_READ(iap_ADDRESS+1)*100+iap_READ(iap_ADDRESS+2)*10+iap_READ(iap_ADDRESS+3);
  27.         time_DJB=iap_READ(iap_ADDRESS+4)*1000+iap_READ(iap_ADDRESS+5)*100+iap_READ(iap_ADDRESS+6)*10+iap_READ(iap_ADDRESS+7);
  28.         time_DJC=iap_READ(iap_ADDRESS+8)*1000+iap_READ(iap_ADDRESS+9)*100+iap_READ(iap_ADDRESS+10)*10+iap_READ(iap_ADDRESS+11);
  29.         time_DJD=iap_READ(iap_ADDRESS+12)*1000+iap_READ(iap_ADDRESS+13)*100+iap_READ(iap_ADDRESS+14)*10+iap_READ(iap_ADDRESS+15);
  30. while(1)
  31. {
  32.         Key();        // 檢測開關是否按下,開關打開,開始執行下面的代碼
  33.         if(flag_kaiguan==1)
  34.         {
  35.                 PIN_STOP=1;                           //停止指示燈
  36.                  PIN_POW=0;                           //開始指示燈
  37.                 delay_ms(50);//延時程序時間定義50ms,
  38.                 if(PA1==1)                  //PA1觸發來到執行下面的代碼,相當于開門
  39.                 {
  40.                         PIN_POW=1;
  41.                         PIN_STOP=0;
  42.                         DJA();                                        //電機1開始執行
  43.                         while(flag_DJA1==0)Key();        //等待電機1執行完畢
  44. //                        delay_ms(1000);                          //測試的時候用的,假設1秒后觸發信號2來到了
  45.                         while(PA2==0);                          //等待觸發信號2來
  46.                         if(PA2==1)
  47.                         {
  48.                                 DJB();                                           //電機B開始執行
  49.                                 while(flag_DJB1==0)Key();  //等待電機B執行結束
  50.                                 DJC();                                           //同理
  51.                                 while(flag_DJC1==0)Key();
  52.                                 DJD();
  53.                                 while(flag_DJD1==0)Key();
  54. //                                delay_ms(1000);                          //測試的時候用的假設1秒后觸發信號3來到
  55.                                 while(PA3==0);
  56.                                 if(PA3==1)
  57.                                 {
  58.                                         PIN_STOP=1;
  59.                                         PIN_POW=0;
  60.                                 //        PA1=0;               
  61.                                 }               
  62.                         }        
  63.                 }
  64.     }
  65.         else TR0=0;P0=0X00;         //開關關閉的時候把定時器關閉,數碼管再清空
  66. }

  67. ///*下面的代碼可以用來第一次向EEPROM中寫入數據,以后都不會用到所以注釋掉*/
  68. //                        iap_ERASE(iap_ADDRESS);                                   
  69. //                        iap_PROGRAM(iap_ADDRESS,3000/1000);
  70. //                        iap_PROGRAM(iap_ADDRESS+1,3000/100%10);                        
  71. //                        iap_PROGRAM(iap_ADDRESS+2,3000/10%10);
  72. //                        iap_PROGRAM(iap_ADDRESS+3,3000%10);
  73. //                        
  74. //                        iap_PROGRAM(iap_ADDRESS+4,3000/1000);
  75. //                        iap_PROGRAM(iap_ADDRESS+5,3000/100%10);                        
  76. //                        iap_PROGRAM(iap_ADDRESS+6,3000/10%10);
  77. //                        iap_PROGRAM(iap_ADDRESS+7,3000%10);
  78. //                                
  79. //                        iap_PROGRAM(iap_ADDRESS+8,3000/1000);
  80. //                        iap_PROGRAM(iap_ADDRESS+9,3000/100%10);                        
  81. //                        iap_PROGRAM(iap_ADDRESS+10,3000/10%10);
  82. //                        iap_PROGRAM(iap_ADDRESS+11,3000%10);
  83. //
  84. //                        iap_PROGRAM(iap_ADDRESS+12,3000/1000);
  85. //                        iap_PROGRAM(iap_ADDRESS+13,3000/100%10);                        
  86. //                        iap_PROGRAM(iap_ADDRESS+14,3000/10%10);
  87. //                        iap_PROGRAM(iap_ADDRESS+15,3000%10);                                
  88. //                        while(1);
  89. }



  90. key.c

  91. #include"key.h"
  92. extern  uint  time_DJA;
  93. extern  uint  time_DJB;
  94. extern  uint  time_DJC;
  95. extern  uint  time_DJD;

  96. bit flag_key1=0;  //設置鍵被按下三秒
  97. bit flag_anjian=0;  // 用于標記有按鍵按下,三秒無按鍵按下則退出設置界面
  98. bit flag_kaiguan=0;  //開關鍵1是開機,0是關機
  99. uint key_num=1;

  100. void  Key()
  101. {
  102.                 if(K_SET ==0  && flag_key1==0)                         //檢查P3.7端口是否為低電平,即檢測S17是否被按下
  103.                 {                                                
  104.                         delay_ms(2000);                         //再次檢測S17是否被按下
  105.                         if(K_SET ==0)
  106.                         {
  107.                                 while(K_SET == 0); //等待按鍵釋放
  108.                                 flag_key1=1;
  109.                         }
  110.                 }
  111.         if(flag_key1==1)
  112.         {
  113.                 if(K_SET == 0)                         //檢查P3.7端口是否為低電平,即檢測S17是否被按下
  114.                 {                                                 //延時一定時間,去抖
  115.                         delay_ms(10);                         //再次檢測S17是否被按下
  116.                         if(K_SET == 0)
  117.                         {
  118.                                 while(K_SET == 0); //等待按鍵釋放
  119.                                 key_num++;
  120.                                 flag_anjian=1;
  121.                                 if(key_num==5)
  122.                                 {
  123.                                         key_num=1;        
  124.                                 }
  125.                         }
  126.                 }                        
  127.         }
  128.         
  129.         if(flag_key1==1)
  130.         {
  131.                 if(K_UP == 0)                         //檢查P3.7端口是否為低電平,即檢測S17是否被按下
  132.                 {                                                 //延時一定時間,去抖
  133.                         delay_ms(10);                         //再次檢測S17是否被按下
  134.                         if(K_UP == 0)
  135.                         {
  136.                                 while(K_UP == 0); //等待按鍵釋放
  137.                                 flag_anjian=1;
  138.                                 switch(key_num)
  139.                                 {
  140.                                         case 1:
  141.                                         time_DJA+=100;
  142.                                         break;
  143.                                         case 2:
  144.                                         time_DJB+=100;
  145.                                         break;
  146.                                         case 3:
  147.                                         time_DJC+=100;
  148.                                         break;
  149.                                         case 4:
  150.                                         time_DJD+=100;
  151.                                         break;        
  152.                                 }
  153.                         }
  154.                 }
  155.                
  156.                 if(K_DN == 0)                         //檢查P3.7端口是否為低電平,即檢測S17是否被按下
  157.                 {                                                 //延時一定時間,去抖
  158.                         delay_ms(10);                         //再次檢測S17是否被按下
  159.                         if(K_DN == 0)
  160.                         {
  161.                                 while(K_DN == 0); //等待按鍵釋放
  162.                                 flag_anjian=1;
  163.                                 switch(key_num)
  164.                                 {
  165.                                         case 1:
  166.                                         time_DJA-=100;
  167.                                         break;
  168.                                         case 2:
  169.                                         time_DJB-=100;
  170.                                         break;
  171.                                         case 3:
  172.                                         time_DJC-=100;
  173.                                         break;
  174.                                         case 4:
  175.                                         time_DJD-=100;
  176.                                         break;        
  177.                                 }
  178.                         }
  179.                 }                        
  180.         }
  181.         
  182.         
  183.         /*開關按鍵代碼*/
  184.                 if(K_POW ==0 )                         //檢查P3.7端口是否為低電平,即檢測S17是否被按下
  185.                 {                                                
  186.                         delay_ms(10);                         //再次檢測S17是否被按下
  187.                         if(K_POW ==0)
  188.                         {
  189.                                 while(K_POW == 0); //等待按鍵釋放
  190.                                 flag_kaiguan=~flag_kaiguan;
  191.                         }
  192.                 }        
  193.                         
  194. }


  195. delay.c


  196. #include"delay.h"
  197. /*==========================================================
  198. 函數名稱:void delayms(void)
  199. 形    參:無
  200. 返回值  :無
  201. 功能描述:1ms延時
  202. 時    間:2015-11-19
  203. 使    用:delayms();
  204. ==========================================================*/
  205. void delayms(void)                //@11.0592MHz
  206. {
  207.         unsigned char i,j;
  208.         _nop_();
  209.         _nop_();
  210.         _nop_();
  211.         i = 11;
  212.         j = 190;
  213.         do
  214.         {
  215.                 while (--j);
  216.         }
  217.         while (--i);
  218. }

  219. void delay_ms(unsigned int time)
  220. {
  221.         unsigned int i;
  222.         for(i=0;i<time;i++)
  223.                 delayms();
  224. }


  225. dj.c

  226. #include"dj.h"
  227. #include"key.h"
  228. #include "eeprom.h"
  229. extern uint key_num;
  230. extern bit flag_key1;
  231. extern uint key_num;
  232. extern bit flag_anjian;
  233. extern uint  time_DJA;
  234. extern uint  time_DJB;
  235. extern uint  time_DJC;
  236. extern uint  time_DJD;

  237. bit flag_DJA=0;          //定時器運行電機A的代碼
  238. bit flag_DJA1=0;  //電機進入一次DJA()后主模塊就不第二次進去了

  239. bit flag_DJB=0;          //定時器運行電機B的代碼
  240. bit flag_DJB1=0;  //電機進入一次DJB()后主模塊就不第二次進去了

  241. bit flag_DJC=0;          //定時器運行電機C的代碼
  242. bit flag_DJC1=0;  //電機進入一次DJC()后主模塊就不第二次進去了

  243. bit flag_DJD=0;          //定時器運行電機D的代碼
  244. bit flag_DJD1=0;  //電機進入一次DJD()后主模塊就不第二次進去了

  245. uint num=0;
  246. uint num1=0;
  247. uint num2=0;  //用于在設置模式定時三秒,沒有操作則退出設置模式
  248. uchar SMG_N[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};             // 共陰極數碼管

  249. uchar shu_1,shu_2,shu_3,shu_4,shu_5,shu_6,shu_7,shu_8;

  250. void DJA()
  251. {
  252.         TR0=1;// 定時器0打開
  253.         num=0;
  254.         PIN_DJA=0;
  255.         flag_DJD=0;
  256.         flag_DJD1=0;
  257.         flag_DJA=1;
  258.                
  259. }

  260. void DJB()
  261. {
  262.         TR0=0;// 定時器0關閉                 //還原定時器0
  263.         TH0=(65536-45872)/256;                    //11.0592 晶振定時50ms還原定時器0
  264.         TL0=(65536-45872)%256;                 //還原定時器0
  265.         num=0;                                                 //還原定時器0
  266.         flag_DJA=0;                                         //還原A的標志位
  267.         flag_DJA1=0;                                         //還原A的標志位
  268.         PIN_DJB=0;                                         
  269.         flag_DJB=1;
  270.         TR0=1;
  271.                
  272. }

  273. void DJC()
  274. {
  275.         TR0=0;// 定時器0關閉
  276.         TH0=(65536-45872)/256;                    //11.0592 晶振定時50ms
  277.         TL0=(65536-45872)%256;
  278.         num=0;
  279.         flag_DJB=0;                                         //還原B的標志位
  280.         flag_DJB1=0;                                         //還原B的標志位
  281.         PIN_DJC=0;
  282.         flag_DJC=1;
  283.         TR0=1;
  284.                
  285. }

  286. void DJD()
  287. {
  288.         TR0=0;// 定時器0關閉
  289.         TH0=(65536-45872)/256;                    //11.0592 晶振定時50ms
  290.         TL0=(65536-45872)%256;
  291.         num=0;
  292.         flag_DJC=0;                                         //還原C的標志位
  293.         flag_DJC1=0;                                        //還原C的標志位
  294.         PIN_DJD=0;
  295.         flag_DJD=1;
  296.         TR0=1;        
  297. }


  298.   void time0() interrupt 1         
  299. {
  300.                   TH0=(65536-9216)/256;                    //11.0592 晶振定時50ms
  301.                 TL0=(65536-9216)%256;
  302.                 num++;num1++;                                 //num1控制數碼管顯示num控制電機什么時候停止

  303. /*電機A的代碼******************************************************************/
  304.                 if(flag_DJA==1)
  305.                 {
  306.                         if(num>=(time_DJA/10))          //time_DJA是電機A轉動的時間,單位為ms
  307.                         {
  308.                                 PIN_DJA=1;
  309.                                 flag_DJA1=1;
  310.                                 num=0;        
  311.                         }
  312.                         if(PIN_DJA==0)                                 //如果電機在運行則說明數碼管數子還在跳動
  313.                         {
  314.                                 shu_1=(num/10)/10;
  315.                                 shu_2=(num/10)%10;
  316.                         }
  317.                         else
  318.                         {
  319.                                 shu_1=(time_DJA/100)/10;
  320.                                 shu_2=(time_DJA/100)%10;                                                        
  321.                         }
  322.                         if(num1==1 && flag_key1==0)
  323.                         {
  324.                                 P0=0X00;
  325.                                 P1=0xfe;
  326.                                 P0=SMG_N[shu_1]+128;
  327.                         }
  328.                         if(num1==2 && flag_key1==0 )
  329.                         {
  330.                                 num1=0;
  331.                                 P0=0X00;
  332.                                 P1=0xfd;
  333.                                 P0=SMG_N[shu_2];
  334.                         }
  335.                 }
  336. /******************************************************************************/

  337. /*********************************************************************************/
  338. /*d電機B的代碼 *******************************************************************/
  339.                 if(flag_DJB==1)
  340.                 {
  341.                         if(num>=(time_DJB/10))          //time_DJA是電機A轉動的時間,單位為ms
  342.                         {
  343.                                 PIN_DJB=1;
  344.                                 flag_DJB1=1;
  345.                                 num=0;        
  346.                         }
  347.                         if(PIN_DJB==0)                                 //如果電機在運行則說明數碼管數子還在跳動
  348.                         {
  349.                                 shu_3=(num/10)/10;
  350.                                 shu_4=(num/10)%10;
  351.                         }
  352.                         else
  353.                         {
  354.                                 shu_1=(time_DJB/100)/10;
  355.                                 shu_2=(time_DJB/100)%10;                                                        
  356.                         }
  357.                         if(num1==1 && flag_key1==0  )
  358.                         {
  359.                                 P0=0X00;
  360.                                 P1=0xfb;
  361.                                 P0=SMG_N[shu_3]+128;
  362.                         }
  363.                         if(num1==2 && flag_key1==0 )
  364.                         {
  365.                                 num1=0;
  366.                                 P0=0X00;
  367.                                 P1=0xf7;
  368.                                 P0=SMG_N[shu_4];
  369.                         }

  370.                 }
  371. /****************************************************************************/



  372. /*d電機C的代碼 *******************************************************************/
  373.                 if(flag_DJC==1)
  374.                 {
  375.                         if(num>=(time_DJC/10))          //time_DJA是電機A轉動的時間,單位為ms
  376.                         {
  377.                                 PIN_DJC=1;
  378.                                 flag_DJC1=1;
  379.                                 num=0;        
  380.                         }
  381.                         if(PIN_DJC==0)                                 //如果電機在運行則說明數碼管數子還在跳動
  382.                         {
  383.                                 shu_5=(num/10)/10;
  384.                                 shu_6=(num/10)%10;
  385.                         }
  386.                         else
  387.                         {
  388.                                 shu_5=(time_DJC/100)/10;
  389.                                 shu_6=(time_DJC/100)%10;                                                        
  390.                         }
  391.                         if(num1==1  && flag_key1==0 )
  392.                         {
  393.                                 P0=0X00;
  394.                                 P1=0xef;
  395.                                 P0=SMG_N[shu_5]+128;
  396.                         }
  397.                         if(num1==2  && flag_key1==0 )
  398.                         {
  399.                                 num1=0;
  400.                                 P0=0X00;
  401.                                 P1=0xdf;
  402.                                 P0=SMG_N[shu_6];
  403.                         }

  404.                 }
  405. /****************************************************************************/

  406.          /*d電機D的代碼 *******************************************************************/
  407.                 if(flag_DJD==1)
  408.                 {
  409.                         if(num>=(time_DJD/10))          //time_DJA是電機A轉動的時間,單位為ms
  410.                         {
  411.                                 PIN_DJD=1;
  412.                                 flag_DJD1=1;
  413.                                 num=0;        
  414.                         }
  415.                         if(PIN_DJD==0)                                 //如果電機在運行則說明數碼管數子還在跳動
  416.                         {
  417.                                 shu_7=(num/10)/10;
  418.                                 shu_8=(num/10)%10;
  419.                         }
  420.                         else
  421.                         {
  422.                                 shu_7=(time_DJD/100)/10;
  423.                                 shu_8=(time_DJD/100)%10;                                                        
  424.                         }
  425.                         if(num1==1 && flag_key1==0 )
  426.                         {
  427.                                 P0=0X00;
  428.                                 P1=0xBf;
  429.                                 P0=SMG_N[shu_7]+128;
  430.                         }
  431.                         if(num1==2 && flag_key1==0 )
  432.                         {
  433.                                 num1=0;
  434.                                 P0=0X00;
  435.                                 P1=0x7f;
  436.                                 P0=SMG_N[shu_8];
  437.                         }

  438.                 }
  439. /****************************************************************************/

  440. /*按下設置鍵后數碼管顯示的代碼*/
  441. if(flag_key1==1)
  442. {
  443.          switch(key_num)
  444.         {
  445.                 case 1:
  446.                         if(num1==1)
  447.                         {
  448.                                 P0=0X00;
  449.                                 P1=0xfe;
  450.                                 P0=SMG_N[(time_DJA/100)/10]+128;
  451.                         }
  452.                         if(num1==2)
  453.                         {
  454.                                 num1=0;
  455.                                 P0=0X00;
  456.                                 P1=0xfd;
  457.                                 P0=SMG_N[(time_DJA/100)%10];
  458.                         }break;
  459.                 case 2:
  460.                         if(num1==1)
  461.                         {
  462.                                 P0=0X00;
  463.                                 P1=0xfb;
  464.                                 P0=SMG_N[(time_DJB/100)/10]+128;
  465.                         }
  466.                         if(num1==2)
  467.                         {
  468.                                 num1=0;
  469.                                 P0=0X00;
  470.                                 P1=0xf7;
  471.                                 P0=SMG_N[(time_DJB/100)%10];
  472.                         }break;
  473.                 case 3:
  474.                         if(num1==1)
  475.                         {
  476.                                 P0=0X00;
  477.                                 P1=0xef;
  478.                                 P0=SMG_N[(time_DJC/100)/10]+128;
  479.                         }
  480.                         if(num1==2)
  481.                         {
  482.                                 num1=0;
  483.                                 P0=0X00;
  484.                                 P1=0xdf;
  485.                                 P0=SMG_N[(time_DJC/100)%10];
  486.                         }break;
  487.                 case 4:
  488.                         if(num1==1)
  489.                         {
  490.                                 P0=0X00;
  491.                                 P1=0xbf;
  492.                                 P0=SMG_N[(time_DJD/100)/10]+128;
  493.                         }
  494.                         if(num1==2)
  495.                         {
  496.                                 num1=0;
  497.                                 P0=0X00;
  498.                                 P1=0x7f;
  499.                                 P0=SMG_N[(time_DJD/100)%10];
  500.                         }break;                        
  501.         }
  502. }

  503. /* 進入設置后三秒沒有操作自動退出并且把數據保存到EEPROM*/
  504.          if(flag_key1==1)
  505.         {
  506.                 num2++;
  507.                 if(num2==300)
  508.                 {
  509.                         flag_key1=0;
  510.                         iap_ERASE(iap_ADDRESS);
  511.                         iap_PROGRAM(iap_ADDRESS,time_DJA/1000);
  512.                         iap_PROGRAM(iap_ADDRESS+1,time_DJA/100%10);                        
  513.                         iap_PROGRAM(iap_ADDRESS+2,time_DJA/10%10);
  514.                         iap_PROGRAM(iap_ADDRESS+3,time_DJA%10);
  515.                         
  516.                         iap_PROGRAM(iap_ADDRESS+4,time_DJB/1000);
  517.                         iap_PROGRAM(iap_ADDRESS+5,time_DJB/100%10);                        
  518.                         iap_PROGRAM(iap_ADDRESS+6,time_DJB/10%10);
  519.                         iap_PROGRAM(iap_ADDRESS+7,time_DJB%10);
  520.                                 
  521.                         iap_PROGRAM(iap_ADDRESS+8,time_DJC/1000);
  522.                         iap_PROGRAM(iap_ADDRESS+9,time_DJC/100%10);                        
  523.                         iap_PROGRAM(iap_ADDRESS+10,time_DJC/10%10);
  524.                         iap_PROGRAM(iap_ADDRESS+11,time_DJC%10);

  525.                         iap_PROGRAM(iap_ADDRESS+12,time_DJD/1000);
  526.                         iap_PROGRAM(iap_ADDRESS+13,time_DJD/100%10);                        
  527.                         iap_PROGRAM(iap_ADDRESS+14,time_DJD/10%10);
  528.                         iap_PROGRAM(iap_ADDRESS+15,time_DJD%10);                        
  529.                 }

  530.                 if(flag_anjian==1)
  531.                 {
  532.                         flag_anjian=0;
  533.                         num2=0;        
  534.                 }
  535.                
  536.         }
  537. }

  538. void Init_Timer0(void)
  539. {
  540.                 AUXR=0X00;                                //定時器0 定時器 1工作在12分頻  即1T
  541.                 TMOD=0x11;                        //定時器0 和定時器1 不可自動重裝載模式
  542.                 TH0=(65536-9216)/256;                    //11.0592 晶振定時50ms
  543.                 TL0=(65536-9216)%256;
  544.                 TL1 = (65536-46080)/256;         //        11.0592 晶振定時20ms
  545.                 TH1 = (65536-46080)%256;        
  546.                 TR0=0;                         //定時器0關閉
  547.                 TR1 = 0;                //定時器1關閉
  548.                 ET0=1;                        //允許定時器0中斷
  549.                 ET1=1;                        //允許定時器1中斷
  550.                 EA=1;                           //開啟總中斷
  551. }


  552. eeprom.c


  553. #include "eeprom.h"

  554. //使硬件或軟件操作停止

  555. void iap_IDLE()

  556. {

  557.     IAP_CONTR=0;  //禁止IAP讀寫擦除

  558.     IAP_CMD=0;  //等待

  559.     IAP_TRIG=0;  //命令未觸發

  560.     IAP_ADDRH=0x80;  //高位數據地址

  561.     IAP_ADDRL=0;     //低位

  562. }

  563. //從數據里面讀取數據

  564. uchar iap_READ(uint addr)

  565. {   uchar datas;

  566.     IAP_CONTR=IAP_EN; //控制允許位

  567.     IAP_CMD=CMD_READ;   //寫入讀命令

  568.     IAP_ADDRL=addr;  //自定義地址

  569.     IAP_ADDRH=addr>>8;

  570.     IAP_TRIG=0x5a;  //命令有效

  571.     IAP_TRIG=0xa5;

  572.     _nop_();

  573.     datas=IAP_DATA;

  574.     iap_IDLE();

  575.     return datas;  //返回讀出的數據

  576. }

  577. //寫一個比特ISP寫到某個地方

  578. void iap_PROGRAM(uint addr,uchar datas)

  579. {

  580.     IAP_CONTR=IAP_EN;

  581.     IAP_CMD=CMD_PROGRAM;

  582.     IAP_ADDRL=addr;

  583.     IAP_ADDRH=addr>>8;

  584.     IAP_DATA=datas;

  585.     IAP_TRIG=0x5a;

  586.     IAP_TRIG=0xa5;

  587.     _nop_();

  588.     iap_IDLE();

  589. }

  590. //擦掉某個區域

  591. void iap_ERASE(uint addr)

  592. {

  593.     IAP_CONTR=IAP_EN;

  594.     IAP_CMD=CMD_ERASE;

  595.     IAP_ADDRL=addr;

  596.     IAP_ADDRH=addr>>8;

  597.     IAP_TRIG=0x5a;

  598.     IAP_TRIG=0xa5;

  599.     _nop_();

  600.     iap_IDLE();

  601. }
復制代碼

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:308173 發表于 2019-4-12 23:58 | 顯示全部樓層
新手,有更好的實現方式可以一起交流,一起進步
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线日韩中文字幕 | 国产激情在线观看 | 国产日韩久久 | 亚洲精品 在线播放 | 美女三区 | 日韩在线免费电影 | 97精品一区二区 | 国产一区二区在线免费 | av中文字幕在线 | 欧美久久一区二区 | 日本淫视频 | 欧美日韩精品免费观看 | 国产精品国产成人国产三级 | 国产区在线免费观看 | 黄免费观看| 国产伦一区二区三区久久 | 国产黄色精品在线观看 | 亚洲精品日韩在线观看 | 色成人免费网站 | 日韩高清一区 | 精品美女 | 亚洲+变态+欧美+另类+精品 | 国产精品美女久久久久久久网站 | 最新中文字幕久久 | 一区二区三区久久 | 欧美一区视频 | 一区二区在线不卡 | 久久精品免费看 | 国户精品久久久久久久久久久不卡 | 高清久久 | 91观看 | 国产精品亚洲片在线播放 | 男女搞网站 | 亚洲视频一区在线观看 | 国产一区二区影院 | 国产精品视频一二三区 | 欧美8一10sex性hd | 亚洲国产精品久久久久婷婷老年 | 伊人久久在线 | 瑟瑟免费视频 | 欧美一区二|