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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3119|回復: 6
打印 上一主題 下一主題
收起左側

關于51單片機與AT24C02萬年歷設計EEPORM寫入失敗的疑問

[復制鏈接]
跳轉到指定樓層
樓主
ID:318173 發(fā)表于 2018-8-5 23:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
這個是用AT24C02和51單片機做得本來只差年的拆分了,其他部分都可以正常變化,因為AT24C02一個地址只能存一字節(jié),結果后來自己調的年月份都有問題,我直接在write_add里給除年以外的月份,日,小時賦正常值,結果有時只會有一個比如月份變化,其他的幾個沒變化,我懷疑是不是EEPORM有啥問題,為啥我直接賦值都沒變化,每次賦值后我還RESET了一下然后再重啟,求大佬解決一下,調了幾天了。
  1. /***************************************************
  2.      程序功能:實現(xiàn)一個萬年歷
  3.          拓展模塊:之后加GPS定位和溫度數(shù)據(jù)以及紅外遙控
  4. ***************************************************/
  5. #include<reg52.h>
  6. #include<string.h>
  7. #include<stdio.h>
  8. #define uchar unsigned char
  9. #define unit unsigned int

  10. unit nian;
  11. uchar yue,ri,shi,feng,miao;           //將這些數(shù)據(jù)定義為全局變量,因為等下會對他們進行計數(shù)
  12. unit num,num0;                           //通過對功能選擇鍵按的次數(shù)進行計數(shù)來選擇對年月日還是時分秒進行修改
  13. unit number;
  14. sbit lcden=P2^5;
  15. sbit lcdrs=P1^0;
  16. sbit RW=P1^1;
  17. sbit dula=P2^6;
  18. sbit wela=P2^7;
  19. sbit SDA=P2^0;
  20. sbit SCL=P2^1;
  21. sbit option=P3^4;
  22. sbit add=P3^5;
  23. sbit dcen=P3^6;
  24. sbit beef=P2^3;

  25. /*****************************
  26.          延遲函數(shù)
  27. *****************************/
  28. void delayms(unit ms)
  29. {
  30.    unit i,j;
  31.    for(i=ms;i>0;i--)
  32.    for(j=110;j>0;j--);
  33. }

  34. void delay()
  35. {

  36. }

  37. /******************************
  38.         初始化函數(shù)
  39. ******************************/
  40. void init()
  41. {
  42. EA=1;
  43. ET0=1;
  44. TMOD=0x01;
  45. TH0=(65536-50000)/256;
  46. TL0=(65536-50000)%256;
  47. TR0=1;
  48. }

  49. /******************************
  50.       蜂鳴器函數(shù)
  51. ******************************/
  52. void di()
  53. {
  54.    beef=0;
  55.    delayms(100);
  56.    beef=1;
  57. }
  58. ///////////////////////////////////////////////////////////////////////
  59. //                        1602模塊程序                                         //
  60. ///////////////////////////////////////////////////////////////////////



  61. /****************************
  62.         寫命令函數(shù)
  63. ****************************/     
  64. void write_com(uchar com)
  65. {
  66.   P0=0xff;
  67.   P0=com;
  68.   lcdrs=0;
  69.   RW=0;
  70.   delayms(5);
  71.   lcden=1;
  72.   delayms(5);
  73.   lcden=0;
  74. }

  75. /****************************
  76.         寫數(shù)據(jù)函數(shù)
  77. ****************************/
  78. void write_data(uchar Data)
  79. {
  80.    P0=0xff;
  81.    P0=Data;
  82.    lcdrs=1;
  83.    RW=0;
  84.    delayms(5);
  85.    lcden=1;
  86.    delayms(5);
  87.    lcden=0;
  88. }

  89. /*****************************
  90.        屏幕初始化函數(shù)      
  91. *****************************/
  92. void screen_init()
  93. {
  94.   dula=0;
  95.   wela=0;           ///關閉數(shù)碼管
  96.   write_com(0x38);
  97.   write_com(0x0e);
  98.   write_com(0x06);
  99.   write_com(0x01);
  100. }

  101. /*****************************
  102.         1602顯示函數(shù)
  103. *****************************/
  104. void display(unit nian,uchar yue,uchar ri,uchar shi,uchar feng,uchar miao)         //此函數(shù)的形參變化由中斷函數(shù)提供  
  105. {  
  106.    screen_init();

  107.    write_com(0x80);
  108.    write_data(nian/1000+0x30);

  109.    write_data(nian/100%10+0x30);

  110.    write_data(nian%100/10+0x30);

  111.    write_data(nian%10+0x30);

  112.    write_data('-');

  113.    write_data(yue/10+0x30);

  114.    write_data(yue%10+0x30);

  115.    write_data('-');

  116.    write_data(ri/10+0x30);

  117.    write_data(ri%10+0x30);




  118.    write_com(0x80+0x40);

  119.    write_data(shi/10+0x30);

  120.    write_data(shi%10+0x30);

  121.    write_data('-');

  122.    write_data(feng/10+0x30);

  123.    write_data(feng%10+0x30);

  124.    write_data('-');

  125.    write_data(miao/10+0x30);

  126.    write_data(miao%10+0x30);




  127. }


  128. //////////////////////////////////////////////////////////////////////////////////////
  129. //                          AT24C02模塊程序                                                                                        //
  130. //////////////////////////////////////////////////////////////////////////////////////

  131. /*****************************
  132.         啟動信號函數(shù)
  133. *****************************/
  134. void start()
  135. {
  136. SDA=1;
  137. delay();
  138. SCL=1;
  139. delay();
  140. SDA=0;
  141. delay();
  142. }

  143. /*****************************
  144.         終止信號函數(shù)
  145. *****************************/
  146. void stop()
  147. {
  148. SDA=0;
  149. delay();
  150. SCL=1;
  151. delay();
  152. SDA=1;
  153. delay();
  154. }

  155. /*****************************
  156.           應答函數(shù)
  157. *****************************/
  158. void response()
  159. {
  160.   unit i;
  161.   SCL=1;
  162.   delay();
  163.   while((SDA==1)&&(i<255))
  164.   i++;
  165.   SCL=0;
  166.   delay();
  167. }
  168. /*****************************
  169.       寫一字節(jié)函數(shù)
  170. *****************************/
  171. void write_byte(uchar Data)
  172. {
  173.   uchar temp;
  174.   uchar i;
  175.   temp=Data;
  176.   for(i=0;i<8;i++)
  177.   {
  178.      temp=temp<<1;
  179.      SCL=0;
  180.          delay();
  181.          SDA=CY;
  182.          delay();
  183.          SCL=1;
  184.          delay();
  185.   }
  186.   SCL=0;
  187.   delay();
  188.   SDA=1;
  189.   delay();
  190. }
  191. /****************************
  192.        讀一字節(jié)函數(shù)
  193. ****************************/
  194. uchar read_byte()
  195. {
  196. uchar i,k;
  197. SCL=0;
  198. delay();
  199. SDA=1;
  200. delay();
  201. for(i=0;i<8;i++)
  202. {
  203.   SCL=1;
  204.   delay();
  205.   k=(k<<1)|SDA;
  206.   SCL=0;
  207.   delay();
  208.   }
  209.   delay();
  210.   return k;
  211. }

  212. /*****************************
  213.        寫操作方式函數(shù)      
  214. *****************************/
  215. void write_add(uchar address,uchar Data)
  216. {
  217.    start();
  218.    write_byte(0xa0);
  219.    response();
  220.    write_byte(address);
  221.    response();
  222.    write_byte(Data);
  223.    response();
  224.    stop();
  225. }
  226. /*****************************
  227.        讀操作方式函數(shù)
  228. *****************************/
  229. uchar read_add(uchar address)
  230. {
  231.    uchar Data;
  232.    start();
  233.    write_byte(0xa0);
  234.    response();
  235.    write_byte(address);
  236.    response();
  237.    start();
  238.    write_byte(0xa1);
  239.    response();
  240.    Data=read_byte();
  241.    stop();

  242.    return Data;
  243. }

  244. ////////////////////////////////////////////////////////////////////////////
  245. //                       鍵盤功能程序                                                                  //
  246. ////////////////////////////////////////////////////////////////////////////
  247. void keyscan()
  248. {
  249.   if(option==0)
  250.   {         
  251.     TR0=0;
  252.     delayms(10);
  253.         if(option==0)                         //檢測功能鍵是否按下
  254.           {
  255.             di();
  256.             number++;
  257.                 while(!option);
  258.                 if(number==1)
  259.                  {                                            
  260.                    write_com(0x80+4);     //光標定義到年位置
  261.             
  262.                  }
  263.                  if(number==2)
  264.                  {
  265.                    write_com(0x80+7);
  266.                  }
  267.                  if(number==3)
  268.                  {
  269.                    write_com(0x80+10);
  270.                  }
  271.                  if(number==4)
  272.                  {
  273.                   write_com(0x80+0x40+2);
  274.                  }
  275.                  if(number==5)
  276.                  {
  277.                    write_com(0x80+0x40+5);
  278.                  }
  279.                  if(number==6)
  280.                  {
  281.                    write_com(0x80+0x40+8);
  282.                  }
  283.                  
  284.            }
  285.         }
  286.          if(number!=0)           //如果按下了功能鍵  以下是功能鍵次數(shù)
  287.          {
  288.            if(add==0)
  289.            {
  290.              delayms(10);
  291.                  if(add==0)
  292.                    {
  293.                      while(!add);
  294.                          di();
  295.                          if(number==1)
  296.                           {
  297.                              nian++;
  298.                            }
  299.                           if(number==2)
  300.                           {
  301.                             yue++;
  302.                           }
  303.                           if(number==3)
  304.                           {
  305.                             ri++;
  306.                           }
  307.                           if(number==4)
  308.                           {
  309.                             shi++;
  310.                           }
  311.                           if(number==5)
  312.                           {
  313.                              feng++;
  314.                           }
  315.                           if(number==6)
  316.                           {
  317.                              miao++;
  318.                           }
  319.                          }
  320.                  }
  321.                  
  322.                    if(dcen==0)
  323.                    {
  324.                      delayms(10);
  325.                          if(dcen==0)
  326.                     {
  327.                             while(!dcen);
  328.                                 di();
  329.                                 if(number==1)
  330.                            {
  331.                              nian--;
  332.                            }
  333.                           if(number==2)
  334.                            {
  335.                             yue--;
  336.                            }
  337.                           if(number==3)
  338.                            {
  339.                             ri--;
  340.                            }
  341.                           if(number==4)
  342.                            {
  343.                             shi--;
  344.                            }
  345.                           if(number==5)
  346.                            {
  347.                              feng--;
  348.                            }
  349.                           if(number==6)
  350.                            {
  351.                              miao--;
  352.                            }
  353.                          }
  354.                    }
  355.       }
  356.                TR0=1;
  357. }      
  358.                                                                                       
  359. ////////////////////////////////////////////////////////
  360. ///                  主函數(shù)                                               /////
  361. ////////////////////////////////////////////////////////

  362. void main()
  363. {  
  364.    init();

  365.    nian=read_add(1);
  366.    yue=read_add(2);
  367.    ri=read_add(3);
  368.    shi=read_add(4);
  369.    feng=read_add(5);
  370.    miao=read_add(6);


  371.    while(1)
  372.    {  

  373.          
  374.        display(nian,yue,ri,shi,feng,miao);                  //接收到數(shù)據(jù)后在1602上顯示
  375.          
  376.        keyscan();                                         //對日期時間的調整,同時注意對日期進行調整的時候是不允許進入中斷的

  377.                                   //接收到數(shù)據(jù)顯示完,而且更改完了之后就把數(shù)據(jù)寫入內存中,以方便以后斷電保存
  378.          
  379.          
  380.          
  381.          
  382.                
  383.           write_add(1,nian);
  384.           write_add(2,yue);
  385.           write_add(3,ri);
  386.           write_add(4,shi);  //剛才顯示時15,因為直接寫21會默認你為int,記住要復位重燒也不會改變數(shù)據(jù)
  387.           write_add(5,feng);
  388.           write_add(6,miao);
  389.    }

  390. }


  391. /***************************
  392.       定時器中斷函數(shù)
  393. ****************************/
  394. void ser()interrupt 1
  395. {

  396.   TH0=(65536-50000)/256;
  397.   TL0=(65536-50000)%256;

  398.       num++;

  399.          
  400.            if(num>=20)
  401.           {
  402.             miao++;
  403.                 num=0;
  404.       
  405.           }
  406.           if(miao==60)
  407.           {
  408.             feng++;
  409.                 miao=0;
  410.           }
  411.           if(feng==60)
  412.           {
  413.              feng=0;
  414.                  shi++;
  415.                  
  416.           }
  417.           if(shi==24)
  418.           {
  419.               shi=0;
  420.               ri++;
  421.                   
  422.       }
  423.           if(ri==30)
  424.           {
  425.             ri=0;
  426.             yue++;
  427.           }
  428.           if(yue==12)
  429.           {
  430.             yue=0;
  431.             nian++;
  432.           }
  433.          
  434. }   
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:318173 發(fā)表于 2018-8-5 23:11 | 只看該作者
我就是想先手動寫入正常值然后再讓他自己變化,結果寫入不了,感覺是不是形參傳遞我的形參類型設置有問題,傳來傳去有點暈.
回復

