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

📄 ds1302.txt

📁 ds1302时钟程序同时在数码管上显示,并且按键可调.
💻 TXT
字号:
//*************************************************************************
//                  DS1302子程序
//*************************************************************************
#include <pic.h>
#define uchar unsigned char
//////////////////////////////////端口定义////////////////////////////
#define  T_RST  RC1  
#define  T_IO RC2  
#define  T_CLK  RC3   
#define  K   RE0   
//////////////////////////////////位变量定义/////////////////////////
static volatile uchar acc @ 0x20;
static volatile bit acc0     @ (unsigned)&acc*8+0;
static volatile bit acc7     @ (unsigned)&acc*8+7;
//////////////////////////////////变量定义///////////////////////////
uchar data;
//uchar  BCD[4];      //显示缓冲区
//uchar get1302[7];
//uchar key_t;   //按键号
///////////////////////////////////////////////////////////
uchar second0,second1,minute0,minute1,hour0,hour1,date0;
uchar date1,day,month0,month1,year0,year1;
/////////////////////////函数申明/////////////////////////
void Delay(char x);   //功能:延时10us  
void v_RTInputByte(uchar ucDa) ; //功能:写入1Byte数据
uchar uc_RTOutputByte(void) ;  //功能:读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa); //功能:先写地址,后写命令/数据
uchar uc_R1302(uchar ucAddr);  //功能:先写地址,后读命令/数据
void v_BurstW1302T(uchar *pSecDa); //功能:先写地址,后写数据(时钟多字节方式)
void v_BurstR1302T(uchar *pSecDa); //功能:先写地址,后读命令/数据(时钟多字节方式)
void v_BurstW1302R(uchar *pReDa); //功能:先写地址,后写数据(寄存器多字节方式RAM)
void v_BurstR1302R(uchar *pReDa); //功能:先写地址,后读命令/数据(寄存器多字节方式RAM)
void v_Set1302(uchar *pSecDa) ;  //功能:设置初始时间
void v_Get1302(uchar ucCurtime[]);  //功能:读取DS1302当前时间
void  Display (uchar x,uchar y,uchar m,uchar n); //功能:显示两种时间
void read_sec();   //功能:读秒REG
void read_min();   //功能:读分REG
int Read_min();
void read_hour();   //功能:读时REG
int Read_hour();
void read_data();   //功能:读日REG
void read_day();   //功能:读周REG
void read_month();   //功能:读月REG
void read_year();   //功能:读年REG
void key_to();    //功能:按键处理
void initial();   //功能:端口定义
void Delay(char x)
{
    char i;
    while(x--)
    for(i=0;i<5;i++);
}

