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

📄 ds1302.c

📁 DS1302时钟芯片读取与写入程序,mcu是PIC16F877
💻 C
字号:

#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
//*******************************端口定义*******************************/
#define T_RST RB1 
#define T_IO RB2 
#define T_CLK RA1   
//********************************变量定义*******************************/
uchar DisCash[7]={0x00,0x39,0x08,0x15,0x06,0x05,0x08};    //初始时间缓冲区
int  abc[]={1,2,3,5,4,};
uchar second0,second1,minute0,minute1,hour0,hour1,date0;
uchar date1,day,month0,month1,year0,year1;
/////////////////////////函数申明/////////////////////////
void delayus(uchar);   //功能:延时10us  ,,3*x+9=?
void v_RTInputByte(uchar) ; //功能:写入1Byte数据
uchar uc_RTOutputByte() ;  //功能:读取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 read_sec();   //功能:读秒REG
void read_min();   //功能:读分REG
void read_hour();   //功能:读时REG
void read_data();   //功能:读日REG
void read_day();   //功能:读周REG
void read_month();   //功能:读月REG
void read_year();   //功能:读年REG
void key_to();    //功能:按键处理
void initial();   //功能:端口定义
//********************************************延时程序********************************************************************/
void delayms(uchar x,uchar y)		//延时ms级的程序,延时时间为:(3*y+4)*x+10=?
{
  uchar z;
 do{
   z=y;
//   do{;}while(--z);
    while(--z);		//此句与上一句等效!
   }while(--x);
 asm("nop");
}

void delayus(uchar x)				//延时us级的程序,延时时间为:3*x+9=?
{
 uchar d;
 d=x;
 while(--d){;}
 asm("nop");
}



//******************************************************************** 
//* 功能: 往DS1302写入1Byte数据
//***********************************************************************/
void v_RTInputByte(uchar ucDa) 
{

  
 uchar i,temp;             //先低位后高位
 TRISB2=0;
 TRISB1=0;
 TRISA1=0;
 temp = ucDa;
 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
  delayus(50);
  T_CLK=0;              //上升沿
  delayus(50);
  temp = temp>>1;            //移第1位至第0位,发送
 } 
}
//******************************************************************** 
//* 功能: 从DS1302读取1Byte数据
//***********************************************************************/
uchar uc_RTOutputByte() 
{ 

 uchar i,temp;
 TRISB2=1;
 TRISB1=0;
 TRISA1=0;
 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;              //要产生上升沿
  delayus(50);
  T_CLK = 0;      //在输出读命令字的8个slk周期后,
  delayus(50);
 }                            //数据开始输出,从0位开始,在每个时钟下降沿输出??????????/
 return(temp);                //书上例程:时钟上升沿,发送数据有效  
}
//******************************************************************** 
//先写地址,后写命令/数据
//***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_CLK = 0;
 delayus(50);
 T_RST = 0;
 delayus(50);
 T_RST = 1;
 delayus(50);
 v_RTInputByte(ucAddr);    // 地址,命令 
 v_RTInputByte(ucDa);     ///写1Byte数据
 T_RST =0 ;
 T_CLK =1;
 delayus(50);
}
//******************************************************************** 
//* 说明: 先写地址,后读命令/数据
//***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 delayus(50);
 T_CLK = 0;
 delayus(50);
 T_RST = 1;
 v_RTInputByte(ucAddr);   ///* 地址,命令 */
 ucDa = uc_RTOutputByte();  ///* 读1Byte数据 */
 T_RST =0;
 T_CLK =1;
 delayus(50);
 return(ucDa);
}
//******************************************************************** 
//* 说明: 先写地址,后读命令/数据(寄存器多字节方式RAM)
//***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 delayus(50);
 T_CLK = 0;
 delayus(50);
 T_RST = 1;
delayus(50);
 v_RTInputByte(0xff);  // 0xbf:时钟多字节读命令 
 for (i=31; i>0; i--)   //31Byte 寄存器数据 
 {
 *pReDa = uc_RTOutputByte();  // 读1Byte数据 
delayus(50);
 pReDa++;
}
 T_RST =0;
 T_CLK = 1;
delayus(50);
}  
//******************************************************************** 
//* 功能: 设置初始时间
//* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
//***********************************************************************/
void v_Set1302(uchar *pSecDa) 
{
 uchar i;
 uchar ucAddr = 0x80; 
 v_W1302(0x8e,0x00);   //控制命令,WP=0,写操作
 delayus(50);
 for(i =7;i>0;i--)
 { 
 v_W1302(ucAddr,*pSecDa); //// 秒 分 时 日 月 星期 年 
 delayus(50);
 pSecDa++;
 ucAddr +=2;
 }
 v_W1302(0x8e,0x80);  // 控制命令,WP=1,写保护
} 
//********************************************************************
//* 功能:读数据并进行BCD-十进制处理
//*********************************************************************
void read_sec()
{
 uchar dat;
 dat=uc_R1302(0x81);//秒
 second0=dat&0x0f;
 second1=(dat>>4)&0x07; 
}
void read_min()
{
 uchar dat;
 dat=uc_R1302(0x83);//分
 minute0=dat&0x0f;
 minute1=(dat>>4)&0x07;
}
void read_hour()
{
 uchar dat;
 dat=uc_R1302(0x85);//时
 hour0=dat&0x0f;
 hour1=(dat>>4)&0x03;
} 
void read_data()
{
 uchar dat;
 dat=uc_R1302(0x87);//日
 date0=dat&0x0f;
 date1=(dat>>4)&0x03;
}
void read_day()
{
 uchar dat;
 dat=uc_R1302(0x8b);//周
 day=dat&0x07;
}
void read_month()
{
 uchar dat;
 dat=uc_R1302(0x89);//月
 month0=dat&0x0f;
 month1=(dat>>4)&0x01;
}
void read_year()
{
 uchar dat;
 dat=uc_R1302(0x8d);//年
 year0=dat&0x0f;
 year1=dat>>4;
}

//*************************************************************
//功能:主函数
//***********************************************************
main()
{     
  

        ADCON1=0X0E;
        TRISD=0X00;
        v_W1302(0x8E, 0x00);  //设置成写入允许
        delayus(8);
		//v_W1302(0x80, 0x00);  
        //v_Set1302(DisCash);//设置初始时间,并打开时钟
        delayus(8);
       // v_W1302(0x8E, 0x00);   //设置成写入允许
        delayus(8);
        v_W1302(0x90, 0x00);   //不允许慢充电寄存器
        delayus(8);
        v_W1302(0x8E,0x80);    //设置成禁止写入允许
        delayus(8);
//read_year();
//read_month();
//month1=0x0d;
//DisCash[5]=8;; 
  while(1)   
    {   
        //read_sec();
        //Delay(40);
        PORTD=uc_R1302(0x81);
    }   
}  

⌨️ 快捷键说明

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