找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2671|回復: 0
收起左側(cè)

DS1302時鐘時間芯片單片機程序

[復制鏈接]
ID:100029 發(fā)表于 2015-12-22 20:17 | 顯示全部樓層 |閱讀模式
#include<reg52.h>
#include<INTRINS.H>
/************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define write_second          0x80      //秒開始數(shù)存儲,修改用(下同)
#define write_minute           0x82      //分開始數(shù)存儲
#define write_hour              0x84      //時開始數(shù)存儲,12小時計時,從0開始要寫入0x80(12小時要判斷上下午)。
#define read_second          0x81      //秒,顯示要讀這個存儲器
#define read_minute           0x83      //分,顯示要讀這個存儲器
#define read_hour              0x85       //時,顯示要讀這個存儲器
#define write_day              0x86
#define read_day               0x87
#define write_month          0x88
#define read_month          0x89
#define write_week           0x8A
#define read_week           0x8B
#define write_year            0x8C
#define read_year            0x8D


#define write_protect 0x8E
/************************************************************/
sbit ACC_7=ACC^7;
sbit SCLK =P1^2;
sbit DIO  =P1^3;
sbit CE   =P1^4;      //protus軟件中的RST腳
/********************************/
uchar dd[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
                };
void delay(char us)
{
     char m,n;
     while(us--)
        {
           for(m=0;m<40;m++)
               for(n=0;n<50;n++);
        }
}
/**********/
void write1302(unsigned char addr,dat)
{
   unsigned char i,temp;
   CE=0;
   SCLK=0;
   CE=1;
   for(i=0;i<8;i++)  //寫入地址
      {
         SCLK=0;
         temp=addr;
         if(temp&0x01==0x01)
               DIO=1;
         else
               DIO=0;
        addr>>=1;
        SCLK=1;
     }

   for(i=0;i<8;i++)  //寫入數(shù)據(jù)
      {
        SCLK=0;
        temp=dat;
        if(temp&0x01==0x01)
             DIO=1;
        else
             DIO=0;
        dat>>=1;
        SCLK=1;
     }
}

unsigned char read1302(unsigned char addr)
{
   unsigned char i,temp,dat1,dat2;
   CE=0;
   SCLK=0;
   CE=1;
   for(i=8;i>0;i--)//寫入讀存儲單元地址
      {
       SCLK =0;
       temp =addr;
       if(temp&0x01==0x01)
            DIO=1;
       else
           DIO=0;
      addr>>=1;
      SCLK=1;
     }

for(i=8;i>0;i--)//讀數(shù)據(jù)
    {
       ACC_7=DIO;
       SCLK=1;
       ACC>>=1;
       SCLK=0;        //下降沿讀出數(shù)據(jù)
     }
CE=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return(ACC);
}
/////////////////////////////////////
void Initial(void)
{
        write1302(write_protect,0x00);
        write1302(write_second,0x56);
        write1302(write_minute,0x34);
        write1302(write_hour,0x12);
        write1302(write_protect,0x80);
}
/////////////////////
void main(void)
{
    unsigned char tt1,tt2,hour;
    Initial();
    write1302(write_second,0x55);  //秒從55開始
    write1302(write_minute,0x59);  //分從59開始
    write1302(write_hour,0x8B); //賦值0x80,為12小時計時,但低五位為計時為,所以,顯示只顯示低五位,小時從11開始
    write1302(write_year,0x0f);  //15年
    write1302(write_week,0x03);//周三
    write1302(write_month,0x0a);//10月

    while(1)
       {
          tt1=read1302(read_second);
          tt2=read1302(read_hour) & 0x1f;   //取出低五位
          if(read1302(read_hour) & 0x20==0x20) //12小時計時判斷上下午
               hour="pm "; // afternoon
           else
               hour="am ";//morning
   
          P0=dd[tt1/10];
          P2=0xfe;
          delay(2);
          P2=0xff;

          P0=dd[tt1%10];
          P2=0xfd;
          delay(2);
          P2=0xff;

          P0=dd[tt2/10];
          P2=0xf7;
          delay(2);
          P2=0xff;

         P0=dd[tt2%10];
         P2=0xfb;
         delay(2);
         P2=0xff;
}
}












回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表