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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何將DS1302的時間數據存入AT24C02中,再調用出來顯示在LCD12864上?單片機小白求問

[復制鏈接]
跳轉到指定樓層
樓主
我這邊可以將數據寫入AT24C02中,這證明我的模塊不是壞的。我現在想把DS1302的時間先存入AT24C02,然后再調用出來顯示在液晶屏上。我寫了以下代碼,還是不行。能幫我看一下嗎?
  1. unsigned char table4[9]={'0','0',':','0','0',':','0','0','\0'};
  2. void display_time()
  3. {
  4.                uchar num,tmp0,tmp1,tmp2;
  5.                 uchar Second,Min,Hour;
  6.                 uchar Second0,Min0,Hour0;
  7.                 uchar Second1,Min1,Hour1;
  8.                 EEPROM_Software_Reset();
  9.         
  10.                 Second = ds1302_read(0x81);//讀秒
  11.                 Min    = ds1302_read(0x83);//讀分
  12.                 Hour   = ds1302_read(0x85);//讀時
  13.         
  14.                 EEPROM_Byte_Write(0xa0,0x00,Second);
  15.                 EEPROM_Byte_Write(0xb0,0x00,Min);
  16.                 EEPROM_Byte_Write(0xc0,0x00,Hour);
  17.         
  18.                 tmp0 = EEPROM_CurrentAddr_Read(0xa1);
  19.                 tmp1 = EEPROM_CurrentAddr_Read(0xb1);
  20.                 tmp2 = EEPROM_CurrentAddr_Read(0xc1);
  21.         
  22.                 Second0 = (tmp0 & 0x0f) + 0x30;//秒的個位
  23.                 Second1 = ((tmp0 & 0x7f) >> 4) + 0x30;//秒的十位
  24.                 Min0 = (tmp1 & 0x0f) + 0x30;//分的個位
  25.                 Min1 = ((tmp1& 0x7f) >> 4) + 0x30;//分的十位
  26.                 Hour0 = (tmp2 & 0x0f) + 0x30;//秒的個位
  27.                 Hour1 = ((tmp2 & 0x7f ) >> 4) + 0x30;//時的十位

  28.                 table4[6]= Second1;
  29.                 table4[7]= Second0;

  30.                 table4[3]= Min1;
  31.                 table4[4]= Min0;
  32.         
  33.                 table4[0]= Hour1;
  34.                 table4[1]= Hour0;
  35.         
  36.                 lcd_pos(3,1); //顯示在第四行第2個字符
  37.                 for(num=0;num<8;num++)//顯示長度
  38.                 {
  39.                         lcd_wdat(table4[num]);
  40.                 }        
  41. }


  42. //////////////////AT24C02//////////////////
  43. void EEPROM_Software_Reset(void)
  44. {
  45.         uchar i;
  46.         IIC_Start();
  47.         //9 clocl
  48.         scl = 0;
  49.         sda = 1;
  50.         for(i=0;i<9;i++)
  51.         {
  52.                 scl = 0;
  53.                 _nop_();//delay
  54.                 _nop_();
  55.                 scl = 1;
  56.                 _nop_();//delay
  57.                 scl = 0;
  58.                 _nop_();//delay
  59.                 _nop_();
  60.   }
  61.         IIC_Start();
  62.         IIC_Stop();
  63. }

  64. void IIC_Start(void)
  65. {
  66.         scl = 0;
  67.         sda = 1;
  68.         scl = 1;
  69.         _nop_();
  70.         sda = 0;
  71.         nop_();
  72. }

  73. void IIC_Stop(void)
  74. {
  75.         scl = 0;
  76.         sda = 0;
  77.         scl = 1;
  78.         _nop_();
  79.         sda = 1;
  80. }

  81. void IIC_Write_Byte(uchar dataSend)
  82. {
  83.         uchar i;
  84.         for(i=0;i<8;i++)
  85.         {
  86.                 scl = 0;
  87.                 if(dataSend & 0x80)sda = 1;//′ó×î¸ßλ¿aê¼D′
  88.                 else sda = 0;
  89.                 _nop_();
  90.                 scl = 1;
  91.                 _nop_();
  92.                 scl = 0;
  93.                 _nop_();
  94.                 dataSend <<= 1;
  95.         }
  96. }

  97. uchar IIC_Read_Byte(void)
  98. {
  99.         uchar dataRead,i;
  100.         for(i=0;i<8;i++)
  101.         {
  102.                 dataRead <<= 1;
  103.                 scl = 0;
  104.                 sda = 1;
  105.                 _nop_();
  106.                 _nop_();
  107.                 scl = 1;
  108.                 _nop_();
  109.                 if(sda)dataRead |= 0x01;
  110.                 _nop_();
  111.                 scl = 0;
  112.                 _nop_();
  113.                 _nop_();
  114.         }
  115.         return dataRead;
  116. }

  117. bit IIC_Ack(void)
  118. {
  119.                 bit flag;
  120.                 scl = 0;
  121.                 sda = 1;
  122.                 _nop_();
  123.                 _nop_();
  124.                 scl = 1;
  125.                 _nop_();
  126.                 flag = sda;//¶áSDA
  127.                 _nop_();
  128.                 scl = 0;
  129.                 _nop_();
  130.                 _nop_();
  131.                 return flag;
  132. }


  133. void IIC_NoAck(void)
  134. {
  135.                 scl = 0;
  136.                 sda = 1;
  137.                 _nop_();
  138.                 _nop_();
  139.                 scl = 1;
  140.                 _nop_();
  141.                 _nop_();
  142.                 scl = 0;
  143.                 _nop_();
  144.                 _nop_();
  145. }

  146. void EEPROM_Byte_Write(uchar devAddr,uchar wordAddr,uchar dataSend)
  147. {
  148.   IIC_Start();
  149.         IIC_Write_Byte(devAddr);
  150.         IIC_Ack();
  151.         IIC_Write_Byte(wordAddr);
  152.         IIC_Ack();
  153.         IIC_Write_Byte(dataSend);
  154.         IIC_Ack();
  155.         IIC_Stop();
  156.         Delay5ms();
  157. }

  158. uchar EEPROM_CurrentAddr_Read(uchar devAddr)
  159. {
  160.                 uchar dataRead;
  161.                 IIC_Start();
  162.                 IIC_Write_Byte(devAddr);
  163.                 IIC_ACK();
  164.                 dataRead = IIC_Read_Byte();
  165.                 IIC_NoACK();
  166.                 ICC_Stop();
  167.                 return dataRead;
  168. }
復制代碼


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

使用道具 舉報

沙發
ID:313294 發表于 2018-4-21 18:53 | 只看該作者
為什么要放到24c02?直接顯示不好么,我這里有各自的驅動,你要嗎??
回復

使用道具 舉報

板凳
ID:111634 發表于 2018-4-21 19:12 | 只看該作者
這個問題分2部分,讀寫24c02和12864顯示,分別弄懂,然后拼起來。
回復

使用道具 舉報

地板
ID:296557 發表于 2018-4-21 20:32 | 只看該作者
huitata 發表于 2018-4-21 18:53
為什么要放到24c02?直接顯示不好么,我這里有各自的驅動,你要嗎??

感謝您的回復。ds1302的數據直接顯示在12864上面這一部分我已經實現了。我現在需要的是將ds1302讀到的秒數據寫入at24c02中。
ds1302讀到的數據是否要經過轉換才能存進at24c02中?
回復

使用道具 舉報

5#
ID:296557 發表于 2018-4-21 20:36 | 只看該作者
zl2168 發表于 2018-4-21 19:12
這個問題分2部分,讀寫24c02和12864顯示,分別弄懂,然后拼起來。

您好,感謝您的回復。
首先我將0x55這單個數據存入12864是可以顯示出來的,但是我將ds1302讀到的數據存進at24c02中就不行,應該是沒有存進,在12864上顯示“7?”這個亂碼,這個亂碼像是沒把ds1302接進電路讀出來的是一樣的。
我在想ds1302的數據要存進at24c02是不是得先經過轉換?
回復

使用道具 舉報

6#
ID:111634 發表于 2018-4-22 11:09 | 只看該作者
本帖最后由 zl2168 于 2018-4-22 11:10 編輯

介紹你一個讀寫24c02案例。
實例49  讀寫AT24C02

Proteus仿真一下,確認有效。 實例49 讀寫IIC AT24C02.rar (38.96 KB, 下載次數: 56)
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

7#
ID:111634 發表于 2018-4-22 11:13 | 只看該作者
實例50  非零地址讀寫AT24C02
實例50 非零地址讀寫AT24C02.rar (39.09 KB, 下載次數: 30)

回復

使用道具 舉報

8#
ID:313294 發表于 2018-4-22 14:01 | 只看該作者
LIN595 發表于 2018-4-21 20:32
感謝您的回復。ds1302的數據直接顯示在12864上面這一部分我已經實現了。我現在需要的是將ds1302讀到的秒 ...

一位位的存,不需要轉換的
回復

使用道具 舉報

9#
ID:296557 發表于 2018-4-22 16:11 | 只看該作者
huitata 發表于 2018-4-22 14:01
一位位的存,不需要轉換的

感謝您的回復。
我現在已經能夠將數據存進AT24C02中了,但是有一個問題是,我每次存新的數據都會將舊的數據覆蓋掉。那么,現在有沒有一種方法可以檢測如果這個字節地址(AT24C02有256個字節地址)已經存了數據了,就自動跳到下一個字節地址繼續寫入,這樣就可以實現保存多組數據而不是只能存儲一組。
比如0x01這個字節地址存了東西,下一次再往AT24C02存數據時,自動跳到0x02這個字節地址來存儲數據。
付上我寫的程序:

unsigned char table4[9]={'0','0',':','0','0',':','0','0','\0'};

