找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4602|回复: 1
收起左侧

ds1302.h DS1302的芯片驱动程序下载

[复制链接]
ID:140725 发表于 2016-10-11 19:27 | 显示全部楼层 |阅读模式

0.png
ds1302.h文件及其他文件下载:
ds1302的芯片驱动程序.rar (39.82 KB, 下载次数: 57)


一下是部分内容预览:
  1. /*******************************************************************
  2. *【文 件 名】:DS1302.h                                            *
  3. *【建立日期】:7月4日                                        *
  4. *【修改日期】:7月5日                                        *
  5. *【文件作用】:DS1302驱动程序,提供直接调用函数                    *
  6. *【说    明】:显示格式:                                          *
  7. *                DATA:年-月-日-星期                             *
  8. *                TIME:时:分:秒                                   *
  9. *------------------------------------------------------------------*
  10. *【作    者】:郭鑫(ben)                                           *
  11. *【版    权】:国家创新性实验项目,编号GCS07001                    *
  12. *******************************************************************/


  13. #ifndef _DS1302_08_07_04_
  14. #define _DS1302_08_07_04_

  15. #include <reg52.h>


  16. //------------定义------------
  17. #define delay_value3 10

  18. typedef struct
  19. {
  20.         uchar Second;
  21.         uchar Minute;
  22.         uchar Hour;
  23.         uchar Week;
  24.         uchar Day;
  25.         uchar Month;
  26.         uchar Year;
  27.         uchar DateString[11];
  28.         uchar TimeString[9];
  29. }time_struct;

  30. time_struct sys_time;

  31. #define DS1302_SECOND        0x80   //各个时间值的地址
  32. #define DS1302_MINUTE        0x82
  33. #define DS1302_HOUR                0x84
  34. #define DS1302_DAY                0x86
  35. #define DS1302_MONTH        0x88
  36. #define DS1302_WEEK                0x8A
  37. #define DS1302_YEAR                0x8C

  38. //-------------------------管脚定义--------------------------------         
  39. sbit  ds1302_clk = P3^4;   //实时时钟时钟线引脚
  40. sbit  ds1302_io  = P3^3;   //实时时钟数据线引脚
  41. sbit  ds1302_rst = P3^2;   //实时时钟复位线引脚
  42. sbit  acc0= ACC^0;         //数据读入
  43. sbit  acc7= ACC^7;         //数据读出



  44. //初始时间                          秒   分        时         日   月  星期        年   
  45. uchar start_time[7]={0x10,0x47,0x14,0x22,0x03,0x06,0x08};
  46. //uchar pdata shijian[]="时间:";
  47. //uchar pdata riqi[]="日期:";                                  

  48. //----------函数声明-------------
  49. void ds1302_byte_w(uchar byt);                                          //DS1302写入一个字节
  50. uchar ds1302_byte_r(void);                                                  //DS1302读出一个字节

  51. void ds1302_w(uchar adds,uchar dat_writed);                  //DS1302数据写入某地址
  52. uchar ds1302_r(uchar adds);                                                  //DS1302某地址数据读取

  53. void ds1302_w_protect(bit flag);  
  54. void ds1302_init_time(uchar *time_to_w);
  55. void ds1302_initial(void);                                     //DS1302初始化

  56. void ds1302_get_time(time_struct *cur_time);    //获取DS1302时间日期       
  57. void ds1302_set_time(void);                      //键控设置时间日期

  58. void call_ds1302(void);                                                         //供外部调用


  59. //----------DS1302初始化----------
  60. void ds1302_initial(void)
  61. {
  62.         uchar second;
  63.         second=ds1302_r(DS1302_SECOND);
  64.         ds1302_w_protect(0);
  65.         if(second&0x80)                  
  66.                 ds1302_w(DS1302_SECOND,0x00);
  67. //        ds1302_set_time(start_time);
  68.         ds1302_w_protect(1);       
  69.         lcd_cmd_w(0x01); //清屏
  70.         lcd_setposition(1,2);
  71.         lcd_str_w("日历系统");
  72.         lcd_setposition(2,0);
  73.         lcd_str_w("Data: ");

  74.         lcd_setposition(3,0);
  75.         lcd_str_w("Time: ");

  76.         lcd_setposition(4,1);
  77.         lcd_str_w("key4设置系统");

  78. }//void ds1302_initial(void)


  79. //-------DS1302读出一个字节----------
  80. uchar ds1302_byte_r(void)
  81. {
  82.         uchar i;
  83.           for(i=8; i>0; i--)
  84.           {
  85.                 ACC=ACC>>1;
  86.                 acc7=ds1302_io;
  87.                 ds1302_clk=1;
  88.                 ds1302_clk=0;
  89. //                delay(delay_value3);
  90.         }
  91.         return(ACC);
  92. }//uchar ds1302_byte_w(void)

  93. //---------DS1302写入一个字节--------------
  94. void ds1302_byte_w(uchar byt)
  95. {
  96.         uchar i=0;
  97.         ACC=byt;
  98.         for(i=8;i>0;i--)
  99.         {
  100.                 ds1302_io=acc0;
  101.                 ds1302_clk=1;
  102.                 ds1302_clk=0;
  103. //                delay(delay_value3);
  104.                 ACC=ACC>>1;
  105.         }
  106. }//void ds1302_byte_r(uchar byt)

  107. //-------------DS1302某地址数据读取--------------
  108. uchar ds1302_r(uchar adds)
  109. {
  110.         uchar data_read;
  111.           ds1302_rst = 0;
  112.         ds1302_clk = 0;
  113.         ds1302_rst = 1;
  114.         ds1302_byte_w(adds|0x01); //            
  115.         data_read = ds1302_byte_r();      
  116.         ds1302_clk = 1;
  117.         ds1302_rst = 0;
  118.         return(data_read);       
  119. }//uchar ds1302_r(uchar adds)


  120. //-------------DS1302数据写入某地址------------
  121. void ds1302_w(uchar adds,uchar data_writed)
  122. {
  123.           ds1302_rst = 0;
  124.         ds1302_clk = 0;
  125.         ds1302_rst = 1;
  126.         ds1302_byte_w(adds);         
  127.         ds1302_byte_w(data_writed);         
  128.         ds1302_clk = 1;
  129.         ds1302_rst = 0;       
  130. }//void ds1302_w(uchar dat,uchar adds)


  131. //-----------DS1302是否写保护----------------
  132. void ds1302_w_protect(bit flag)                                   //flag=0不保护,flag=1写保护
  133. {
  134.         if(flag)
  135.                 ds1302_w(0x8e,0x80);       
  136.         else
  137.                 ds1302_w(0x8e,0x00);
  138. }//void ds1302_w_protect(bit flag)




  139. void ds1302_init_time(uchar *time_to_w)
  140. {
  141.         uchar i=0;
  142.           uchar adds = 0x80;
  143.           ds1302_w_protect(0);           //控制命令,WP=0,写操作
  144.         for(i = 0; i < 7; i++)
  145.           {       
  146.                 ds1302_w(adds,time_to_w[i]);  // 秒 分 时 日 月 星期 年
  147.             adds+=2;
  148.           }
  149.           ds1302_w_protect(1);          //控制命令,WP=1,写保护


  150. }//void ds1302_set_time(uchar *time_to_w)



  151. /*******************************************************************
  152. *【函 数 名】:ds1302_get_time                                     *
  153. *【修改日期】:2008年7月4日                                        *
  154. *【文件作用】:获取DS1302时间值并转化位数组形式,供显示使用        *
  155. *------------------------------------------------------------------*
  156. *【备    注】:                                                    *
  157. *******************************************************************/
  158. void ds1302_get_time(time_struct *cur_time)               
  159. {
  160.         uchar temp_time;               //存放读取的临时时间
  161.         temp_time = ds1302_r(DS1302_SECOND);
  162.         cur_time->Second = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  163.        
  164.         temp_time = ds1302_r(DS1302_MINUTE);
  165.         cur_time->Minute = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  166.        
  167.         temp_time = ds1302_r(DS1302_HOUR);
  168.         cur_time->Hour = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  169.        
  170.         temp_time = ds1302_r(DS1302_DAY);
  171.         cur_time->Day = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);       
  172.        
  173.         temp_time = ds1302_r(DS1302_WEEK);
  174.         cur_time->Week = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  175.        
  176.         temp_time = ds1302_r(DS1302_MONTH);
  177.         cur_time->Month = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  178.        
  179.         temp_time = ds1302_r(DS1302_YEAR);
  180.         cur_time->Year = ((temp_time&0x70)>>4)*10 + (temp_time&0x0F);
  181.        
  182.                 cur_time->DateString[0] = cur_time->Year/10 + '0'; //年份
  183.                 cur_time->DateString[1] = cur_time->Year%10 + '0';
  184.                 cur_time->DateString[2] = '_';
  185.                 cur_time->DateString[3] = cur_time->Month/10 + '0'; //月份
  186.                 cur_time->DateString[4] = cur_time->Month%10 + '0';
  187.                 cur_time->DateString[5] = '_';
  188.                 cur_time->DateString[6] = cur_time->Day/10 + '0';
  189.                 cur_time->DateString[7] = cur_time->Day%10 + '0';
  190.                 cur_time->DateString[8] = '_';
  191.                 cur_time->DateString[9]        = cur_time->Week%10+'0';
  192.                 cur_time->DateString[10] = '\0';               

  193.                 cur_time->TimeString[0] = cur_time->Hour/10 + '0'; //时的十位
  194.                 cur_time->TimeString[1] = cur_time->Hour%10 + '0'; //时的各位
  195.                 cur_time->TimeString[2] = ':';
  196.                 cur_time->TimeString[3] = cur_time->Minute/10 + '0';
  197.                 cur_time->TimeString[4] = cur_time->Minute%10 + '0';
  198.                 cur_time->TimeString[5] = ':';
  199.                 cur_time->TimeString[6] = cur_time->Second/10 + '0';
  200.                 cur_time->TimeString[7] = cur_time->Second%10 + '0';
  201.                 cur_time->TimeString[8] = '\0';       
  202. }//void ds1302_get_time(time_struct *cur_time)


  203. /*******************************************************************
  204. *【函 数 名】:ds1302_set_time                                     *
  205. *【修改日期】:2008年7月5日                                        *
  206. *【文件作用】:键控设置时间                                        *
  207. *------------------------------------------------------------------*
  208. *【备    注】:可能由于按键原因,设置反应慢,有待改进              *
  209. *******************************************************************/
  210. void ds1302_set_time(void)
  211. {
  212. // time_struct idata  CTE;
  213. time_struct idata  time;
  214. // time_struct idata old_time;
  215. uint  idata clk_time;
  216. uchar idata time_flag[5];
  217. uint idata timeflag = 1;
  218. // uint idata i=0;
  219. uchar max;

  220. if(key_check(4) == 1)    //调整时间
  221. {
  222. //  lcd_cmd_w(0x01);
  223. //  lcd_setposition(1,2);
  224. //  lcd_str_w("日历系统");
  225. //  lcd_setposition(2,0);
  226. //  lcd_str_w("Date: ");
  227. //  lcd_setposition(3,0);
  228. //  lcd_str_w("Time: ");
  229.   lcd_setposition(4,0);
  230.   lcd_str_w("调整时间模式    ");

  231.   while(1)
  232.   {
  233. //   ds1302_get_time(&CTE);
  234.    ds1302_get_time(&time);

  235.    lcd_setposition(2,3);
  236.    lcd_str_w(time.DateString);
  237.    lcd_setposition(3,3);
  238.    lcd_str_w(time.TimeString);
  239.    lcd_setposition(4,0);
  240.    

  241.    if(timeflag == 1)        //调整:年
  242.    {
  243.     max = 99;
  244.         clk_time = time.Year;
  245.     lcd_str_w("现在调整: 年");
  246.     lcd_setposition(2,3);
  247.     lcd_str_w("  ");
  248.     delay(50);
  249.     lcd_setposition(2,3);
  250.     time_flag[0] = clk_time/10 + '0';
  251.     time_flag[1] = clk_time%10 + '0';
  252.     time_flag[2] = '\0';
  253.     lcd_str_w(time_flag);
  254.     delay(50);
  255.    }

  256.    else if(timeflag == 2)//        调整: 月
  257.    {
  258.     max = 13;
  259.         clk_time = time.Month;
  260.     lcd_str_w("现在调整: 月");
  261.     lcd_setposition(2,4);
  262.     lcd_str_w("_  ");
  263.     delay(50);
  264.     lcd_setposition(2,4);
  265.     time_flag[0] = '_';
  266.     time_flag[1] = clk_time/10 + '0';
  267.     time_flag[2] = clk_time%10 + '0';
  268.     time_flag[3] = '\0';
  269.     lcd_str_w(time_flag);
  270.     delay(50);
  271.    }

  272.    else if(timeflag == 3)           //调整: 日
  273.    {
  274.     max = 32;
  275.     clk_time = time.Day;
  276.     lcd_str_w("现在调整: 日");
  277.     lcd_setposition(2,6);
  278.     lcd_str_w("  ");
  279.     delay(50);
  280.     lcd_setposition(2,6);
  281.     time_flag[0] = clk_time/10 + '0';
  282.     time_flag[1] = clk_time%10 + '0';
  283.     time_flag[2] = '\0';
  284.     lcd_str_w(time_flag);
  285.     delay(50);
  286.    }
  287.    
  288.         else if(timeflag == 7)                 // 调整: 周
  289.    {
  290.     max = 8;
  291.         clk_time = time.Week;
  292.     lcd_str_w("现在调整: 周");
  293.     lcd_setposition(2,7);
  294.     lcd_str_w("_ ");
  295.     delay(50);
  296.     lcd_setposition(2,7);
  297.     time_flag[0] ='_';
  298.     time_flag[1] = clk_time%10 + '0';
  299.     time_flag[2] = '\0';
  300.     lcd_str_w(time_flag);
  301.     delay(50);
  302.    }

  303.    else if(timeflag == 4)                 //调整: 时
  304.    {
  305.         max = 24;
  306.     clk_time = time.Hour;
  307.     lcd_str_w("现在调整: 时");
  308.     lcd_setposition(3,3);
  309.     lcd_str_w("  ");
  310.     delay(50);
  311.     lcd_setposition(3,3);
  312.     time_flag[0] = clk_time/10 + '0';
  313.     time_flag[1] = clk_time%10 + '0';
  314.     time_flag[2] = '\0';
  315.     lcd_str_w(time_flag);
  316.     delay(50);
  317.    }

  318.    else if(timeflag == 5)  //调整: 分
  319.    {
  320.     max = 60;
  321.     clk_time = time.Minute;
  322.     lcd_str_w("现在调整: 分");
  323.     lcd_setposition(3,4);
  324.     lcd_str_w(":  ");
  325.     delay(50);
  326.     lcd_setposition(3,4);
  327.     time_flag[0] = ':';
  328.     time_flag[1] = clk_time/10 + '0';
  329.     time_flag[2] = clk_time%10 + '0';
  330.     time_flag[3] = '\0';
  331.     lcd_str_w(time_flag);
  332.     delay(50);
  333.    }

  334.    else if(timeflag == 6)   //调整: 秒
  335.    {
  336.     max = 60;
  337.         clk_time = time.Second;
  338.     lcd_str_w("现在调整: 秒");
  339.     lcd_setposition(3,6);
  340.     lcd_str_w("  ");
  341.     delay(50);
  342.     lcd_setposition(3,6);
  343.     time_flag[0] = clk_time/10 + '0';
  344.     time_flag[1] = clk_time%10 + '0';
  345.     time_flag[2] = '\0';
  346.     lcd_str_w(time_flag);
  347.     delay(50);
  348.    }

  349.    lcd_setposition(4,6);                                   //可以去掉
  350.    time_flag[0]='(';
  351.    time_flag[1]= clk_time/10 + '0';
  352.    time_flag[2]= clk_time%10 + '0';
  353.    time_flag[3]=')';
  354.    time_flag[4]='\0';
  355.    lcd_str_w(time_flag);


  356.    if(key_check(4) == 1)          //切换设置值
  357.    {
  358.       timeflag = timeflag + 1;
  359.       if(timeflag == 8)
  360.            timeflag = 1;
  361.         goto again;
  362.    }

  363.    if(key_check(3) == 1)          //值加1
  364.    {

  365.     clk_time = clk_time + 1;
  366.         if(clk_time == max)
  367.                 if(timeflag == 2||timeflag == 7||timeflag == 3)
  368.                         clk_time = 1;
  369.                 else
  370.                         clk_time = 0;
  371.                             
  372.        clk_time = (((clk_time/10)<<4) &0xf0) + (((clk_time%10)&0x0f));
  373.           
  374.            ds1302_w_protect(0);          //控制命令,WP=1,写保护

  375.        if(timeflag == 1)
  376.                       ds1302_w(0x8c,clk_time);          
  377.            else if(timeflag == 7)
  378.             ds1302_w(0x8a,clk_time);
  379.            else if(2 <= timeflag <= 6)
  380.             ds1302_w((0x88-(timeflag-2)*2),clk_time);
  381.                 ds1302_w_protect(1);          //控制命令,WP=1,写保护
  382.          goto again;
  383.         }

  384.    if(key_check(2) == 1)           //
  385.    {

  386.     if(clk_time != 0)
  387.       clk_time = clk_time - 1;
  388.     clk_time = (((clk_time/10)<<4) &0xf0) + (((clk_time%10)&0x0f));
  389.               ds1302_w_protect(0);          //控制命令,WP=1,写保护

  390.         if(timeflag == 1)
  391.         ds1302_w(0x8c,clk_time);
  392.        
  393.         else if(timeflag == 7)
  394.              ds1302_w(0x8a,clk_time);
  395.    
  396.         else if(2<=timeflag <= 6)
  397.         ds1302_w((0x88-(timeflag-2)*2),clk_time);
  398.         ds1302_w_protect(1);          //控制命令,WP=1,写保护
  399.          goto again;
  400.    }

  401. again:

  402.    if(key_check(1) == 1 || key_check(0) == 1)
  403.    {
  404.                 ds1302_initial();
  405.                 return;
  406.    
  407.    }


  408.   }
  409. }
  410. }
  411.          


  412. /*******************************************************************
  413. *【函 数 名】:call_ds1302                                         *
  414. *【修改日期】:2008年7月4日                                        *
  415. *【文件作用】:供外部调用,调用即可启动DS1302                      *
  416. *------------------------------------------------------------------*
  417. *【备    注】:缺少ds1302_initial和while(1)                        *
  418. *******************************************************************/
  419. void call_ds1302()
  420. {

  421.                 ds1302_get_time(&sys_time);
  422.                 lcd_setposition(2,3);
  423.                 lcd_str_w(sys_time.DateString);
  424.                 lcd_setposition(3,3);
  425.                 lcd_str_w(sys_time.TimeString);
  426.                 ds1302_set_time();                                               
  427. }



  428. #endif
复制代码



回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表