找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1230|回复: 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 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:308173 发表于 2019-4-12 23:58 | 只看该作者
新手,有更好的实现方式可以一起交流,一起进步
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表