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

📄 改动后ds1302.txt

📁 PIC16F877_DS1302时钟程序
💻 TXT
字号:
//   关于DS1302的子程序集
/* command        是命令控制寄存器
   bytecon        是每次要发送的字节个数
   data_value     是要传输的数据
   RA0            与DS1302的CLK连接
   RA1            与I/O 相对应
   RA2            与RES相连接
   RTC           Real  Time  Clock
*/
#define  RTC_SCLK   RA0
#define  RTC_IO     RA1
#define  RTC_RES    RA2
unsigned char command;
unsigned char bytecon;
unsigned char data_value;
void write_enable();
void write_disenable();
void osc_enable();
void osc_disenable();
void send_bytes(char*pp);
void receive_bytes(char*pp);
void write_singlebyte(unsigned char ord_reg;unsigned char data);
void write_bytes(char*p);
void read_singlebyte(unsigned char data, char*p)
void read_bytes(char*p);
void initds1302();
void initds1302()
{ 
   ADCON1=0X07;
   TRISA0=0;
   TRISA0=1;
   TRISA0=2;
}
 
// 向DS1301写入数据
void  write_enable()
{
    command=0x8e;    // #8e是对写的考虑 
    bytecon=0x01;    // 送一个字节
    data_value=0x00; // 送的数据值是“00” 最高位是wp=0
                     //允许写入
    send_bytes(&data_value);
 }
//禁止写入数据
void write_disenable()
{
   command=0x8e;
   bytecon=0x01;
   data_value=0x80;  //WP=1是写保护,因此是禁止写入的
   send_bytes(&data_value);
}
//起振
void osc_enable()
{
   command=0x80;
   bytecon=0x01;
   data_value=0x00; //秒的最高位CH=0则启动振荡
   send_bytes(&data_value);
}
//停止振荡
void osc_disenable()
{
   command=0x80;
   bytecon=0x01;
   data_value=0x80; //秒的最高位CH=1则停止振荡
   send_bytes(&data_value);
}
//发送数据给DS1302
void send_bytes(char *pp)
{
   unsigned char bitcon;// 定义一个位循环变量
   unsigned char movbit;
   char *pd;      //point data
   PORTA=0XFF;
   RTC_RES=0;     //将RES置低电平,为通信好作准备 。此时是禁止的
    pd=pp;          //作为空语句,为了填补空语句
   RTC_SCLK=0;    //将RES置为高电平的条件
   movbit=command;   //复值给移位寄存器
   RTC_RES=1;        //使之可以进行通信
   for(bitcon=0x08;bitcon>0;--bitcon)//命令控制器是SCLK的上升沿
    {  
        RTC_IO=movbit;    //默认是取最低位
        RTC_SCLK=1;
        movbit=movbit>>1;    //利用C语言的移位指令 vari>>bit是左移
        RTC_SCLK=0;
     } 
/* 1.因为是写入数据所以也是时钟的上升沿           
   2.由于可以是单字节,又可以是多字节所以我们选择指针来做
   3.为了可以很好的用,我们最好先归定好他们的地址方便调用
*/  
    pd=pp;  //给指针初始的地址
    while(bytecon!=0) 
     {                 
       movbit=*pd;
       for(bitcon=0x08;bitcon>0;--bitcon)
         { 
             RTC_IO=movbit;
             RTC_SCLK=1;
             movbit=movbit>>1;
             RTC_SCLK=0;
          }
       bytecon--;
        pd++; //指针可以指向时钟
     }
    RTC_RES=0;  //禁止数据通信
}
//写给DS1302的单元中
void write_singlebyte(unsigned char ord_reg,unsigned char data)
{
     command=ord_reg;
     bytecon=0x01;
     data_vlaue=data;
     send_bytes(&data_value);
}
void write_bytes(char*p)
{   
      char*ptr;
    //write_enable();   //写多字节数据
    command=0x8e;
    bitcon=0x08;
    data_value=0;// 是允许写入
    ptr=&data_value;
    ++ptr;
    int i;
     for(i=0;i<7;i++)
        ++ptr=++p;    //  让PTR 与P指向同一变量
     ptr=&data_value;
    send_bytes(ptr);
}          
//从DS1302中读出数据
void read_singlebyte(unsigned char data, char*p)
{
      command=data;//选择要读的寄存器
      bytecon=0x1;
     receive_bytes(p); //还需要读到那里 
}
//读多个字
void read_bytes(char *p)
{
     command=0xbf;   //奇数是读rd,偶数是写w
     bytecon=0x08;
     receive_bytes(p);     
}
//读是下降沿有效    
void receive_bytes(char*pp)
{
      char dp;
      unsigned char bitcon;
      unsigned char movbit;
      RTC_RES=0;
      dp=p  ;
      RTC_SCLK=0;
      movbit=command;
      RTC_RES=1;//  打开数据通道
      for(bitcon=0x08;bitcon>0;--bitcon)
      {   
            movbit=RTC_IO;
            RTC_SCLK=1;
            movbit=movbit<<1;
            RTC_SCLK=0;
       }
//接收数据则要下降沿
 //命令已经发送完成了,现在开始接收数据了,所以要该变传输方向
       TRISA1=1;   //
       while(bytecon!=0)
        {
            for(bitcon=0x08;bitcon>0;--bitcon)
            {   
              movbit=RTC_I;
              RTC_SCLK=0;
              movbit=movbit<<1;
              RTC_SCLK=1;
            }
             *dp=movbit;     //把移出的数据交给指针
             dp++;          //让指针指向下一个数
             bytecon--;
        }
      RTC_RES=0;
}
                 
           
          
      
            

   

⌨️ 快捷键说明

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