⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1302.c.bak

📁 单片机与时钟芯片ds1302接口程序
💻 BAK
字号:
/*********************************************************************

 公司名称:
 模块名称:DS1302.c
 功    能:实时时钟模块           时钟芯片型号:DS1302 
 说    明:
 程序设计:zhaojunjie        
 设计时间:2002.03.02        
 版 本 号: 20020302
*********************************************************************/
//#include <jyh.h>
#include <intrins.h>
#include "me.h"
#define uchar unsigned char
unsigned int XMS;
//sbit     T_CLK      = P2^7;   /*实时时钟时钟线引脚 */
//sbit     T_IO       = P1^4;   /*实时时钟数据线引脚 */
//sbit     T_RST      = P1^5;   /*实时时钟复位线引脚 */
sbit     T_CLK      = P1^6;   /*实时时钟时钟线引脚 */
sbit     T_IO       = P1^7;   /*实时时钟数据线引脚 */
sbit     T_RST      = P3^4;   /*实时时钟复位线引脚 */

sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

//此处定义数码管各段位置
#define a   0x01		//D7
#define b   0x02		//D6
#define c  	0x04		//D4
#define d   0x08		//D3
#define e   0x10		//D2
#define f	  0x20		//D0
#define g		0x40		//D1
#define dot 0x80		//D5
//////////////////////////////

