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

发布者:自在堂最新更新时间:2017-12-05 来源: eefocus关键字:pic  单片机控制  时钟芯片  DS1302 手机看文章 扫描二维码
随时随地手机看文章

#includeIC.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--;);     //延时 
    } 

  

//先设置时间和日期为:秒(00),分(58),时(12),日(08),月(03),年(06) 
//六位数码观显示时间和日期,默认显示的是时间,通过小数点区分时与分、分与秒


关键字:pic  单片机控制  时钟芯片  DS1302 引用地址:pic单片机控制时钟芯片DS1302程序

上一篇:PIC单片机控制DS1302子程序
下一篇:PIC16F628A LED流水灯示例程序

推荐阅读最新更新时间:2024-03-16 15:48

五大单片机全解析--51、AVR、PIC、MSP430、ARM
当今单片机厂商琳琅满目,产品性能各异。针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。采用CISC结构的单片机数据线和指令线分时复用,即所谓冯。诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。这使得取指令和取数据可同时进行,且由于一般指令线宽于数据线,使其指令较同类CISC单片机指令包含更多的处理信息,执行效率更高,速度亦更快。同时,这种单片机指令多为单字节,程序存储器的空间利用率大大提高,有利于实现超小型化。 8051 AVR和pic都是跟8051结构不同的8位单片机,
[单片机]
五大单片机全解析--51、AVR、<font color='red'>PIC</font>、MSP430、ARM
51单片机控制K9K8G08U0C NAND Flash读写程序
#include STC12C5A60S2.H #include intrins.h #include SMG.h /********************************************/ sbit NF_CLE=P0^3; //命令锁存使能(输出) CLE D3 sbit NF_ALE=P3^4; //地址锁存使能(输出) ALE RS sbit NF_WE=P1^3; //NAND Flash写使能(输出) /WE DB4 sbit NF_RE=P1^2; //NAND Flash读使能(输出) /RE DB3 sbit NF_CE
[单片机]
PIC单片机实例一:PROTEUS模拟豆浆机
1 引言 目前,人们对生活的质量要求越来越高,人们在忙于工作之余,豆浆机是一种新型的家用饮料机,以黄豆为原料,直接加工成熟的热豆浆。若在黄豆中配以芝麻、花生、杏仁等佐料,可以做出各种风味的鲜美饮料。 豆浆机由粉碎黄豆的搅拌机、豆浆加热器和控制电路三大部分组成。用单片机研制的全自动豆浆机的控制电路,只要按下启动按键,豆浆机就开始工作,一会儿就能喝到美味又营养的豆浆。整个过程由单片机全自动控制,让您用起来更加地方便、更加的安全。特用PROTEUS模拟,体验单片机的乐趣. 2 豆浆机的功能 单独加热:具有单独加热功能,当达到规定温度时停止加热。 自动工作:流程如下:在有水的情况下,电热管开始加热,当水温上升到82℃时,停止加热,电
[单片机]
<font color='red'>PIC</font>单片机实例一:PROTEUS模拟豆浆机
一文读懂PIC单片机的技术特性和优势
对于电子工程师而言,PIC单片机是非常重要的一个产品。PIC单片机是一种用来开发的去控制外围设备的集成电路,一种具有分散作用(多任务)功能的CPU,与人类相比,大脑就是CPU,PIC共享的部分相当于人的神经系统。 PIC单片机的特点 PIC 单片机是一个小的计算机,PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变。如果是同样的体系结构,时钟频率较高
[单片机]
一文读懂<font color='red'>PIC</font>单片机的技术特性和优势
PIC18F中断定时器
//基于MCC18编译器,使用HI-PICC不可用 //-------------------------------------------- #include p18F452.h //---------------------------------------------------------------------------- void main (void); void InterruptHandlerHigh (void); unsigned int Timeout; //------------------------------------------------------------------
[单片机]
PIC系列单片机程序设计基础应用与分析
  PIC的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。       MOVLW  TABLE     ;表头地址→F10         MOVWF  10           ┋       MOVLW  1        ;1→W,准备取“1”的线段值       ADDWF  10,1      ;F10+W =“1”的数据地址       CALL  CONVERT       MOVWF  6        ;线段值置到B口,点亮LE
[单片机]
PIC12F683微控制器实验板
  简介   电子产品是我的爱好。当我在大学的时候,我曾与微控制器的一些经验,我没有与Atmel的AT89C51的几个项目。最近,我已经长大了PIC单片机的利息,我想我应该开始用8针的微芯片。我挑的PIC12F683微芯片。该微控制器让我着迷了很多,因为我想看看我们能做些什么与8引脚微控制器(其中2个引脚的电源,所以实际上只是6针左侧的I / O)。所以我想这是我自己的学习板。在这个项目中,我首先要说明我的学习板,然后将演示几个实验。PIC12F683的一些功能: 工作电压范围宽(2.0 - 5.5V)   精确的内部振荡器(软件可选,8 MHz到125千赫)   6 I / O引脚电平变化中断功能。   4个10位A /
[单片机]
<font color='red'>PIC</font>12F683微控制器实验板
基于PIC18F66J60的Ethernet至RS-232的协议转换器
目前,在工业控制等多数领域中,大多数的设备的通信接口符合RS-232通信标准。这种通信方式的数据传输半径十分有限,并不能满足远程传输的需求,而且不能接入Internet。有两种方法可以将这些串口设备进行有效的改进,使其接入到Internet。一种方法更新原有的系统,采用能够接入Internet的新产品,或者对原有系统的全部或局部进行重新设计。这种方式可能从根本上解决系统接入到Internet问题,但是其成本较高、周期较长。另外一种方法是在原来的设备上面使用RS-232-Internet的协议转换器,实现Internet的接入。不论从复杂程度还是成本上面,这种方法明显优于第一种。 协议转换器的主要功能在于桥接,用户设备可以通过协议转换
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved