原创 DS1302 RTC

2008-2-20 17:28 2190 4 4 分类: MCU/ 嵌入式


#include <reg51.h>
#include <intrins.h>
#include ".\ds1302.h"


#define uchar unsigned char
#define uint unsigned int


sbit reset  =  P3^4;
sbit io     =  P3^5;
sbit sclk   =  P3^6;


void delay_nop(uchar daa)
{
while(daa--)
 {
  _nop_();
 }
}


//*******************************************************************************
void write_byte(uchar inbyte)
{
uchar i;
 for(i = 0;i<8;i++)
 {
  sclk = 0;             //写的时候低电平改变数据
  delay_nop(2);
 if(inbyte&0x01)
   io = 1;
  else
   io = 0;
  delay_nop(2);
   sclk = 1;            //写的时候高电平,把数据写入ds1302
  delay_nop(2);
   inbyte = inbyte>>1;
 }
}
//*******************************************************************************
uchar read_byte()    //sclk的下跳沿读数据
{
   uchar i,temp = 0;
   io = 1;                //设置为输入口
  delay_nop(2);
   for(i = 0;i<7;i++)
   {
    sclk = 0;
   delay_nop(2);
   if(io == 1)
     temp = temp|0x80;
    else
     temp = temp&0x7f;
  delay_nop(2);
     sclk = 1;             //产生下跳沿
     delay_nop(2);
 
     temp = temp>>1;
   }
   return (temp);
}
//*******************************************************************************
void write_ds1302(uchar cmd,uchar indata)
{
   sclk = 0;
  delay_nop(2);
   reset = 1;
   write_byte(cmd);       
   write_byte(indata);
  
   sclk = 0;
   delay_nop(2);
  reset = 0;
}
//*******************************************************************************
uchar read_ds1302(uchar addr)
{
   uchar backdata;
   sclk = 0;
   delay_nop(2);
  reset = 1;


   write_byte(addr);      //先写地址
   backdata = read_byte();  //然后读数据
 
   sclk = 0;
  delay_nop(2);
   reset = 0;
   return (backdata);
}
//*******************************************************************************
void set_ds1302(uchar *p) //写入n个数据
{
uchar addr = 0x80;
uchar n = 7;
      write_ds1302(0x8e,0x00);          //写控制字,允许写操作
   for(;n>0;n--)
   {
   write_ds1302(addr,*p);
   p++;
   addr = addr+2;
   }
      write_ds1302(0x8e,0x80);          //写保护,不允许写
}
//*******************************************************************************
void read_nowtime(uchar *p)
{
uchar addr = 0x81; 
uchar n = 7;
for(;n>0;n--)
  {
 *p = read_ds1302(addr);
 p++;
 addr = addr+2;
  }
}
//*******************************************************************************
void init_ds1302()
{
 reset = 0;
 sclk = 0;
 write_ds1302(0x80,0x00);
 write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
 write_ds1302(0x8e,0x80);
}
/*******************************************************************************
void main()
{
   init_ds1302();              //初始化ds1302
 
 set_ds1302(0x80,init2,7);  //设置初始时间,日期,年月
 
 while(1)
 {
  if(~k1)
  Play_nowtime();
 }
}


void  Play_nowtime()
{
 read_nowtime(0x81,init,7);   //读出当前时间,读出7个字节
 P2  =  init[0]; //秒
 P1  =  init[1]; //分
}
*******************************************************************************/
//===============DS1302 TEXT .C


/*******************************************************************************
*******************************************************************************/
#include <reg51.h>
#include ".\ds1302.h"


#define uchar unsigned char
#define uint unsigned int


uchar init []  = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //
uchar init2[]  = {0x00,0x59,0x23,0x01,0x05,0x01,0x06}; //
               //秒, 分, 时, 日, 月,星期,年
                 //秒, 分, 时
sbit k1     =  P3^7;
void  Play_nowtime() ;


void main()
{
   init_ds1302();              //初始化ds1302
 
 set_ds1302(init2);  //设置初始时间,日期,年月
 
 while(1)
 {
  Play_nowtime();
 }
}


void  Play_nowtime()
{
 read_nowtime(init);   //读出当前时间,读出7个字节
 P2  =  init[0]; //秒
 P1  =  init[0]; //秒
// P1  =  init[1]; //分
}
//============TEXT1.C



/*
sbit reset  =  P3^4;
sbit sclk   =  P3^6;
sbit io     =  P3^5;


*/


#define uchar unsigned char
#define uint unsigned int


#define rtc_on 1


void init_ds1302();
 
void set_ds1302(uchar *p) ;//写入n个数据
 
void read_nowtime(uchar *p);//读取n个数据



//================DS1302.H

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条