欢迎来到友道创新学院!
咨询电话:010-59519886
硬件集成电路设计热门培训内容之pic单片机控制时钟芯片DS1302程序

#include                        //包含单片机内部资源预定义 

__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--;);     //延时 

    } 

  

//先设置时间和日期为:秒(00),分(58),时(12),日(08),月(03),年(06) 

//六位数码观显示时间和日期,默认显示的是时间,通过小数点区分时与分、分与秒


立即咨询有惊喜哦 !