//        ~(a+b+c+d+e+f),    // 共阳极
//        (a+b+c+d+e+f),    // 共阴极
//定义特殊符号
//数码管显示时用的编码
unsigned char code seg[] = 
{
	~(a+b+c+d+e+f),        // 0
	~(b+c),                // 1
	~(a+b+d+e+g),          // 2
	~(a+b+c+d+g),          // 3
	~(b+c+f+g),            // 4
	~(a+c+d+f+g),          // 5
	~(a+c+d+e+f+g),        // 6
	~(a+b+c),			   			// 7
	~(a+b+c+d+e+f+g),      // 8
	~(a+b+c+d+f+g),        // 9
	~(a+b+c+e+f+g),        //A
	~(c+d+e+f+g),          //b
	~(a+d+e+f),            //C
	~(b+c+d+e+g),          //d
	~(a+d+e+f+g),          //E
	~(a+e+f+g)             //F
};
char dispbuf[]={0,1,2,3,4,5};
char low[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char stacode=0; //进入设置位数状态
void   RTInputByte(uchar);       /* 输入 1Byte */
uchar  RTOutputByte(void);       /* 输出?1Byte */
void   W1302(uchar, uchar);
uchar  R1302(uchar);
void   Set1302(uchar *);         /* 设置时间 */
void   Bcd2asc(uchar,uchar *);
void   Get1302(uchar curtime[]); /* 读取1302当前时间 */

/******************************************************************** 

 函 数 名:RTInputByte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据 (内部函数)
 入口参数:d 写入的数据 
 返 回 值:无  
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void RTInputByte(uchar dat) 
{ 
    uchar i;
    ACC = dat;
    for(i=8; i>0; i--)
    {
        T_IO = ACC0;           /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}
/******************************************************************** 

 函 数 名:RTOutputByte()
 功    能:实时时钟读取一字节
 说    明:从DS1302读取1Byte数据 (内部函数)
 入口参数:无  
 返 回 值:ACC
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar RTOutputByte(void) 
{ 
    uchar i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 

 函 数 名:W1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:R1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}
/******************************************************************** 

 函 数 名:BurstW1302T()
 功    能:往DS1302写入时钟数据(多字节方式)
 说    明:先写地址,后写命令/数据
 调    用:RTInputByte() 
 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
                            8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void BurstW1302T(uchar *pWClock)
{
    uchar i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */
    for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
    {
        RTInputByte(*pWClock); /* 写1Byte数据*/
        pWClock++;
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:BurstR1302T()
 功    能:读取DS1302时钟数据
 说    明:先写地址/命令,后读数据(时钟多字节方式)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void BurstR1302T(uchar *pRClock)
{
    uchar i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */
    for (i=8; i>0; i--) 
    {
       *pRClock = RTOutputByte();   /* 读1Byte数据 */
       pRClock++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

 函 数 名:BurstW1302R()
 功    能:往DS1302寄存器数写入数据(多字节方式)
 说    明:先写地址,后写数据(寄存器多字节方式)
 调    用:RTInputByte()
 入口参数:pWReg: 寄存器数据地址
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void BurstW1302R(uchar *pWReg)
{
    uchar i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */
    for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
    {
        RTInputByte(*pWReg);    /* 写1Byte数据*/
        pWReg++;
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:BurstR1302R()
 功    能:读取DS1302寄存器数据
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:pRReg: 寄存器数据地址
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void BurstR1302R(uchar *pRReg)
{
    uchar i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
    for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
    {
        *pRReg = RTOutputByte();  /* 读1Byte数据 */
        pRReg++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

 函 数 名:Set1302()
 功    能:设置初始时间
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W1302()
 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void Set1302(uchar *pClock) 
{
    uchar i;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(i =7; i>0; i--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr +=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
}
void delayms(int t)
{
	uchar i;
	while(t--)
	{
	i=100;
	while(i--);	
	}
}
/******************************************************************** 

 函 数 名:Get1302()
 功    能:读取DS1302当前时间
 说    明:
 调    用:R1302() 
 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
                                        7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void Get1302(uchar ucCurtime[]) 
{
    uchar i;
    char j;
    uchar ucAddr = 0x81;
    for (i=0; i<7; i++)
    {
        j= R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
				if (j>=0)
        ucCurtime[i] =j;/*格式为: 秒 分 时 日 月 星期 年 */
        //ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
        ucAddr += 2;
				//_nop_();
    }
}
/*//////////////////////////////////////////////////////////////////////*/


void put_num(char cnum)
{
	P0=seg[ cnum & 0x0f];
}

#define xt_mhz 		11.0592			//晶体的振荡频率
//unsigned int TimeTHTL;
unsigned int TimeMode1Set(float timeslot)
{
	return (unsigned int)(0x10000-xt_mhz*1000000/12*timeslot);
}
idata unsigned  int TimeTick;
void timer0() interrupt 1 using 1 
{ 
	static  char disppoint;
//	unsigned char temp; 
	//晶振为 11.0592MHZ 时计数 9216(2400)=(0x10000-0xd800) 次为 10ms 
    //11.0592*10e6/12=每秒计数 /100=10ms应计数
	TH0=(XMS/256); 
	TL0=(XMS%256);
	TimeTick++;

	P2=P2|0x3f;

	//put_num(dispbuf[disppoint]);
	P0=seg[ dispbuf[disppoint] & 0x0f];
	if(disppoint==2)	P0&=~dot; /* 小数点*/

	P2=P2 & low[disppoint];

	if (disppoint++>=5)	disppoint=0;

} 
void displed(void)
{

}
void systemini(void)
{
	P0=0xff;
	P1=0xff;
	P2=0xff;
	P3=0xff;
	TMOD=0x01;
	XMS=TimeMode1Set(0.004);
	//XMS=2000;
	//XMS=0x10000-1000;
	TH0=XMS/256;	/* 5ms */
	TL0=XMS%256;
	TR0=1;
 	ET0=1;              //Enable timer 0 Interrupt
	EA=1;
//	stop=1;
}
void main(void)
{
  uchar WClock[8]={0x01,0x02,0x03};/*格式为: 秒 分 时 日 月 星期 年 */
  uchar RClock[8];
  uchar ds_hour;
  uchar ds_min;
  uchar ds_sec;
	systemini();
//	Get1302(&RClock);			/*把当前的时间值读取到数组SClock[3]中去*/
Set1302(WClock);		
while(1)
	{

    //Get1302(&RClock);                /*获取当前时间值*/
//		displed();
		//BurstR1302T(&RClock);
//		Get1302(&RClock);			/*把当前的时间值读取到数组SClock[3]中去*/
//		if (TimeTick>5)
//		{
//			TimeTick=0;		
		  Get1302(&RClock);			/*把当前的时间值读取到数组SClock[3]中去*/
	    ds_sec  = RClock[0];//&0x7f;        /*得到当前时间秒值*/
	    ds_min  = RClock[1];             /*得到当前时间分值*/
	    ds_hour = RClock[2];             /*得到当前时间小时值*/
			dispbuf[0]=ds_hour>>4;
			dispbuf[1]=ds_hour&0x0f;
			dispbuf[2]=ds_min>>4;
			dispbuf[3]=ds_min&0x0f;
			dispbuf[4]=ds_sec>>4;
			dispbuf[5]=ds_sec&0x0f;
//	  }
		//delayms(2000);
//		keyproc();
		//ledrun();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -