找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7431|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

如何將DS1302的時間數(shù)據(jù)存入AT24C02中,再調(diào)用出來顯示在LCD12864上?單片機(jī)小白求問

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我這邊可以將數(shù)據(jù)寫入AT24C02中,這證明我的模塊不是壞的。我現(xiàn)在想把DS1302的時間先存入AT24C02,然后再調(diào)用出來顯示在液晶屏上。我寫了以下代碼,還是不行。能幫我看一下嗎?
  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. }
復(fù)制代碼


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

感謝您的回復(fù)。ds1302的數(shù)據(jù)直接顯示在12864上面這一部分我已經(jīng)實(shí)現(xiàn)了。我現(xiàn)在需要的是將ds1302讀到的秒數(shù)據(jù)寫入at24c02中。
ds1302讀到的數(shù)據(jù)是否要經(jīng)過轉(zhuǎn)換才能存進(jìn)at24c02中?
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

介紹你一個讀寫24c02案例。
實(shí)例49  讀寫AT24C02

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

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

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

一位位的存,不需要轉(zhuǎn)換的
回復(fù)

使用道具 舉報(bào)

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

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

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
                }       
}
回復(fù)

使用道具 舉報(bào)

10#
ID:111634 發(fā)表于 2018-4-22 20:08 | 只看該作者
LIN595 發(fā)表于 2018-4-22 16:11
感謝您的回復(fù)。
我現(xiàn)在已經(jīng)能夠?qū)?shù)據(jù)存進(jìn)AT24C02中了,但是有一個問題是,我每次存新的數(shù)據(jù)都會將舊的 ...

”“我現(xiàn)在已經(jīng)能夠?qū)?shù)據(jù)存進(jìn)AT24C02中了,但是有一個問題是,我每次存新的數(shù)據(jù)都會將舊的數(shù)據(jù)覆蓋掉。那么,現(xiàn)在有沒有一種方法可以檢測如果這個字節(jié)地址(AT24C02有256個字節(jié)地址)已經(jīng)存了數(shù)據(jù)了,就自動跳到下一個字節(jié)地址繼續(xù)寫入,這樣就可以實(shí)現(xiàn)保存多組數(shù)據(jù)而不是只能存儲一組!薄

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

15#
ID:434390 發(fā)表于 2019-4-21 18:55 | 只看該作者
讀出來啥字節(jié),就寫啥字節(jié),不用管什么進(jìn)制的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表