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

📄 ds1302.c

📁 用于检测时钟芯片ds1302要用keil生成hex再用
💻 C
字号:
/*****************************************************************************
						MCU8051学习板演示程序
							
				(c) Copyright 2007-2007,广州恒芯电子
						All Rights Reserved
*****************************************************************************/

/*****************************************************************************
程序说明
名称: MCU8051学习板演示程序(DS1302测试)
功能: 实现在七段数码管上显示时间
版本:2007-07-01
*****************************************************************************/

/*****************************************************************************
硬件说明
单片机:   兼容MCS-51单片机
晶振频率: 11.0592MHz
*****************************************************************************/

#include "regx52.h"

/****************************************************************************
说明: 程序预定义
*****************************************************************************/
#define LED7A_STATUS P1_7/*数码管第一位控制引脚(0为有效,1为无效)*/
#define LED7B_STATUS P1_6/*数码管第二位控制引脚(0为有效,1为无效)*/
#define LED7C_STATUS P1_5/*数码管第三位控制引脚(0为有效,1为无效)*/
#define LED7D_STATUS P1_4/*数码管第四位控制引脚(0为有效,1为无效)*/

#define LED7_STATUS	P0/*数码管状态引脚(0为有效,1为无效)*/

#define DS1302_PIN_CLK	P1_0/*DS1302时钟引脚*/
#define DS1302_PIN_IO	P1_1/*DS1302数据引脚*/
#define DS1302_PIN_RST  P1_2/*DS1302复位引脚*/

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

/****************************************************************************
说明: 变量定义
*****************************************************************************/
code unsigned char m_ucLedTab[]=
{
	0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
	0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e, 0xff
};/*数码管十六进制编码表*/

unsigned char m_ucLedBuf[4];/*数码管显示值缓存*/
		
/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序	
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan();

/*****************************************************************************
名称: Ds1302WriteChar
说明: DS1302写字节
参数: unsigned char ucData 数据
返回: 无
*****************************************************************************/
void Ds1302WriteChar(unsigned char ucData); 

/*****************************************************************************
名称: Ds1302ReadChar
说明: DS1302读字节
参数: 无
返回: unsigned char 返回数据
*****************************************************************************/
unsigned char Ds1302ReadChar(void); 

/*****************************************************************************
名称: Ds1302Write
说明: DS1302写操作
参数: unsigned char ucAddr 地址,unsigned char ucData 数据
返回: 无
*****************************************************************************/
void Ds1302Write(unsigned char ucAddr, unsigned char ucData);

/*****************************************************************************
名称: Ds1302Read
说明: DS1302读操作
参数: unsigned char ucAddr 地址
返回: unsigned char 返回数据
*****************************************************************************/
unsigned char Ds1302Read(unsigned char ucAddr);

/*****************************************************************************
名称: Ds1302Set
说明: 设置DS1302时间参数
参数: unsigned char *pucData 时间参数
	  pucData[0]: 秒
	  pucData[1]: 分
	  pucData[2]: 时
	  pucData[3]: 日
	  pucData[4]: 月
	  pucData[5]: 星期
	  pucData[6]: 年
返回: 无
*****************************************************************************/
void Ds1302Set(unsigned char *pucData); 

/*****************************************************************************
名称: Ds1302Set
说明: 设置DS1302时间参数
参数: unsigned char *pucData 返回时间参数
	  pucData[0]: 秒
	  pucData[1]: 分
	  pucData[2]: 时
	  pucData[3]: 日
	  pucData[4]: 月
	  pucData[5]: 星期
	  pucData[6]: 年
返回: 无
*****************************************************************************/
void Ds1302Get(unsigned char *pucData);


/*****************************************************************************
程序开始
*****************************************************************************/
void main()
{	
	unsigned char ucTime[7];/*时间参数*/
	/*ucTime[0]: 秒*/
	/*ucTime[1]: 分*/
	/*ucTime[2]: 时*/
	/*ucTime[3]: 日*/
	/*ucTime[4]: 月*/
	/*ucTime[5]: 星期*/
	/*ucTime[6]: 年*/

	/*T0中断设定*/
  	TMOD=0x01;/*使用T0:GATE=0,C/T=0(定时),M1 M0=01(工作方式1)*/
	TH0=0xec;/*定时时间 50Hz/4 计算公式:10000H - (5 x 1000) = EC78H*/
	TL0=0x78;
	ET0=1;/*允许T0中断*/
	TR0=1;/*使T0工作*/
	EA=1;/*总中断开启*/

	/*设置时间当前参数*/
	ucTime[0]=0x00;
	ucTime[1]=0x30;
	ucTime[2]=0x12;
	ucTime[3]=0x01;
	ucTime[4]=0x01;
	ucTime[5]=0x01;
	ucTime[6]=0x07;
	Ds1302Set(&ucTime);/*设置时间*/

	while(1)
	{	
		Ds1302Get(&ucTime);/*获得时间*/

		/*将时间参数在数码管上显示*/
		m_ucLedBuf[0]=ucTime[2]>>4;
   		m_ucLedBuf[1]=ucTime[2]&0x0f;
		m_ucLedBuf[2]=ucTime[1]>>4;
	   	m_ucLedBuf[3]=ucTime[1]&0x0f;
	}
}

