欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7598|回復: 14
收起左側

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

[復制鏈接]
ID:296557 發表于 2018-4-21 15:38 | 顯示全部樓層 |閱讀模式
我這邊可以將數據寫入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. }
復制代碼


回復

使用道具 舉報

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中?
回復

使用道具 舉報

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是不是得先經過轉換?
回復

使用道具 舉報

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) 24c02.jpg
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

ID:111634 發表于 2018-4-22 11:13 | 顯示全部樓層
實例50  非零地址讀寫AT24C02
實例50 非零地址讀寫AT24C02.rar (39.09 KB, 下載次數: 30)
24c02a.jpg
回復

使用道具 舉報

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

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

使用道具 舉報

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
                }       
}
回復

使用道具 舉報

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

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

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

使用道具 舉報

ID:314090 發表于 2018-4-22 22:16 | 顯示全部樓層
你這個做的很到位
回復

使用道具 舉報

ID:515137 發表于 2019-4-18 06:07 來自觸屏版 | 顯示全部樓層
樓主可以將你這個調試好的代碼給我嗎?我最近也做這個,
回復

使用道具 舉報

ID:356167 發表于 2019-4-21 10:09 | 顯示全部樓層
rtyyu 發表于 2019-4-18 06:07
樓主可以將你這個調試好的代碼給我嗎?我最近也做這個,

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

使用道具 舉報

ID:373388 發表于 2019-4-21 11:41 | 顯示全部樓層
DS1302讀出來的秒數是10進制,不是16進制,比如讀出來是 0x39 就是10進制39, 當作16進制處理就錯了。
回復

使用道具 舉報

ID:434390 發表于 2019-4-21 18:55 | 顯示全部樓層
讀出來啥字節,就寫啥字節,不用管什么進制的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表