使用道具 舉報

板凳
ID:310519 發(fā)表于 2018-8-6 10:38 | 只看該作者
可以單獨測試讀寫。
回復

使用道具 舉報

地板
ID:292503 發(fā)表于 2018-8-6 12:06 | 只看該作者
我就是想先手動寫入正常值然后再讓他自己變化,,感覺是不是形參傳遞我的形參類型設置有問題,傳來傳去有點暈.
回復

使用道具 舉報

5#
ID:268717 發(fā)表于 2018-10-2 16:42 | 只看該作者
你這個寫入的時候是不是先寫入月  在寫入年日時間?
回復

使用道具 舉報

6#
ID:268717 發(fā)表于 2018-10-2 16:46 | 只看該作者
典型郭天祥風格  AT24C02的驅動程序是直接拿的郭天祥的實例程序吧!
你這問題我也遇到過,想要答案加我QQ:2577647123!有償回答!
回復

使用道具 舉報

7#
ID:387733 發(fā)表于 2018-10-3 08:04 | 只看該作者
我自己一直使用的AT24C02庫,反復優(yōu)化過的,可供參考

AT24C02.rar

972 Bytes, 下載次數(shù): 25

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲欧美在线视频 | 亚洲区一区二 | a级片网站 | 亚洲 中文 欧美 日韩 在线观看 | 九一在线观看 | 久久午夜国产精品www忘忧草 | 久久精品国产亚洲一区二区三区 | 国产免费一区 | 国产视频一区二区 | 亚洲协和影视 | 自拍视频一区二区三区 | 国产高清久久久 | 秋霞在线一区 | av网站在线免费观看 | 中文字幕电影在线观看 | 国产中文字幕在线 | 国产精品一区二区三区在线 | 国产精品乱码一区二区三区 | 久久亚洲天堂 | 日韩一区二区在线视频 | 精品视频在线播放 | 精品在线播放 | 91在线成人 | 国产成人精品午夜视频免费 | 一区二区三区国产 | 欧美电影一区 | 91看片免费| 综合精品 | 奇米四色在线观看 | 日韩三区 | 欧美一二三 | 在线免费av电影 | 日本一区二区电影 | 亚洲精品一区在线观看 | 久久99网站 | 亚洲一区视频在线 | 国产日韩欧美在线 | 在线视频国产一区 | 男人的天堂在线视频 | 国产成在线观看免费视频 | 精品视频在线免费观看 |