PIC16F877驱动DS1302芯片

发布者:ping777最新更新时间:2016-07-07 来源: eefocus关键字:PIC16F877  驱动  DS1302芯片 手机看文章 扫描二维码
随时随地手机看文章
这个程序改网上的程序只用了一上午的时间,看来是用修改别人程序比自个从头开始编快的的多呀!

下面是原理图

ds1302原理图

 

下面是程序头文件

#ifndef DS1302_H
#define DS1302_H

#include "main.h"

#define Time_24_Hour 0x00 //24时制控制 
#define Time_Start  0x00 //开始走时
#define Time_Stop  0x80 //停止走时

#define DS1302_SECOND 0x80 //DS1302各寄存器操作命令定义
#define DS1302_MINUTE 0x82
#define DS1302_HOUR  0x84
#define DS1302_WEEK  0x8A
#define DS1302_DAY  0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR  0x8C
#define DS1302_WRITE 0x8E
#define DS1302_POWER 0x90

#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
#define DEC2BCD(X) ((X/10)<<4 | (X%10))   //用于将十进制转成BCD


#define RST RC0 
#define DATA RC1
#define DS_CLK RC2
#define RST_DIR TRISC0
#define DATA_DIR TRISC1
#define SCLK_DIR TRISC2

typedef struct __SYSTEMTIME__  //定义的时间类型结构体,全部数为十进制
{
 unsigned char Second;
 unsigned char Minute;
 unsigned char Hour;
 unsigned char Week;
 unsigned char Day;
 unsigned char Month;
 unsigned char Year;
    unsigned char DateString[11];   
    unsigned char TimeString[9];  
}systemetime;

void init_ds1302() ;
void writebyte(uchar data) ;
uchar readbyte() ;
void ds_writedata(uchar add,uchar data) ;
uchar ds_readdata(uchar add) ;
void get_time(systemetime *Time)  ;
void set_time(systemetime *Time) ;
void data2str(systemetime *Time) ;
void time2str(systemetime *Time) ;
#endif 
子程序

#include "ds1302.h"
void init_ds1302() 
{
 RST_DIR=0 ;
 DATA_DIR=0 ;
 SCLK_DIR=0 ;
 
 ds_writedata(DS1302_WRITE,0x00);  //关闭写保护
 ds_writedata(DS1302_SECOND,Time_Stop);//停止计时
 ds_writedata(DS1302_HOUR,Time_24_Hour);//24时制
// ds_writedata(DS1302_POWER,0xA6);  //单二极管,4K电阻充电
 ds_writedata(DS1302_WRITE,0x80);  //打开写保护 
}

void writebyte(uchar data)
{
 uchar i;
 DATA_DIR=0 ;
 for(i=0;i<8;i++) 
 {
  if(data&0x01)
   DATA=1 ;
  else 
   DATA=0 ;
  DS_CLK=1 ;
  DS_CLK=0 ;
  data=data>>1 ;
 }
}
uchar readbyte()
{
 uchar i,temp ;
 DATA_DIR=1 ;
 for(i=0 ;i<8;i++) 
 {
  temp=temp>>1 ;
  if(DATA)
   temp=temp|0x80 ;
  DS_CLK=1 ;
  DS_CLK=0 ;
 }
 DATA_DIR=0 ;
 return temp ;
}


void ds_writedata(uchar add,uchar data)
{
 RST=0 ;
 DS_CLK=0 ;
 RST=1 ;
 writebyte(add) ;
 writebyte(data) ;
 DS_CLK=1 ;
 RST=0 ;
 
}
uchar ds_readdata(uchar add)
{
 uchar temp ;
 RST=0 ;
 DS_CLK=0 ;
 RST=1 ;
 writebyte(add|0x01) ;
 temp=readbyte() ;
 DS_CLK=1 ;
 RST=0 ;
}
void get_time(systemetime *Time) 
{
 unsigned char ReadValue;
 ReadValue = ds_readdata(DS1302_SECOND);
 Time->Second = BCD2DEC(ReadValue&0x7F);
 ReadValue = ds_readdata(DS1302_MINUTE);
 Time->Minute = BCD2DEC(ReadValue);
 ReadValue = ds_readdata(DS1302_HOUR);
 Time->Hour = BCD2DEC(ReadValue&0x7F);
 ReadValue = ds_readdata(DS1302_DAY);
 Time->Day = BCD2DEC(ReadValue); 
 ReadValue = ds_readdata(DS1302_WEEK);
 Time->Week = BCD2DEC(ReadValue);
 ReadValue = ds_readdata(DS1302_MONTH);
 Time->Month = BCD2DEC(ReadValue);
 ReadValue = ds_readdata(DS1302_YEAR);
 Time->Year = BCD2DEC(ReadValue); 
}
void set_time(systemetime *Time)
{
 uchar temp ;
 ds_writedata(DS1302_WRITE,0x00);  //关闭写保护
 temp=DEC2BCD(Time->Year) ;
 ds_writedata(DS1302_YEAR,temp);
 temp=DEC2BCD(Time->Month) ;
 ds_writedata(DS1302_MONTH,temp);
 temp=DEC2BCD(Time->Week) ;
 ds_writedata(DS1302_WEEK,temp);
 temp=DEC2BCD(Time->Day) ;
 ds_writedata(DS1302_DAY,temp);
 temp=DEC2BCD(Time->Hour)|Time_24_Hour ;
 ds_writedata(DS1302_HOUR,temp);
 temp=DEC2BCD(Time->Minute) ;
 ds_writedata(DS1302_MINUTE,temp);
 temp=DEC2BCD(Time->Second)|Time_Start ;
 ds_writedata(DS1302_SECOND,temp);
 
 ds_writedata(DS1302_WRITE,0x80);  //打开写保护 
}