/*****************************************************************************
名称: Interrupt1Handler
说明: T0中断入口
参数: 无
返回 :无
*****************************************************************************/
void Interrupt1Handler() interrupt 1
{
	Led7Scan();/*数码管动态扫描处理程序*/
	TH0=0xec;/*重新设置T0定时值*/
	TL0=0x78;
}

/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan()
{	
	static unsigned char a=0;
	static unsigned char b=0;
	static unsigned char c=0;
	
	/*判断数码管动态扫描值*/
	switch(a)
	{
	case 0:/*处理数码管第一位*/
		LED7D_STATUS=1;/*设置数码管第四位为无效*/
		LED7A_STATUS=0;/*设置数码管第一位位有效*/
		break; 

	case 1:/*处理数码管第二位*/
		LED7A_STATUS=1;/*设置数码管第一位为无效*/
		LED7B_STATUS=0;/*设置数码管第二位位有效*/
		break; 

	case 2:/*处理数码管第三位*/
		LED7B_STATUS=1;/*设置数码管第二位为无效*/
		LED7C_STATUS=0;/*设置数码管第三位位有效*/
		break; 

	case 3:/*处理数码管第四位*/
		LED7C_STATUS=1;/*设置数码管第三位为无效*/
		LED7D_STATUS=0;/*设置数码管第四位位有效*/
		break; 
	}
	
	LED7_STATUS=m_ucLedTab[m_ucLedBuf[a]];/*将显示码送数码管状态引脚*/	

	/*0.5秒改变一次数码管上两点显示状态*/
	b++;
	if(b>100)
	{
		c=1-c;
		b=0;
	}
	P0_7=c;
	
	a++;/*数码管动态扫描值加1,若该值4则置为0*/
	if(a>3)
		a=0;

}

/*****************************************************************************
名称: Ds1302WriteChar
说明: DS1302写字节
参数: unsigned char ucData 数据
返回: 无
*****************************************************************************/
void Ds1302WriteChar(unsigned char ucData) 
{ 
    unsigned char a;

    ACC=ucData;
    for(a=8;a>0;a--)
    {
        DS1302_PIN_IO=ACC0;         
		DS1302_PIN_CLK=1;
        DS1302_PIN_CLK=0;
        ACC=ACC>>1; 
    } 
}

/*****************************************************************************
名称: Ds1302ReadChar
说明: DS1302读字节
参数: 无
返回: unsigned char 返回数据
*****************************************************************************/
unsigned char Ds1302ReadChar(void) 
{ 
    unsigned char a;

    for(a=8;a>0;a--)
    {
        ACC=ACC>>1;        
        ACC7=DS1302_PIN_IO;
		DS1302_PIN_CLK=1;
        DS1302_PIN_CLK=0;
    } 

    return ACC; 
}

/*****************************************************************************
名称: Ds1302Write
说明: DS1302写操作
参数: unsigned char ucAddr 地址,unsigned char ucData 数据
返回: 无
*****************************************************************************/
void Ds1302Write(unsigned char ucAddr, unsigned char ucData)
{
    DS1302_PIN_RST = 0;
    DS1302_PIN_CLK = 0;
	DS1302_PIN_RST = 1;
    Ds1302WriteChar(ucAddr);     
    Ds1302WriteChar(ucData);       
    DS1302_PIN_CLK = 1;
	DS1302_PIN_RST = 0;
} 

/*****************************************************************************
名称: Ds1302Read
说明: DS1302读操作
参数: unsigned char ucAddr 地址
返回: unsigned char 返回数据
*****************************************************************************/
unsigned char Ds1302Read(unsigned char ucAddr)
{
    unsigned char ucData;
   
    DS1302_PIN_RST = 0;
    DS1302_PIN_CLK = 0;
    DS1302_PIN_RST = 1;
    Ds1302WriteChar(ucAddr);           
    ucData = Ds1302ReadChar();        
    DS1302_PIN_CLK = 1;
	DS1302_PIN_RST = 0;
   
    return(ucData);
}

/*****************************************************************************
名称: Ds1302Set
说明: 设置DS1302时间参数
参数: unsigned char *pucData 时间参数
	  pucData[0]: 秒
	  pucData[1]: 分
	  pucData[2]: 时
	  pucData[3]: 日
	  pucData[4]: 月
	  pucData[5]: 星期
	  pucData[6]: 年
返回: 无
*****************************************************************************/
void Ds1302Set(unsigned char *pucData) 
{
    unsigned char a;
    unsigned char ucAddr=0x80; 
   
    Ds1302Write(0x8e,0x00);           
    for(a=7;a>0;a--)
    { 
        Ds1302Write(ucAddr,*pucData);  
        pucData++;
        ucAddr+=2;
    }
    Ds1302Write(0x8e,0x80);           
}

/*****************************************************************************
名称: Ds1302Get
说明: 读取DS1302时间参数
参数: unsigned char *pucData 返回时间参数
	  pucData[0]: 秒
	  pucData[1]: 分
	  pucData[2]: 时
	  pucData[3]: 日
	  pucData[4]: 月
	  pucData[5]: 星期
	  pucData[6]: 年
返回: 无
*****************************************************************************/
void Ds1302Get(unsigned char *pucData)
{
    unsigned char a;
    unsigned char ucAddr=0x81;
   
    for (a=7;a>0;a--)
    {
        pucData[7-a]=Ds1302Read(ucAddr);
        ucAddr+=2;
    }
}

					   

⌨️ 快捷键说明

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