void display_time()
{
          uchar num,tmp,tmp1,tmp2;
                uchar Second,Min,Hour;//秒分時
                EEPROM_Software_Reset();
                Second = ds1302_read(0x81);//從ds1302取秒
                Min    = ds1302_read(0x83);//從ds1302取分
                Hour   = ds1302_read(0x85);//從ds1302取時

                EEPROM_Byte_Write(0xae,0x01,Second);
                EEPROM_Byte_Write(0xae,0x00,0);//修改指針地址,CurrentAddressRead自動加1
                tmp = EEPROM_CurrentAddr_Read(0xaf);
               
                EEPROM_Byte_Write(0xae,0x02,Min);
                EEPROM_Byte_Write(0xae,0x01,0);
                tmp1 = EEPROM_CurrentAddr_Read(0xaf);
               
                EEPROM_Byte_Write(0xae,0x03,Hour);
                EEPROM_Byte_Write(0xae,0x02,0);
                tmp2 = EEPROM_CurrentAddr_Read(0xaf);
        ///////////秒///////////
                table4[6]= ((tmp & 0x7f) >> 4) + 0x30;//秒的十位
                table4[7]= (tmp & 0x0f) + 0x30;//個位
        ///////////分///////////
                table4[3]= ((tmp1 & 0x7f) >> 4) + 0x30;//分的十位
                table4[4]= (tmp1 & 0x0f) + 0x30;//個位
        ///////////時///////////
                table4[0]= ((tmp2 & 0x7f ) >> 4) + 0x30;//時的十位
                table4[1]= (tmp2 & 0x0f) + 0x30;//個位
       
                lcd_pos(3,1); //顯示在第4行第2個字符
                for(num=0;num<8;num++)
                {
                        lcd_wdat(table4[num]);//顯示table4
                }       
}
回復

使用道具 舉報

10#
ID:111634 發表于 2018-4-22 20:08 | 只看該作者
LIN595 發表于 2018-4-22 16:11
感謝您的回復。
我現在已經能夠將數據存進AT24C02中了,但是有一個問題是,我每次存新的數據都會將舊的 ...

”“我現在已經能夠將數據存進AT24C02中了,但是有一個問題是,我每次存新的數據都會將舊的數據覆蓋掉。那么,現在有沒有一種方法可以檢測如果這個字節地址(AT24C02有256個字節地址)已經存了數據了,就自動跳到下一個字節地址繼續寫入,這樣就可以實現保存多組數據而不是只能存儲一組。”“

首先,要糾正你一個錯誤概念。即存儲器中無論是什么,都是數據,不存在有或沒有的概念。
其次,存數據是需要提供地址的,你每次存在原來的單元,當然是被覆蓋咯。
若要存入新單元,可設置一個地址計數器,每次存后,單元地址+1。滿一定數量(例如8個),循環覆蓋。
回復

使用道具 舉報

11#
ID:314090 發表于 2018-4-22 22:16 | 只看該作者
你這個做的很到位
回復

使用道具 舉報

12#
ID:515137 發表于 2019-4-18 06:07 來自手機 | 只看該作者
樓主可以將你這個調試好的代碼給我嗎?我最近也做這個,
回復

使用道具 舉報

13#
ID:356167 發表于 2019-4-21 10:09 | 只看該作者
rtyyu 發表于 2019-4-18 06:07
樓主可以將你這個調試好的代碼給我嗎?我最近也做這個,

你做的怎么樣了,我也在做這個,咱們可以交流交流
回復

使用道具 舉報

14#
ID:373388 發表于 2019-4-21 11:41 | 只看該作者
DS1302讀出來的秒數是10進制,不是16進制,比如讀出來是 0x39 就是10進制39, 當作16進制處理就錯了。
回復

使用道具 舉報

15#
ID:434390 發表于 2019-4-21 18:55 | 只看該作者
讀出來啥字節,就寫啥字節,不用管什么進制的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜性视频| 999热精品视频 | 欧美日韩成人影院 | av在线免费观看网址 | 国产黄色在线观看 | 色综合桃花网 | 综合久久综合久久 | 日日夜夜91 | 雨宫琴音一区二区在线 | 91精品国产91久久久久久吃药 | 免费不卡av| 久久不卡 | 日韩电影免费观看中文字幕 | 久久一二三区 | 成人午夜在线视频 | 成人亚洲网站 | 国产精品高清在线 | 81精品国产乱码久久久久久 | 黄色一级大片在线免费看产 | 久久久久久久久久久国产 | 国产精品www | 一区二区三区在线 | 九九99靖品 | 亚洲人成一区二区三区性色 | 欧美日韩国产不卡 | 亚洲欧美精品在线观看 | 国产一区二区三区久久久久久久久 | 欧美a区| av天天澡天天爽天天av | 色综合久| 天天综合久久网 | 特级黄一级播放 | 一本一道久久a久久精品综合蜜臀 | 免费日韩网站 | 人人干人人看 | 在线免费观看视频黄 | 91新视频| 蜜桃视频在线观看www社区 | 国产精品视频网站 | 一区二区视频在线 | 亚洲风情在线观看 |