×
嵌入式 > 技术百科 > 详情

时钟芯片DS1302程序案例

发布时间:2020-06-12 发布时间:
|

/*

       该程序主要实现如下的功能:

      

       从DS1302的秒寄存器中,读出秒的数值;

       将秒的数值用两个数码管显示出来。

*/

 

 

#include

#define uchar unsigned char

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit RST=P1^2;

sbit DATA=P1^1;

sbit SCLK=P1^0;

 

 

//延时n us函数

void Delayus(uchar n)

{

       uchar i;

       for(i=0;i

       {

        ;

       }

}

 

 

//往DS1302写入数据

void WriteDs1302(uchar dat)

{

       uchar i;

       SCLK=0;   

       Delayus(2);

       for(i=0;i<8;i++)

       {

              DATA=dat&0x01;

              Delayus(2);

              SCLK=1;

              Delayus(2);

              SCLK=0;

              dat>>=1;

              Delayus(2);

       }

}

 

 

//     往DS1302中写入命令及数据

void WriteSetDs1302(uchar cmd,uchar dat)

{

       RST=0;

       SCLK=0;

       RST=1;

       Delayus(2);

       WriteDs1302(cmd);

       WriteDs1302(dat);

       SCLK=1;

       RST=0;

 

}

 

 

//从DS1302中读出一个字节

uchar ReadDs1302()

{

        uchar dat,i;

        Delayus(2);

        //SCLK=1;

        Delayus(2);

        for(i=0;i<8;i++)

        {

             dat>>=1;

              if(DATA==1)

              {

                     dat|=0x80;

              }

              SCLK=1;

              Delayus(2);

              SCLK=0;

              Delayus(2);

        }

        return dat;

 

}

 

//从DS1302的特定的寄存器中,读出数据

uchar ReadSetDs1302(uchar cmd)

{

       uchar dat;

       RST=0;

       SCLK=0;

       RST=1;

       WriteDs1302(cmd);

       dat=ReadDs1302();

       SCLK=1;

       RST=0;

       return dat;

 

}

 

 

 //显示函数

void Dispaly(uchar dat)

{

       P0=table[dat];

}

 

 

//DS1302初始化函数

void Ds1302Init()

{

         WriteSetDs1302(0x8e,0x00);//去除写保护

         WriteSetDs1302(0x80,0x05);//往秒寄存器中写入数据

         WriteSetDs1302(0x8e,0x80);//开启写保护        

}

 

 

//1ms的延迟函数

void delay1ms()

{

     unsigned char i,j;   

        for(i=0;i<10;i++)

         for(j=0;j<33;j++)

          ;       

 }

 

 

// n ms 的延时函数

 

void Delayms(uchar n)

{

         uchar i;

         for(i=0;i

         {

             delay1ms();

         }

}

 

 

//主函数

void main()

{    

       uchar sec,num1,num2;

       Ds1302Init();

       P2=0Xfc;

       while(1)

       {

              sec=ReadSetDs1302(0x81); //从DS1302的秒寄存器中读出秒值

              num1=(sec&0x70)>>4;  //分离出秒值的十位数

              num2=sec&0x0f;           //分离出秒值的个位数

              P2=0xfd;

              Dispaly(num1);

              Delayms(5);

              P2=0xfe;

              Dispaly(num2);

              Delayms(5);

       }

}

 

同理,可读出分、时,月、年等时间信息,并显示出来。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
中国国产第三代核电实现并网发电