找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2215|回复: 0
收起左侧

DS1302时钟时间芯片单片机程序

[复制链接]
ID:100029 发表于 2015-12-22 20:17 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<INTRINS.H>
/************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define write_second          0x80      //秒开始数存储,修改用(下同)
#define write_minute           0x82      //分开始数存储
#define write_hour              0x84      //时开始数存储,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++)  //写入数据
      {
        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--)//读数据
    {
       ACC_7=DIO;
       SCLK=1;
       ACC>>=1;
       SCLK=0;        //下降沿读出数据
     }
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;
}
}












回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表