void data2str(systemetime *Time) 
{
//Year
    Time->DateString[0] = '2';   
    Time->DateString[1] = '0';     
    Time->DateString[2] = Time->Year/10 + '0';   
    Time->DateString[3] = Time->Year%10 + '0';  

    Time->DateString[4] = '/';   
//Month
    Time->DateString[5] = Time->Month/10 + '0';   
    Time->DateString[6] = Time->Month%10 + '0'; 
    Time->DateString[7] = '/';   
//Day
    Time->DateString[8] = Time->Day/10 + '0';   
    Time->DateString[9] = Time->Day%10 + '0';  
    Time->DateString[10] = '/0'; //字符串末尾加 '/0' ,判断结束字符    
}
void time2str(systemetime *Time) 
{
//Hout
    Time->TimeString[0] = Time->Hour/10 + '0';   
    Time->TimeString[1] = Time->Hour%10 + '0';

    Time->TimeString[2] = ':';  
//Minute
    Time->TimeString[3] = Time->Minute/10 + '0';   
    Time->TimeString[4] = Time->Minute%10 + '0'; 

    Time->TimeString[5] = ':';   
//Second
    Time->TimeString[6] = Time->Second/10 + '0';   
    Time->TimeString[7] = Time->Second%10 + '0';   
//
    Time->DateString[8] = '/0';   
}
下面是测试程序

#include "main.h"
#include "ds1302.h"
void init_all()
{
 init_ds1302() ;
}
void interrupt main_int()
{
 ;
}
systemetime tm ;
void main()
{
 init_all() ;
 tm.Day=19;
 tm.Hour=13 ;
 tm.Minute=4 ;
 tm.Month=8 ;
 tm.Year=9 ;
 tm.Week=1 ;
 set_time(&tm) ;
 while(1) 
 {
  get_time(&tm) ;
  time2str(&tm) ;
  data2str(&tm) ;
 }
}


关键字:PIC16F877  驱动  DS1302芯片 引用地址:PIC16F877驱动DS1302芯片

上一篇:Microchip PIC32系列再添新成员
下一篇:PIC16F877A驱动12864液晶

推荐阅读最新更新时间:2024-03-16 14:59

LED照明不可忽视的技术细节
  led照明灯具在近期得到飞跃的发展,led作为绿色环保的清洁光源得到广泛的认可。led光源使用寿命长、节能省电、应用简单方便、使用成本低,因而在家庭照明都将得到海量的应用,欧司朗光学半导体公司2008年调查统计,全球每年家庭照明灯座出货量约为500亿个。   led光源的技术日趋成熟,每瓦发光流明迅速增长,促使其逐年递减降价。以1W led光源为例,2008年春的价格已是2006年春的价格三分之一,2009年春将降至2006年的四分之一。 led绿色灯具的海量市场和持续稳定数年增长需求将是集成电路行业继VCD、DVD、手机、MP3之后的消费电子市场的超级海啸!    led灯具的高节能、长寿命、利环保的优越性能获得普遍的公
[电源管理]
一种液晶显示器的LED背光驱动控制设计方案
  相对传统的CCFL 液晶显示器背光源存在色阶差、色纯度低、需高压驱动导致功耗大、屏厚度大等缺点而言,LED 背光源以其功耗低、寿命长、更环保、屏厚度低等优点在民用和军用显示产品上得到更多应用。尤其是它超强的色彩表现力更是CCFL 背光源远不及的, 其色彩饱和度达到甚至超过Adobe RGB 和NTSC 色彩标准要求, 可以达到NTSC ratio100%以上平面光源特性, 而CCFL 背光只能实现NTSC 色彩区域的78%。另外,LED 的高刷新频率使其在视频方面有更好的性能表现,LED 显示屏的单个元素反应速度是CCFL 背光液晶屏的1 000 倍,即使是在强光下也可以照看不误,并且适应零下40 ℃的低温。   随着LE