//******************************************************************** 
//* 功能: 往DS1302写入1Byte数据
//***********************************************************************/
void v_RTInputByte(uchar ucDa) 
{  
 uchar i,temp;             //先低位后高位
 temp = ucDa;
 TRISC=0x00;
 T_CLK=0;    
 for(i=8; i>0; i--)
 {
  if(temp&0x01)
  {
   T_IO = 1;     //先发第0位
  }
  else 
  {
   T_IO = 0;
  }
  T_CLK=1;              //要在调用此函数前先DS1302_CLK = 0
  Delay(1);
  T_CLK=0;              //上升沿
  Delay(1);
  temp = temp>>1;            //移第1位至第0位,发送
 } 
}
//******************************************************************** 
//* 功能: 从DS1302读取1Byte数据
//***********************************************************************/
uchar uc_RTOutputByte(void) 
{ 
 uchar i,temp;
 TRISC=0x04;
 T_CLK = 0; 
 for(i=8; i>0; i--)
 {                            //因为temp=0,先移位再接收和后接再接收可以
  temp = (temp >>1);     //先移位再接收//移第7位到第6位//移位后,空位补0
                                     //所以说最先接收的是第0位,暂放第7位
  if(T_IO)
  {
  temp=(temp|0x80); 
  }  
  else
  {
  temp=(temp&0x7f);
  }
  T_CLK = 1;              //要产生上升沿
  Delay(1);
  T_CLK = 0;      //在输出读命令字的8个slk周期后,
  Delay(1);
 }                            //数据开始输出,从0位开始,在每个时钟下降沿输出??????????/
 return(temp);                //书上例程:时钟上升沿,发送数据有效  
}
//******************************************************************** 
//先写地址,后写命令/数据
//***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_CLK = 0;
 Delay(5);
 T_RST = 0;
 Delay(5);
 T_RST = 1;
 Delay(1);
 v_RTInputByte(ucAddr);    // 地址,命令 
 v_RTInputByte(ucDa);     ///写1Byte数据
 T_RST =0 ;
 T_CLK =1;
 Delay(1);
}
//******************************************************************** 
//* 说明: 先写地址,后读命令/数据
//***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 Delay(2);
 T_CLK = 0;
 Delay(2);
 T_RST = 1;
 v_RTInputByte(ucAddr);   ///* 地址,命令 */
 ucDa = uc_RTOutputByte();  ///* 读1Byte数据 */
 T_RST =0;
 T_CLK =1;
 Delay(1);
 return(ucDa);
}
//******************************************************************** 
//* 说明: 先写地址,后读命令/数据(寄存器多字节方式RAM)
//***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 Delay(1);
 T_CLK = 0;
 Delay(1);
 T_RST = 1;
 Delay(1);
 v_RTInputByte(0xff);  //* 0xbf:时钟多字节读命令 */
 for (i=31; i>0; i--)   //*31Byte 寄存器数据 */
 {
 *pReDa = uc_RTOutputByte();  //* 读1Byte数据 */
 Delay(5);
 pReDa++;
}
 T_RST =0;
 T_CLK = 1;
 Delay(1);
}
//******************************************************************** 
//* 功能: 设置初始时间
//* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
//***********************************************************************/
void v_Set1302(uchar *pSecDa) 
{
 uchar i;
 uchar ucAddr = 0x80; 
 v_W1302(0x8e,0x00);   //* 控制命令,WP=0,写操作?*/
 Delay(5);
 for(i =7;i>0;i--)
 { 
 v_W1302(ucAddr,*pSecDa); ////* 秒 分 时 日 月 星期 年 */
 Delay(5);
 pSecDa++;
 ucAddr +=2;
 }
 //v_W1302(0x8e,0x80);  //* 控制命令,WP=1,写保护?*/
} 
//******************************************************************** 
//* 功能: 读取DS1302当前时间
//* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
//***********************************************************************/
void v_Get1302(uchar ucCurtime[]) 
{
 uchar i;
 uchar ucAddr=0x81;
 for(i=0;i<7;i++)
 {
  ucCurtime[i] = uc_R1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年
  Delay(5);
  ucAddr+=2;
  }
} 
 
//********************************************************************
//* 功能:读数据并进行BCD-十进制处理
//*********************************************************************
void read_sec()
{
 uchar data;
 data=uc_R1302(0x81);//秒
 second0=data&0x0f;
 second1=(data>>4)&0x07; 
}
void read_min()
{
 uchar data;
 data=uc_R1302(0x83);//分
 minute0=data&0x0f;
 minute1=(data>>4)&0x07;
}
int Read_min()
{
 uchar data;
 data=uc_R1302(0x83);//分
 return data;
 }
void read_hour()
{
 uchar data;
 data=uc_R1302(0x85);//时
 hour0=data&0x0f;
 hour1=(data>>4)&0x03;
} 
int Read_hour()
{
 uchar data;
 data=uc_R1302(0x85);//时
 return data;
 }
void read_data()
{
 uchar data;
 data=uc_R1302(0x87);//日
 date0=data&0x0f;
 date1=(data>>4)&0x03;
}
void read_day()
{
 uchar data;
 data=uc_R1302(0x8b);//周
 day=data&0x07;
}
void read_month()
{
 uchar data;
 data=uc_R1302(0x89);//月
 month0=data&0x0f;
 month1=(data>>4)&0x01;
}
void read_year()
{
 uchar data;
 data=uc_R1302(0x8d);//年
 year0=data&0x0f;
 year1=data>>4;
}

⌨️ 快捷键说明

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