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

📄 ds1302.c

📁 C语言写的一个DS1302实时时钟程序
💻 C
字号:


#include<pic.h>                        //包含单片机内部资源预定义
__CONFIG(0x1832);       
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define i_o   RB4                      //定义DS1302的数据口
#define sclk  RB0                      //定义DS1302的时钟口
#define rst   RB5                      //定义DS1302的复位口

// unsigned char time_rx;
  unsigned char time_rx @ 0x30;        //定义接收寄存器
  static volatile bit time_rx7   @ (unsigned)&time_rx*8+7;   //接收寄存器的最高位
//static volatile bit temp0     @ (unsigned)&temp*8+0;

void port_init();                      //申明引脚初始化函数
void ds1302_init();                    //申明DS1302初始化函数
void set_time();                       //申明设置时间函数
void get_time();                       //申明读取时间函数
void display();                        //申明显示函数
void time_write_1(unsigned char time_tx);    //申明写一个字节函数
unsigned char  time_read_1();          //申明读一个字节函数      
void delay();                          //申明延时函数
//定义待设置的时间:秒、分、时、日、月、星期、年、控制字
const char table[]={0x00,0x58,0x12,0x8,0x3,0x06,0x06,0x00};
//定义读取时间和日期存放表格
char table1[7];
//定义0-9的显示代码
const char table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

//----------------------------------------------
//主函数 
void main()
  {
     port_init();                     //调用引脚初始化函数
     ds1302_init();                   //调用DS1302初始化函数
     set_time();                      //调用设置时间函数
     while(1)
        {
          get_time();                 //调用取时间函数
          display();                  //调用显示函数
        }
  }

//---------------------------------------------
//DS1302初始化函数
void ds1302_init()
  {
   sclk=0;                            //拉低时钟信号
   rst =0;                            //复位DS1302
   rst=1;                             //使能DS1302
   time_write_1(0x8e);                //发控制命令
   time_write_1(0);                   //允许写DS1302
   rst=0;                             //复位
  }

//---------------------------------------------
//设置时间函数
void set_time()
  {
   int i;                             //定义循环变量
   rst=1;                             //使能DS1302
   time_write_1(0xbe);                //时钟多字节写命令
   for(i=0;i<8;i++)                   //连续写8个字节数据
     {
       time_write_1(table[i]);        //调用写一个字节函数
     }
   rst=0;                             //复位
   }

//---------------------------------------------
//读取时间函数
void get_time()
 {
   int i;                             //设置循环变量
   rst=1;                             //使能DS1302
   time_write_1(0xbf);                //发送多字节读取命令
   for(i=0;i<7;i++)                   //连续读取7个字节数据
     {
        table1[i]=time_read_1();      //调用读取1个字节数据的函数
     }
    rst=0;                            //复位DS1302
 }

//--------------------------------------------
//写一个字节数据函数
void time_write_1(unsigned char time_tx)
 {
    int j;                            //设置循环变量
    for(j=0;j<8;j++)                  //连续写8bit
      {
        i_o=0;                        //先设置数据为0
        sclk=0;                       //时钟信号拉低
        if(time_tx&0x01)              //判断待发送的数据位是0或1
          {
            i_o=1;                    //待发送数据位是1
          }
        time_tx=time_tx>>1;           //待发送的数据右移1位
        sclk=1;                       //拉高时钟信号
       }
      sclk=0;                         //写完一个字节,拉低时钟信号
  }

//---------------------------------------------
//读一个字节函数
unsigned char time_read_1()
 {
   int j;                            //设置循环变量
   TRISB4=1;                         //设置数据口方向为输入
   for(j=0;j<8;j++)                  //连续读取8bit
      {
        sclk=0;                      //拉低时钟信号
        time_rx=time_rx>>1;          //接收寄存器右移1位
        time_rx7=i_o;                //把接收到的数据放到接收寄存器的最高位
       sclk=1;                       //拉高时钟信号
      }
    TRISB4=0;                        //恢复数据口方向为输出
    sclk=0;                          //拉低时钟信号
    return(time_rx);                 //返回读取到的数据
  }

//--------------------------------------------
//引脚定义函数
void port_init()
  {
    TRISA=0x00;                     //设置A口全输出
    TRISD=0X00;                     //设置D口全输出
    ADCON1=0X06;                    //设置A口为普通I/O口
    TRISB=0X02;                     //设置RB1为输入,其他为输出
    OPTION=0X00;                    //开启B口弱上拉
    PORTA=0XFF;               
    PORTD=0XFF;                     //先熄灭所有显示
   }

//-------------------------------------------
//显示函数
void display()
   {
     int i;                         //定义查表变量
     if(RB1==0)                     //判断RB1是否按下,如果按下的话显示日期,不按下显示时间
       {
          table1[0]=table1[3];     
          table1[1]=table1[4];
          table1[2]=table1[6];
       }
     i=table1[0]&0x0f;             //求秒的个位
     PORTD=table2[i];              //送D口显示
     PORTA=0x1f;                   //点亮秒的个位
     delay();                      //延长一段时间,保证亮度
     i=table1[0]&0xf0;             //求秒的十位
     i=i>>4;                       //右移4位
     PORTD=table2[i];              //送D口显示
     PORTA=0x2f;                   //点亮秒的十位
     delay();                      //延长一段时间,保证亮度
     
     i=table1[1]&0x0f;             //求分的个位
     PORTD=table2[i]&0x7f;         //送D口显示,并显示小数点
     PORTA=0x37;                   //点亮分的个位
     delay();                      //延时一定时间,保证亮度
     i=table1[1]&0xf0;             //求分的十位
     i=i>>4;                 
     PORTD=table2[i];              //送D口显示
     PORTA=0x3b;                   //点亮分的十位
     delay();                      //延长一段时间,保证亮度

     i=table1[2]&0x0f;             //求时的个位
     PORTD=table2[i]&0x7f;         //送D口显示,并加上小数点
     PORTA=0x3d;                   //点亮时的个位
     delay();                      //延时一定时间,保证亮度
     i=table1[2]&0xf0;             //求时的十位
     i=i>>4;    
     PORTD=table2[i];              //送D口显示
     PORTA=0x3e;                   //点亮时的十位
     delay();                      //延长一段时间,保证亮度
   }

//------------------------------------------------------------------
//延时程序
void  delay()              //延时程序
    {
     int i;                 //定义整形变量
     for(i=0x64;i--;);     //延时
    }

⌨️ 快捷键说明

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