51单片机1302时钟

#include<reg52.h>       //12864显示

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]="shidu:";  //把你要显示的东西写成数组

uchar code table1[]="wendu:";

sbit out = P1^0;

uchar a,miao,shi,fen,ri,yue,nian,week,temp;

sbit SCLK=P2^1;  // 6  P1.1

sbit IO=P2^0;    // 7  P1.0

sbit RST=P2^4;   //时钟 5  P1.2

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

sbit shinen=P2^7;                 //使能

sbit RS=P2^6;                              //数据命令选择端

sbit RW=P2^5;                             //读或写的选择

uchar num;

bit flag=0;

uchar code tab1[]={"2019-12-06"};

uchar code tab2[]={"17:17:00"};

uchar code tab3[]={"5"};

/*********************over***********************/

void delay30us(void)   //误差 0us

{

    unsigned char a,b;

    for(b=3;b>0;b--)

        for(a=3;a>0;a--);

}

void delay20ms(void)   //误差 0us

{

    unsigned char a,b;

    for(b=215;b>0;b--)

        for(a=45;a>0;a--);

    _nop_();  //if Keil,require use intrins.h

    _nop_();  //if Keil,require use intrins.h

}

void delay40us(void)   //误差 0us

{

    unsigned char a,b;

    for(b=1;b>0;b--)

        for(a=17;a>0;a--);

}

void delay(uint xms)              //xms等于几就延迟几毫秒

{

    uint i,j;

       for(i=xms;i>0;i--)

           for(j=112;j>0;j--);

}

void xieminglin(uchar com)   //写命令

{

       RS=0;

       RW=0;

       P0=com;

       delay(5);

       shinen=1;

       delay(5);

       shinen=0;

}

void xieshuju(uchar date)      //写数据

{

       RS=1;

       RW=0;

       P0=date;

       delay(5);

       shinen=1;

       delay(5);

       shinen=0;

}

void chushihua()                          //初始化

{

       shinen=0;

       delay(15);

       xieminglin(0x30);  //初始化操作

       xieminglin(0x0c); 

       xieminglin(0x01);

}

/********************dht11****************************/

void t11chushihua()

{

       out=0;

       delay20ms();

       out=1;

       delay40us(); 

}

uchar dushuju()

{

       uchar num=0;

       uchar i;

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

       {

              while(out==0);

              flag=0;

              delay30us();

              if(out==1)

              flag=1;

              num=num<<1;

              num=num|flag;

              while(out==1);

       }

       return num;

}

/********************ds1302****************************/

void write_byte(uchar dat)

{

       ACC=dat;

       RST=1;

       for(a=8;a>0;a--)

       {

              IO=ACC0;

              SCLK=0;

              SCLK=1;

              ACC=ACC>>1;

       }

}

uchar read_byte()

{

       RST=1;

       for(a=8;a>0;a--)

       {

              ACC7=IO;

              SCLK=1;

              SCLK=0;

              ACC=ACC>>1;

       }

       return (ACC);

}

void write_1302(uchar add,uchar dat)

{

       RST=0;

       SCLK=0;

       RST=1;

       write_byte(add);

       write_byte(dat);

       SCLK=1;

       RST=0;

}

uchar read_1302(uchar add)

{

       uchar temp;

       RST=0;

       SCLK=0;

       RST=1;

       write_byte(add);

       temp=read_byte();

       SCLK=1;

       RST=0;

       return(temp);

}

uchar BCD_Decimal(uchar bcd)

{

 uchar Decimal;

 Decimal=bcd>>4;

 return(Decimal=Decimal*10+(bcd&=0x0F));

}

void ds1302_init()

