2213|0

6828

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

msp430f169与DS1302程序 [复制链接]

#include "msp430f169.h"
#include "DS1302.h"
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define sckout P1DIR |= BIT0
#define sckin  P1DIR &= ~(BIT0)
#define sck_h  P1OUT |= BIT0//sck置高
#define sck_l  P1OUT &= ~(BIT0)//sck置底
#define sdaout P1DIR |= BIT1
#define sdain  P1DIR &= ~(BIT1)
#define sda_h  P1OUT |= BIT1//sda置高
#define sda_l  P1OUT &= ~(BIT1)//sda置底
#define rstout P1DIR |= BIT2
#define rstin  P1DIR &= ~(BIT2)
#define rst_h  P1OUT |= BIT2//rst置高
#define rst_l  P1OUT &= ~(BIT2)//rst置底
//对DS1302进行复位操作
void DS1302_init()
{
   sckout;
   rstout;
   sck_l;//sck置底
   rst_l;//rst置底
   delay_us(10);
   sck_h;//sck置高
}
//写一个字节
void DS1302_writebyte(char num)
{
   char i;
   sdaout;
   rst_h;//rst置高
   for(i=0;i<8;i++)
   {
     if(num&0x01)  sda_h;      
     else          sda_l;
     sck_l; //sck置底
     delay_us(10);
     sck_h;//sck置高
     delay_us(10);
     num>>=1;
   }
}
//读一个字节
char DS1302_readbyte(void)
{
   char i;
   char rdata =0x00;
   sdain;
   rst_h;  //rst置高
   for(i=0;i<8;i++)
   {
      sck_h;//sck置高
      delay_us(10);
      sck_l;//sck置底
      delay_us(10);
      rdata>>=1;
      if(P1IN&0x02)
       rdata|=0x80; //P3OUT=0x00;  
   }
   sdaout;
   return(rdata);
}
//写DS1302数据
void DS1302_write(char address,char dat)
{
   rst_l;//rst置底
   sck_l;//sck置底
   delay_us(1);
   rst_h;//rst置高
   DS1302_writebyte(address);
   DS1302_writebyte(dat);
   sck_h;//sck置高
   rst_l;//rst置底
}
//读DS1302数据
char DS1302_read(char address)
{
   char temp=0x00;
   rst_l;//rst置底
//   delay_us(2);
   sck_l;//sck置底
//   delay_us(2);
   rst_h;//rst置高
   delay_us(2);
   DS1302_writebyte(address);
   temp=DS1302_readbyte();
   sck_h;//sck置高
   rst_l;//rst置底   
   return (temp);
}
//设定时钟数据
void set_RTC(char *ptr)
{
   char i;
   char addr=0x80;
   DS1302_write(0x8E,0x00);
   for(i=0;i<7;i++)
   {
      DS1302_write(addr,*ptr++);
      addr+=2;
   }
   DS1302_write(0x8E,0x80);
}
//读时钟数据
void read_RTC(char *ptr)
{
   char i;
   char addr=0x81;
   for(i=0;i<7;i++)
   {
      ptr= DS1302_read(addr);
      addr+=2;
   }
}
//以burst方式向DS1302写入批量时间数据
void burst_writeDS1302(char *ptr)
{
   char i;
   DS1302_write(0x8E,0x00);
   rst_l;//rst置底
   sck_l;//sck置底
   delay_us(1);
   rst_h;//rst置高
   DS1302_writebyte(0xbe);
   for(i=0;i<8;i++)
   {
     DS1302_writebyte(*ptr++);
   }
   sck_h;//sck置高
   rst_l;//rst置底
   DS1302_write(0x8E,0x80);
}
//以burst方式从DS1302读出批量时间数据
void burst_readDS1302(char *ptr)
{
   char i;
   rst_l;//rst置底
   sck_l;//sck置底
   delay_us(1);
   rst_h;//rst置高
   DS1302_writebyte(0xbf);
   for(i=0;i<8;i++)
   {
     *ptr++ = DS1302_readbyte();
   }
   sck_h;//sck置高
   rst_l;//rst置底
}
//以burst方式向DS1302的RAM中写入批量数据
void burst_writeRAM(char *ptr)
{
   char i;
   DS1302_write(0x8E,0x00);
   rst_l;//rst置底
   sck_l;//sck置底
   delay_us(1);
   rst_h;//rst置高
   DS1302_writebyte(0xfe);
   for(i=0;i<31;i++)
   {
     DS1302_writebyte(*ptr++);
   }
   sck_h;//sck置高
   rst_l;//rst置底
   DS1302_write(0x8E,0x80);   
}
//以burst方式从DS1302的RAM中读出批量数据
void burst_readRAM(char *ptr)
{
   char i;
   rst_l;//rst置底
   sck_l;//sck置底
   delay_us(1);
   rst_h;//rst置高
   DS1302_writebyte(0xff);
   for(i=0;i<31;i++)
   {
     *ptr++ = DS1302_readbyte();
   }
   sck_h;//sck置高
   rst_l;//rst置底
}





#ifndef __DS1302_H__
#define __DS1302_H__
//对DS1302进行复位操作
void DS1302_init();
//写一个字节
void DS1302_writebyte(char num);
//读一个字节
char DS1302_readbyte(void);
//写DS1302数据
void DS1302_write(char address,char dat);
//读DS1302数据
char DS1302_read(char address);
//设定时钟数据
void set_RTC(char *ptr);
//读时钟数据
void read_RTC(char *ptr);

//以burst方式向DS1302写入批量时间数据
void burst_writeDS1302(char *ptr);
//以burst方式从DS1302读出批量时间数据
void burst_readDS1302(char *ptr);
//以burst方式向DS1302的RAM中写入批量数据
void burst_writeRAM(char *ptr);
//以burst方式从DS1302的RAM中读出批量数据
void burst_readRAM(char *ptr);

#endif

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表