单片机
返回首页

pic单片机控制时钟芯片DS1302程序

2017-12-05 来源:eefocus

#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) 
//六位数码观显示时间和日期,默认显示的是时间,通过小数点区分时与分、分与秒


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章