{

       RST=0;

       SCLK=0;

       write_1302(0x80,miao|0x00);//允许写

       write_1302(0x8e,0x00);

       miao= (tab2[6]-0x30)*10+(tab2[7]-0x30);

       temp=(miao)/10*16+(miao)%10;

       write_1302(0x80,0x00|temp);

       fen= (tab2[3]-0x30)*10+(tab2[4]-0x30);

       temp=(fen)/10*16+(fen)%10;

       write_1302(0x82,0x00|temp);

       shi= (tab2[0]-0x30)*10+(tab2[1]-0x30);

       temp=(shi)/10*16+(shi)%10;

       write_1302(0x84,0x00|temp);

       ri= (tab1[8]-0x30)*10+(tab1[9]-0x30);

       temp=(ri)/10*16+(ri)%10;

       write_1302(0x86,0x00|temp);

       yue= (tab1[5]-0x30)*10+(tab1[6]-0x30);

       temp=(yue)/10*16+(yue)%10;

       write_1302(0x88,0x00|temp);

       week= (tab3[0]-0x30);

       temp=week;

       write_1302(0x8A,0x00|temp);

       nian= (tab1[2]-0x30)*10+(tab1[3]-0x30);

       temp=(nian)/10*16+(nian)%10;

       write_1302(0x8C,0x00|temp);

       write_1302(0x8e,0x80);

}

void ds1302readtime()         //读取ds1302的时间

{     

       miao = BCD_Decimal(read_1302(0x81));

       fen = BCD_Decimal(read_1302(0x83));

       shi  = BCD_Decimal(read_1302(0x85));

       ri  = BCD_Decimal(read_1302(0x87));

       yue = BCD_Decimal(read_1302(0x89));

       nian=BCD_Decimal(read_1302(0x8d));

       week=BCD_Decimal(read_1302(0x8b));

       xieminglin(0x80);

       xieshuju(2+0x30);

       xieshuju(0+0x30);

       xieshuju(nian/10+0x30);

       xieshuju(nian%10+0x30);

       xieshuju('-');

       xieshuju(yue/10+0x30);

       xieshuju(yue%10+0x30);

       xieshuju('-');

       xieshuju(ri/10+0x30);

       xieshuju(ri%10+0x30);

       xieshuju(' ');

       xieshuju(week+0x30);

       xieminglin(0x90);

       xieshuju(shi/10+0x30);

       xieshuju(shi%10+0x30);

       xieshuju(':');

       xieshuju(fen/10+0x30);

       xieshuju(fen%10+0x30);

       xieshuju(':');

       xieshuju(miao/10+0x30);

       xieshuju(miao%10+0x30);

}

void lcdshow1(uchar wendu)

{

       xieminglin(0x88);           //写入命令,第一行

       for(num=0;num<6;num++)     //写入数据,每一位数据之间有延时

       {

              xieshuju(table[num]);

              delay(5);

       }

       xieshuju(wendu/10+0x30);

       delay(5);

       xieshuju(wendu%10+0x30);

       delay(5);

}

void lcdshow2(shidu)

{

       xieminglin(0x98);    //写入命令,第二行

       for(num=0;num<6;num++)      //写入数据

       {

              xieshuju(table1[num]);

              delay(5);

       }

       xieshuju(shidu/10+0x30);

       delay(5);

       xieshuju(shidu%10+0x30);

       delay(5);

}

void main()

{     

       uchar wendu1=0;

       uchar wendu2=0;

       uchar shidu1=0;

       uchar shidu2=0;

       uchar jiaoyan=0;

       uchar ture=0;

       chushihua();

       ds1302_init();

       while(1)

       {

              t11chushihua();

             

              if(out==0)

              {

                     while(out==0);

                     while(out==1);

                     wendu1=dushuju();

                     wendu2=dushuju();

                     shidu1=dushuju();

                     shidu2=dushuju();

                     jiaoyan=dushuju();

                     ture=wendu1+wendu2+shidu1+shidu2;

                     if(jiaoyan==ture)

                     {

                            ds1302readtime();

                            lcdshow1(wendu1);

                            lcdshow2(shidu1);

                     }

                     else

                     {

                          ds1302readtime();

                     }

              }

       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值