找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3886|回復(fù): 2
收起左側(cè)

LCD1602顯示DS1302時(shí)鐘

[復(fù)制鏈接]
ID:445798 發(fā)表于 2018-12-13 17:18 | 顯示全部樓層 |閱讀模式
本人正在學(xué)習(xí)單片機(jī),已超過(guò)2個(gè)月,此程序適合學(xué)習(xí)過(guò)單片機(jī)的新手借鑒和討論,注釋詳盡。
本程序不可通過(guò)按鍵設(shè)置時(shí)間,可按鍵設(shè)置時(shí)間的程序正在創(chuàng)作。詳細(xì)程序可下載附件。
  1. #include <reg52.h>
  2. #include"inc/lcd.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit IO = P3^6;
  6. sbit SCLK = P3^5;
  7. sbit RST = P3^7;
  8. sbit ACC_0 = ACC^0;//累加器第一位
  9. sbit ACC_7 = ACC^7;//累加器最后一位

  10. //寫(xiě)的地址
  11. uchar code write_addr[7]=

  12. {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   
  13. //讀的地址
  14. uchar code read_addr[7]=

  15. {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   

  16. /*形式上為十六進(jìn),數(shù)值是BCD碼*/
  17. //存儲(chǔ)格式是BCD碼秒   分   時(shí)   日   月   周   年
  18. uchar

  19. time[7]={0x00,0x14,0x11,0x13,0x12,0x04,0x19};

  20. /*如果數(shù)值時(shí)間是十進(jìn)制,寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼*/
  21. //uchar time[7]={0,25,15,15,12,6,18}; //十進(jìn)制

  22. void write_byte(uchar dat)//寫(xiě)一個(gè)字節(jié)
  23. {        
  24.         uchar i;
  25.         ACC=dat;
  26.         for(i=8;i>0;i--)
  27.         {
  28.                 IO=ACC_0;
  29.                 SCLK=0;
  30.                 SCLK=1;
  31.                 ACC=ACC>>1;
  32.         }
  33.          /*
  34.         uchar i;
  35.         for(i=0;i<8;i++)
  36.         {
  37.                 IO = (bit)(dat & 0x01);
  38.                 SCLK = 0;
  39.                 SCLK = 1;
  40.                 dat >>= 1;
  41.         }
  42.          */         
  43. }


  44. uchar read_byte()                       //讀一個(gè)字節(jié)
  45. {        
  46.         uchar i;                                       

  47.          
  48.         for(i=0;i<8;i++)
  49.         {
  50.                 ACC_7=IO;
  51.                 SCLK=1;
  52.                 SCLK=0;
  53.                 ACC=ACC>>1;
  54.         }
  55.         IO=0;
  56.         return (ACC);
  57.         /*
  58.         uchar dat,i;
  59.         for(i=0;i<8;i++)
  60.         {
  61.         

  62.         if(IO == 1)
  63.                 {
  64.                         

  65. dat = dat|0x80;
  66.                 }
  67.                 SCLK = 1;
  68.                 SCLK = 0;
  69.                 dat >>= 1;        
  70.         }
  71.         IO = 0;
  72.         return (dat);
  73.         */
  74. }

  75. void write_1302(uchar add,uchar dat)    //向1302芯片寫(xiě)

  76. 函數(shù),指定寫(xiě)入地址,數(shù)據(jù)
  77. {

  78.         RST=0;
  79.         SCLK=0;
  80.         RST=1;
  81.         write_byte(add);
  82.         write_byte(dat);
  83.         SCLK=1;
  84.         RST=0;
  85. }


  86. uchar read_1302(uchar add)                   //從1302

  87. 讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來(lái)源地址
  88. {
  89.         uchar temp;
  90.         RST=0;
  91.         SCLK=0;
  92.         RST=1;
  93.         write_byte(add);
  94.         temp=read_byte();
  95.         SCLK=1;
  96.         RST=0;
  97.         return(temp);
  98. }


  99. void ds1302_init()
  100. {
  101.         uchar k;
  102.     write_1302(0x8e,0x00);  //禁止寫(xiě)保

  103. 護(hù),即允許數(shù)據(jù)寫(xiě)入
  104.     for(k=0;k<7;k++)   //寫(xiě)入7個(gè)字節(jié)

  105. 的時(shí)鐘信號(hào):分秒時(shí)日月周年
  106.     {
  107.       write_1302

  108. (write_addr[k],time[k]);
  109.     }
  110.     write_1302

  111. (0x8e,0x80);  //打開(kāi)寫(xiě)保護(hù)

  112.         /*//寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼
  113.         uchar i,tmp;
  114.         write_1302(0x8e,0x00);  //禁止寫(xiě)保護(hù),即允許數(shù)

  115. 據(jù)寫(xiě)入
  116.         for (i=0; i<7; i++)  
  117.         {
  118.                 tmp = time[i] / 10;
  119.                 time[i] = time[i] % 10;
  120.                 time[i] = time[i] + tmp*16;        // 十

  121. 進(jìn)制轉(zhuǎn)化為BCD格式
  122.                 write_1302(write_addr[i],time[i]);
  123.                 //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周


  124.         }
  125.     write_1302(0x8e,0x80);  //打開(kāi)寫(xiě)保護(hù)
  126.         */
  127. }

  128. void BCD_STRING(uchar bcd, uchar *str) //BCD轉(zhuǎn)化為字符


  129. {         
  130.          *str = (bcd >> 4) + '0';
  131.         *(str+1) = (bcd & 0x0f) + '0';
  132. }

  133. void read_time(uchar *timedata)
  134. {
  135.         uchar n;
  136.         for(n=0;n<7;n++)
  137.         {
  138.                  timedata[n]=read_1302(read_addr[n]);  

  139. //讀取分秒時(shí)日月周年
  140.         }        
  141.         BCD_STRING(timedata[6], LCD_TIME+0);//轉(zhuǎn)化后年

  142. ,存放在LCD_TIME
  143.         BCD_STRING(timedata[4], LCD_TIME+2);//轉(zhuǎn)化后月
  144.         BCD_STRING(timedata[3], LCD_TIME+4);//轉(zhuǎn)化后日
  145.         BCD_STRING(timedata[5], LCD_TIME+6);//轉(zhuǎn)化后周
  146.         BCD_STRING(timedata[2], LCD_TIME+8);//轉(zhuǎn)化后時(shí)
  147.         BCD_STRING(timedata[1], LCD_TIME+10);//轉(zhuǎn)化后


  148.         BCD_STRING(timedata[0], LCD_TIME+12);//轉(zhuǎn)化后


  149. }

  150. void main()
  151. {
  152.         ds1302_init();//1302初始化,設(shè)定時(shí)間
  153.         Lcd_init();         //        lcd初始化
  154.         while(1)
  155.         {
  156.                 read_time(&time); //讀取時(shí)間
  157.                 lcd_dis();         //        顯示在lcd
  158.         }
  159. }
復(fù)制代碼

}4SPVY4XKK)9U[K18KL5{_B.png

LCD顯示時(shí)鐘.rar

35.36 KB, 下載次數(shù): 59, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:721769 發(fā)表于 2021-4-1 16:51 | 顯示全部樓層
請(qǐng)問(wèn)博主, 你用的是C52芯片嗎?
回復(fù)

使用道具 舉報(bào)

ID:900518 發(fā)表于 2021-4-17 10:27 | 顯示全部樓層
一直想搞一個(gè)DS1302時(shí)鐘 學(xué)習(xí)一下了  謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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