zoukankan      html  css  js  c++  java
  • 时钟芯片DS1302的驱动程序

      1 ds1302的程序,不是很简洁,占的程序空间有点长
      2 
      3 程序:
      4 
      5 //////////////////////////////////
      6 //根据自己的接线改管脚定义
      7 sbit DS1302_cs=P1^2;
      8 sbit DS1302_data=P1^1;
      9 sbit DS1302_clk=P1^0;
     10 sbit ACC0=ACC^0;
     11 sbit ACC7=ACC^7;
     12 //////////////////////////////////
     13 #define uchar unsigned char
     14 #define uint unsigned int
     15 
     16 uchar year,month,date,hour,minute,second,week;//定义变量
     17 
     18 //////////////////////////////////
     19 //函数声明
     20 oid DS1302_init();//ds1302初始化 
     21 void DS1302_write(unsigned char DS1302_temp);  //写入一个字节  
     22 uchar DS1302_read(void); //读一字节 
     23 void DS1302_write_time(int command,int dat);//写入second or minute or hour...... or 写入一个命令  
     24 uchar DS1302_read_time(int command);//读取second or minute or hour......
     25 void DS1302_readdate();
     26 void DS1302_writedate();
     27 void long_ds1302_delay()  //长延时
     28 void short_ds1302_delay();//短延时
     29 ////////////////////////////////// 
     30 
     31 
     32 void short_ds1302_delay()
     33 {
     34   uchar i;
     35   for(i=0;i<5;i++);
     36 }
     37 
     38 void long_ds1302_delay()
     39 {
     40   uchar i;
     41   for(i=0;i<25;i++);
     42 }
     43 
     44 void DS1302_write(unsigned char DS1302_temp)  //写入一个字节 
     45 {
     46   uchar i,temp;
     47   long_ds1302_delay();
     48   temp=DS1302_temp;
     49   for(i=0;i<8;i++)
     50   {
     51     DS1302_data=temp&0x01;
     52  short_ds1302_delay();
     53  DS1302_clk=1;
     54  short_ds1302_delay();
     55  DS1302_clk=0;
     56  temp=temp>>1;
     57   }
     58 }
     59 
     60 unsigned char DS1302_read(void) //读一字节 
     61 {
     62   uchar i,temp;
     63   long_ds1302_delay();
     64   temp=0;
     65   for(i=0;i<8;i++)
     66   {
     67     temp=temp>>1;
     68  if(DS1302_data==1)
     69    temp=temp+0x80;
     70  DS1302_clk=1;
     71  short_ds1302_delay();
     72  DS1302_clk=0;
     73  short_ds1302_delay();
     74   }
     75   return temp;
     76 }
     77 /*
     78 /////////写操作设置,当a=0x80时禁止写操作,a=0x00时允许////////////////
     79 
     80 void DS1302_write_able(unsigned char a)
     81 {
     82   DS1302_cs=0;
     83 
     84   DS1302_clk=0;
     85   short_ds1302_delay();
     86   DS1302_cs=1;
     87   DS1302_write(0x8e);
     88   DS1302_data=1;
     89   DS1302_write(a);
     90   DS1302_cs=0;
     91   short_ds1302_delay();
     92   DS1302_clk=1;
     93 }
     94 
     95 /////////读操作设置,当a=0x80时禁止读操作,a=0x00时允许////////////////
     96 
     97 void DS1302_read_able(unsigned char a)
     98 {
     99   DS1302_cs=0;
    100 
    101   DS1302_clk=0;
    102   short_ds1302_delay();
    103   DS1302_cs=1;
    104   DS1302_write(0x8f);
    105   DS1302_data=1;
    106   DS1302_write(a);
    107   DS1302_cs=0;
    108   short_ds1302_delay();
    109   DS1302_clk=1;
    110 }
    111 */
    112 ////////////////////ds1302初始化////////////////////////
    113 void DS1302_init()
    114 {
    115   uchar i;
    116   DS1302_write_time(0x8e,0x00);    //允许写操作
    117 
    118   DS1302_cs=0;
    119 
    120   DS1302_clk=0;
    121   short_ds1302_delay();
    122   DS1302_cs=1;
    123   DS1302_write(0x81);
    124   DS1302_data=1;
    125   i=DS1302_read();
    126   DS1302_cs=0;
    127   short_ds1302_delay();
    128   DS1302_clk=1;
    129   second=((i>>4)&0x07)*10+(i&0x0f);
    130 
    131   DS1302_clk=0;
    132   short_ds1302_delay();
    133   DS1302_cs=1;
    134   DS1302_write(0x80);
    135   DS1302_data=1;
    136   DS1302_write(0x7f&i);
    137   DS1302_cs=0;
    138   short_ds1302_delay();
    139   DS1302_clk=1; 
    140   
    141   DS1302_clk=0;    //充电设置
    142   short_ds1302_delay();
    143   DS1302_cs=1;
    144   DS1302_write(0x90);
    145   DS1302_data=1;
    146 //  DS1302_write(0xa6);    //允许充电,一个二极管 4k电阻
    147   DS1302_write(0x00);    //禁止充电
    148   DS1302_cs=0;
    149   short_ds1302_delay();
    150   DS1302_clk=1;  
    151    
    152   DS1302_write_time(0x8e,0x80);    //禁止写操作
    153 }
    154 
    155 unsigned char DS1302_read_time(int command)//读取second or minute or hour......
    156 {
    157   uchar i;
    158   DS1302_clk=0;
    159   short_ds1302_delay();
    160   DS1302_cs=1;
    161   DS1302_write(command);
    162   DS1302_data=1;
    163   i=DS1302_read();
    164   DS1302_cs=0;
    165   short_ds1302_delay();
    166   DS1302_clk=1;
    167   return i;
    168 }
    169 void DS1302_readdate()
    170 {
    171   uchar i;
    172   DS1302_cs=0;
    173 
    174   //读取second
    175   i=DS1302_read_time(0x81);
    176   second=((i>>4)&0x07)*10+(i&0x0f);
    177 
    178   //读取分minute
    179   i=DS1302_read_time(0x83);
    180   minute=((i>>4)&0x07)*10+(i&0x0f);
    181 
    182   //读取时hour
    183   i=DS1302_read_time(0x85);
    184   hour=((i>>4)&0x03)*10+(i&0x0f);
    185 
    186   //读取日date
    187   i=DS1302_read_time(0x87);
    188   date=((i>>4)&0x03)*10+(i&0x0f);
    189 
    190   //读取月份month
    191   i=DS1302_read_time(0x89);
    192   month=((i>>4)&0x01)*10+(i&0x0f);
    193 
    194   //读取周week
    195   i=DS1302_read_time(0x8b);
    196   week=i&0x07;
    197 
    198   //读取年份year
    199   i=DS1302_read_time(0x8d);
    200   year=((i>>4)&0x0f)*10+(i&0x0f);
    201 }
    202 
    203 
    204 void DS1302_write_time(int command,int dat)//写入second or minute or hour...... or 写入一个命令
    205 {
    206   DS1302_clk=0;
    207   short_ds1302_delay();
    208   DS1302_cs=1;
    209   DS1302_write(command);
    210   DS1302_data=1;
    211   DS1302_write(dat);
    212   DS1302_cs=0;
    213   short_ds1302_delay();
    214   DS1302_clk=1;
    215 }
    216 
    217 void DS1302_writedate()
    218 {
    219 
    220   DS1302_write_time(0x8e,0x00);    //允许写操作
    221   DS1302_cs=0;  
    222   DS1302_write_time(0x80,0x7f&(((second/10)<<4)+(second%10)));  //写second
    223   DS1302_write_time(0x82,0x7f&(((minute/10)<<4)+(minute%10)));  //minute 
    224   DS1302_write_time(0x84,0x3f&(((hour/10)<<4)+(hour%10)));  //hour
    225   DS1302_write_time(0x86,0x3f&(((date/10)<<4)+(date%10)));  //date
    226   DS1302_write_time(0x88,0x1f&(((month/10)<<4)+(month%10))); //month
    227   DS1302_write_time(0x8a,0x07&week); //week
    228   DS1302_write_time(0x8c,((year/10)<<4)+(year%10)); //year
    229   DS1302_write_time(0x8e,0x80);    //禁止写操作
    230 }
  • 相关阅读:
    背景不动,内容滚动的解决方案(移动端)
    移动端真实1px的实现方法
    用户模板和用户场景
    构建之法阅读笔记02
    学习进度六
    NABCD
    构建之法阅读笔记01
    学习进度五
    梦断代码阅读笔记03
    地铁系统
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/2605471.html
Copyright © 2011-2022 走看看