/******************************************************** 
 
实现功能:DS1302测试程序 
使用芯片:AT89S52 
晶振:11.0592MHZ 
编译环境:Keil 
作者:zhangxinchunleo 
网站:www.ourhc.cn 
淘宝店:汇诚科技 http://shop36330473.taobao.com 
 
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      
********************************************************/ 
/*********************************包含头文件********************************/ 
#include "reg52.h" 
#include <intrins.h> 
 
/*********************************端口定义**********************************/ 
sbit DS1302_CLK = P1^0; 
sbit DS1302_IO  = P1^1; 
sbit DS1302_RST = P1^2; 
 
/*******************************共阳LED段码表*******************************/ 
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 
unsigned char wei[4]={0XEf,0XDf,0XBf,0X7f};  //位的控制端 
 
/******************************定义全局变量*********************************/ 
unsigned char second,minute,hour,week,day,month,year;                //秒、分、时、星期、日、月、年 
unsigned char time[]={0x06,0x03,0x14,0x03,0x12,0x30,0x00};        //初始时间数组 
/**************************************************************************** 
函数功能:数码管扫描延时子程序 
入口参数: 
出口参数: 
****************************************************************************/ 
void delay1(void) 
{ 
        int k; 
        for(k=0;k<400;k++); 
} 
 
/**************************************************************************** 
函数功能:数码管显示子程序 
入口参数:k 
出口参数: 
****************************************************************************/ 
void display(void) 
{         
      P2=0XFF; 
        P0=tab[minute/16]; 
          P2=wei[0]; 
                 delay1(); 
          P2=0XFF;   
         P0=tab[minute%16]; 
          P2=wei[1]; 
                  delay1(); 
          P2=0XFF;   
        P0=tab[second/16]; 
          P2=wei[2]; 
                delay1(); 
          P2=0XFF;   
        P0=tab[second%16]; 
          P2=wei[3]; 
                  delay1();  
          P2=0XFF; 
} 
/***************************************************************************** 
函数功能:向DS1302送一字节数据子程序 
入口参数: 
出口参数: 
*****************************************************************************/ 
void InputByte(unsigned char byte1) 
{ 
        char i; 
        for(i=8;i>0;i--) 
        { 
                DS1302_IO=(bit)(byte1&0x01); 
                DS1302_CLK=1; 
                _nop_(); 
                DS1302_CLK=0; 
                byte1>>=1; 
        } 
        return; 
} 
 
/***************************************************************************** 
函数功能:读DS1302一个字节子程序 
入口参数: 
出口参数: 
*****************************************************************************/ 
unsigned char outputbyte(void)   
{ 
        unsigned char i; 
        unsigned ucdat=0; 
        for(i=8;i>0;i--) 
        { 
                DS1302_IO=1; 
                ucdat>>=1; 
                if(DS1302_IO)ucdat|=0x80; 
                DS1302_CLK=1; 
                _nop_(); 
                DS1302_CLK=0; 
         } 
         return(ucdat); 
} 
 
/***************************************************************************** 
函数功能:向DS1302某地址写一字节数据子程序 
入口参数:addr,TDat 
出口参数: 
*****************************************************************************/ 
void write_ds1302(unsigned char addr,unsigned char TDat) 
{ 
        DS1302_RST=0; 
        _nop_(); 
        DS1302_CLK=0; 
        _nop_(); 
        DS1302_RST=1; 
         InputByte(addr); 
        _nop_(); 
        InputByte(TDat); 
        DS1302_CLK=1; 
        _nop_(); 
        DS1302_RST=0; 
} 
 
/***************************************************************************** 
函数功能:读DS1302地址子程序 
入口参数:add 
出口参数:timedata 
*****************************************************************************/ 
unsigned char read_ds1302(unsigned char addr) 
{ 
        unsigned char timedata; 
        DS1302_RST=0; 
        _nop_(); 
        DS1302_CLK=0; 
        _nop_(); 
        DS1302_RST=1; 
        InputByte(addr); 
        timedata=OutputByte(); 
        DS1302_CLK=1; 
        _nop_(); 
        DS1302_RST=0; 
        return(timedata); 
} 
 
/***************************************************************************** 
函数功能:初始化DS1302子程序 
入口参数:time[](全局变量) 
出口参数: 
*****************************************************************************/ 
void initial_ds1302() 
{ 
        write_ds1302(0x8e,0x00);                //写保护寄存器,在对时钟或RAM写前WP一定要为0 
        write_ds1302(0x8c,time[0]);                //年 
        write_ds1302(0x88,time[1]);                //月 
        write_ds1302(0x86,time[2]);                //日 
        write_ds1302(0x8A,time[3]);                //星期 
        write_ds1302(0x84,time[4]);                //时 
        write_ds1302(0x82,time[5]);                //分 
        write_ds1302(0x80,time[6]);                //秒 
        write_ds1302(0x8e,0x80);                //写保护寄存器 
} 
 
/***************************************************************************** 
函数功能:读DS1302时间子程序 
入口参数: 
出口参数:全局变量(second,minute,hour,week,day,month,year) 
*****************************************************************************/ 
void read_time() 
{ 
        second=read_ds1302(0x81);                //秒寄存器 
        minute=read_ds1302(0x83);                //分 
        hour=read_ds1302(0x85);                        //时 
        week=read_ds1302(0x8B);                        //星期 
        day=read_ds1302(0x87);                        //日 
        month=read_ds1302(0x89);                //月 
        year=read_ds1302(0x8d);                        //年 
} 
 
/***************************************************************************** 
函数功能:主程序 
入口参数: 
出口参数: 
*****************************************************************************/ 
void main(void) 
{ 
        initial_ds1302();                                //初始化DS1302 
        while(1) 
        { 
                read_time();                                //读取时间 
                display();                                        //显示时间 
        } 
} 
 
/***************************************************************************** 
                                     结束 
*****************************************************************************/ 
 
 
 
 |