[电源管理]
一种液晶显示器的LED背光<font color='red'>驱动</font>控制设计方案
基于DSP的精密半导体激光驱动电源系统
引言   目前,半导体激光(LD)已广泛应用于通信、信息检测、医疗和精密加工与军事等许多领域。激光电源是激光装置的重要组成部分,其性能的好坏直接影响到整个激光器装置的技术指标。本设计采用受DSP控制的恒流源来为半导体激光器提供电流,在电路中,利用负反馈原理,控制复合功率调整管输出电流,以达到稳定输出电流的目的。该系统采用电路设计和程序控制算法设计相结合的方法,从多方面对半导体激光器的工作状态进行实时检测和控制,使系统的性能得到很大的改善和提高,有效解决了半导体激光器工作的准确、稳定和可靠性问题,进一步提高了半导体激光器的输出指标。 系统原理   要使激光器输出稳定波长的激光,则要求流过激光器的电流非常稳定,
[电源管理]
基于MAX16801A/B的高亮度LED驱动控制器及其应用
1 引言   MAX16801A/B和MAXl6802A/B采用恒定电流来 驱动 一般照明和 显示 应用中的HB LED ,以提供所需要的控制功能。MAX16801A/B适用于通用交流输入 LED驱动 器,而MAX16802A/B则被指定用于低压(10.8~24 V)直流输入LED驱动器。由MAX16801A/B和MAX16802A/B构成的HB LED驱动电路 控制 IC 主要用于 LCD TV和LCD监示器RGB背光照明、商业和工业照明、装饰与建筑景观照明等领域。 2 主要特点   MAX16801A/8和MAX16802A/8的主要特点如下:   适合用作组成降压(Buck)、升压、回扫(Flyback
[电源管理]
基于MAX16801A/B的高亮度LED<font color='red'>驱动</font>控制器及其应用
TM1637四位数码管模块驱动(TM1637.h头文件)51单片机C语言
TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级灰度可调)。 控制接口:共4个引脚(GND、VCC、DIO、CLK),GND为地,VCC为供电电源,DIO为数据输入输出脚,CLK为时钟信号脚。 TM1637.h单片机源程序如下: sbit CLK= P3^4; //定义模拟IIC总线的时钟线 sbit DIO = P3^5; //定义模拟IIC总线的数据线 code unsigned char tab = { 0x3F,/*0*/ 0x06,/*1*/
[单片机]
TM1637四位数码管模块<font color='red'>驱动</font>(TM1637.h头文件)51单片机C语言
切换式LED驱动器调光技术研究
在 LED 照明设备数量增长的趋势下,提供给 LED 受控 电源 的 集成电路 装置不断推陈出新。如何节省能源是目前全球的重要议题,而耗电的线性 电流 源早已不符合这项要求,因此切换式 LED 驱动器取而代之成为业界标准。从手电筒到体育馆计分板等各式应用都要求可准确控制调节电流。在许多实例中我们发现还需要可实时变更 LED 输出强度的机制。此功能就是所谓的“调光控制”。本文在于说明基本 LED 理论以及数种用于切换式 LED 驱动器的调光控制技术。 LED 亮度与色温 LED 亮度 测量 LED 可见光亮度的单位为光通量“强度”,烛光 (cd)。测量 LED 总电源输出的单位则为流明 (lm) 量。此外我们也必须了解平均正向
[电源管理]
51单片机驱动LCD1602的电路图+程序
如网页上出现格式错乱可从此处本例的完整 源码 : http://www.51hei.com/f/1602430.rar 上图是仿真效果 显示2行字符. #include AT89x51.h #define uchar unsigned char /***************************************** 电路连接 P1------DB0~DB7 P2.0------RS P2.1------RW P2.2------E *****************************************/ #define LCD_DB P1 sbit LCD_RS=P2^0; sbit LC
[单片机]
51单片机<font color='red'>驱动</font>LCD1602的电路图+程序
Allegro发布全新汽车级双极步进电机驱动器或双直流电机驱动
Allegro MicroSystems,LLC推出一款全新的汽车级双极步进电机驱动器或双直流电机驱动器IC AMT49702,新产品专为低压步进电机和双/单高电流直流电机的脉冲宽度调制(PWM)控制而设计。AMT49702的输出电流可达每通道1A,工作电压为3.5至15V,主要应用领域包括:平视显示器(HUD)中的镜面定位和防尘罩、导航系统中的屏幕升降器、驾驶员注意力监测系统中的摄像头移动或对焦、以及方向盘反馈中的振动警报等等。 AMT49702是一款汽车级器件,已经过扩展的温度和电压范围测试,能够确保符合汽车或工业应用的要求。它具有内部固定的关断时间PWM定时器,可根据选择的电流检测电阻来设置峰值电流。AMT49702
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved