立即注册 登录
返回首页

uid:79012的个人空间

日志

万年历电路图

已有 1258 次阅读2015-5-5 21:57 |个人分类:电子作品| 万年历, 电路图

 

//本程序实现测温+万年历显示;

#include <reg51.h>

#include <intrins.h>

#include<absacc.H>

#include<stdio.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS1302_CLK = P3^5;

sbit DS1302_IO  = P3^6;

sbit DS1302_RST = P3^7;

sbit xing = P3^4;

sbit shanshuo = P1^0;

sbit jia = P1^1;

sbit jian = P1^2;

sbit DQ=P1^5;

sbit wei1=P1^6;

sbit wei2=P1^7;

sbit nao=P1^4;

sbit  xa=P1^3;

uchar shanshuobz,jiabz, jianbz,flag,shanbz,naobz,naozhong;

uchar num=0,x,t1;

uchar  tab[13];

uchar  naotab[6];

uchar  naobj[3],naojs,nz;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

       float tp;

uchar disptab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};

uchar dispbuf[6];

unsigned char second,minute,hour,week,day,month,year,temp,t,t1,flag,shi,ge;         //秒、分、时、星期、日、月、年

unsigned char time[]={0x22,0x12,0x31,0x06,0x23,0x59,0x45};    //初始时间数组111231235945

 

void delay(uchar z)

{

       uchar x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void InputByte(unsigned char byte1)

{     unsigned char i;                                       //     DS1302送一字节数据子程序

       ACC=byte1;

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

       {

              DS1302_IO=ACC0;

              DS1302_CLK=1;

              DS1302_CLK=0;

              ACC=ACC>>1;

       }

       return;

}

unsigned char OutputByte() 

{                                                      //     DS1302一个字节子程序

       unsigned char i;

      

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

       {     ACC=ACC>>1;

              ACC7=DS1302_IO;

              DS1302_CLK=1;

              DS1302_CLK=0;

        }

        return(ACC);

}

void write_ds1302(unsigned char addr,unsigned char TDat)

{

       DS1302_RST=0;                                                                  //     DS1302某地址写一字节数据子程序

       _nop_();

       DS1302_CLK=0;

       _nop_();

       DS1302_RST=1;

      InputByte(addr);

       _nop_();

       InputByte(TDat);

       DS1302_CLK=1;

       _nop_();

       DS1302_RST=0;

}

unsigned char read_ds1302(unsigned char addr)

{                                                                                                //     DS1302地址子程序

       unsigned char timedata,kk;

       DS1302_RST=0;

       _nop_();

       DS1302_CLK=0;

       _nop_();

       DS1302_RST=1;

       InputByte(addr);

       timedata=OutputByte();

       DS1302_CLK=1;

       _nop_();

       DS1302_RST=0;

       kk=timedata>>4;

       kk=kk*10+(timedata&=0x0f);

       return(kk);

}

void initial_ds1302()                           // 初始化DS1302子程序

{

       write_ds1302(0x8e,0x00);           //写保护寄存器,在对时钟或RAM写前WP一定要为0

       write_ds1302(0x8c,time[0]);              //

       write_ds1302(0x88,time[1]);              //

       write_ds1302(0x86,time[2]);              //

       write_ds1302(0x8A,time[3]);             //星期

       write_ds1302(0x84,time[4]);              //

       write_ds1302(0x82,time[5]);              //

       write_ds1302(0x80,time[6]);              //

       write_ds1302(0x8e,0x80);           //写保护寄存器

}

void read_time()

{                                                             // DS1302时间子程序

       second=read_ds1302(0x81);        //秒寄存器

       minute=read_ds1302(0x83);              //

       hour=read_ds1302(0x85);                  //

       week=read_ds1302(0x8B);                 //星期

       day=read_ds1302(0x87);                    //

       month=read_ds1302(0x89);        //

       year=read_ds1302(0x8d);                   //

}

void  fenli(void)

{

if(num==1)

{if(shanshuobz==0)

{tab[0]=0x00;

tab[1]=0x00;        

}

else

{

tab[0]=disptab[year/10];

tab[1]=disptab[year%10];

}

}

else

{

tab[0]=disptab[year/10];

tab[1]=disptab[year%10]; }

if(num==2)

{if(shanshuobz==0)

{tab[2]=0x00;

tab[3]=0x00;        

}

else

{

tab[2]=disptab[month/10];

tab[3]=disptab[month%10];

}

}

else

{

tab[2]=disptab[month/10];

tab[3]=disptab[month%10]; }

 

if(num==3)

{if(shanshuobz==0)

{tab[4]=0x00;

tab[5]=0x00;        

}

else

{

tab[4]=disptab[day/10];

tab[5]=disptab[day%10];

}

}

else

{

tab[4]=disptab[day/10];

tab[5]=disptab[day%10]; }

 

if(num==4)

{if(shanshuobz==0)

{tab[6]=0x00;

tab[7]=0x00;        

}

else

{

tab[6]=disptab[hour/10];

tab[7]=disptab[hour%10];

}

}

else

{

tab[6]=disptab[hour/10];

tab[7]=disptab[hour%10]; }

 

if(num==5)

{if(shanshuobz==0)

{tab[8]=0x00;

tab[9]=0x00;        

}

else

{

tab[8]=disptab[minute/10];

tab[9]=disptab[minute%10];

}

}

else

{

tab[8]=disptab[minute/10];

tab[9]=disptab[minute%10]; }

 

 

if(num==6)

{if(shanshuobz==0)

{tab[10]=0x00;

tab[11]=0x00;       

}

else

{

tab[10]=disptab[second/10];

tab[11]=disptab[second%10];

}

}

else

{

tab[10]=disptab[second/10];

tab[11]=disptab[second%10]; }

if(num==7)

{if(shanshuobz==0)

{tab[12]=0x00;           

}

else

{

tab[12]=disptab[week];

}

}

else

{

tab[12]=disptab[week];

}

}

 

void display()

{  uchar  a,b=0xfe,c=0xfe;

for(a=4;a<12;a++)

{     P2=b;           

       P0=tab[a];

       delay(10);

       b=_crol_(b,1);

       P2=0xff;       

       P0=0x00;

}

  for(a=0;a<4;a++)

  {

       P3=c;            

       P0=tab[a];

       delay(10);

       c=_crol_(c,1);

       P3=0xff;       

       P0=0x00;

 }

     xing=0;         

       P0=tab[12];

       delay(10);

       xing=1;

       P0=0x00;     

}

void   numjia(void)

{

 switch(num)

       {

              case 0:

              {;}break;

              case 1:

              {     year++;

                     if(year==100)

                     {  year=0;}

                     t1=year/10*16+year%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x8c,0x00|t1);              //year数据写入DS1302

                     write_ds1302(0x8e,0x80);}break;      

              case 2:

              {  month++;

                 if(month==13)

              {  month=1;}

                 t1=month/10*16+month%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x88,0x00|t1);              //month数据写入DS1302

                     write_ds1302(0x8e,0x80);  ;}break;

             

              case 3:

              {     day++;

                     if(day==32)

                     {  day=1;}

                     t1=day/10*16+day%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x86,0x00|t1);              //day数据写入DS1302

                     write_ds1302(0x8e,0x80);;}break;

                     case 4:

              {     hour++;

                      if(hour==24)

                            {  hour=0;}

                      t1=hour/10*16+hour%10;

                      write_ds1302(0x8e,0x00);

                      write_ds1302(0x84,0x00|t1);            //hour数据写入DS1302

                      write_ds1302(0x8e,0x80);;}break;                                                              

              case 5:

              {       minute++;

                       if(minute==60)

                            {  minute=0;}

                       t1=minute/10*16+minute%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x82,0x00|t1);          //minute数据写入DS1302

                       write_ds1302(0x8e,0x80); ;}break;                    

              case 6:

              {       second++;

                       if(second==60)

                            {  second=0;}

                       t1=second/10*16+second%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x80,0x00|t1);          //second数据写入DS1302

                       write_ds1302(0x8e,0x80);;}break; 

              case 7:

              {       week++;

                          if(week==8)

                            {  week=1;}

                       t1=week/10*16+week%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x8a,0x00|t1);          //week数据写入DS1302

                       write_ds1302(0x8e,0x80); ;}break;

                           

            default: break;

         } 

 

}

void   numjian(void)

{

 switch(num)

       {

              case 0:

              {;}break;

              case 1:

              {     year=year-1;

                      if(year==0)

                     {  year=100;}

                     t1=year/10*16+year%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x8c,0x00|t1);              //year数据写入DS1302

                     write_ds1302(0x8e,0x80);    }break;

              case 2:

              {     month--;

                      if(month==0)

                     {  month=12;}

                   t1=month/10*16+month%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x88,0x00|t1);              //month数据写入DS1302

                     write_ds1302(0x8e,0x80); ;}break;

             

              case 3:

              {     day--;

                     if(day==0)

                     {  day=31;}

                     t1=day/10*16+day%10;

                     write_ds1302(0x8e,0x00);

                     write_ds1302(0x86,0x00|t1);              //day数据写入DS1302

                     write_ds1302(0x8e,0x80);;}break;

              case 4:

              {     hour--;

                      if(hour==255)

                            {  hour=23;}

                      t1=hour/10*16+hour%10;

                      write_ds1302(0x8e,0x00);

                      write_ds1302(0x84,0x00|t1);            //hour数据写入DS1302

                      write_ds1302(0x8e,0x80);;}break;                                                              

              case 5:

              {       minute--;

                       if(minute==255)

                            {  minute=59;}

                       t1=minute/10*16+minute%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x82,0x00|t1);          //minute数据写入DS1302

                       write_ds1302(0x8e,0x80); ;}break;                    

              case 6:

              {       second--;

                       if(second==255)

                            {  second=59;}

                       t1=second/10*16+second%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x80,0x00|t1);          //second数据写入DS1302

                       write_ds1302(0x8e,0x80);;}break;

              case 7:

              {       week--;

                       if(week==0)

                            {  week=7;}

                       t1=week/10*16+week%10;

                       write_ds1302(0x8e,0x00);

                       write_ds1302(0x8a,0x00|t1);          //week数据写入DS1302

                       write_ds1302(0x8e,0x80); ;}break;                   

            default: break;

         } 

}

void   naojia(void)

{

 switch(num)

       {

              case 0:

              {;}break;

              case 1:

              {     naobj[0]++;

                     if(naobj[0]==24)

                     {  naobj[0]=0;}

              }break;  

              case 2:

              {  naobj[1]++;

                 if(naobj[1]==60)

              {  naobj[1]=0;}

                 }break;

             

              case 3:

              {     naobj[2]++;

                     if(naobj[2]==60)

                     {  naobj[2]=0;}

                     }break;

                     }

                     }

void   naojian(void)

{

 switch(num)

       {

              case 0:

              {;}break;

              case 1:

              {     naobj[0]--;

                     if(naobj[0]==255)

                     {  naobj[0]=24;}

              }break;  

              case 2:

              {  naobj[1]--;

                 if(naobj[1]==255)

              {  naobj[1]=60;}

                 }break;

             

              case 3:

              {     naobj[2]--;

                     if(naobj[2]==255)

                     {  naobj[2]=60;}

                     }break;

                     }

                     }

void  key(void)

{

       if(shanshuo==0)

       {

        if(shanbz==0)

        {   shanbz=1;

               num++;

              if(naozhong==0)

              {  if(num==8)

              {num=0;}

               }

                     else

              { if(num==4)

              {num=0;}

              }

               } }

             

              if(shanshuo!=0)   

         {  shanbz=0; }

             if(jian==0)

          {  if(jianbz==0)

              {   jianbz=1;      

        if(naozhong==0)

        { numjian();}

        else

        {naojian();}

        

        }

        }

        if(jian!=0)

        {

        

        jianbz=0;    

       }  

              if(jia==0)

       {

        if(jiabz==0)

        {   jiabz=1;

        if(naozhong==0)

         {numjia();}

         else

         {naojia();}

        }

        }

        if(jia!=0)

        {  

        jiabz=0;

       }

      

       if(nao==0)

       {

        if(naobz==0)

        {

        naobz=1;

        naozhong=~naozhong;

        num=0;

        }

        }

        if(nao!=0)

        {

        naobz=0;     

       }      

  }

void delayx(uint i)

{

      

       while(i--);

}

void DelayMS(uint ms)

{

       uchar i;

       while(ms--) for(i=0;i<120;i++);

}

void displaydq(int k)//数码管显示

{

      

       wei1=0;

       P0=disptab[k/10];

    DelayMS(5);

       wei1=1;

       P0=0x00;

       wei2=0;

       P0=disptab[k%10];

       DelayMS(5);

       wei2=1;

       P0=0x00;

}

void   init_DS(void)

{

       uchar x=0;

       DQ=1;

       delayx(8);

       DQ=0;

       delayx(85);

       DQ=1;

       delayx(14);

       x=DQ;

       delayx(20);

}

Read(void)

{

       uchar i=0;

       uchar dat=0;

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

              {

                     DQ=0;

                     dat>>=1;

                            DQ=1;

                     if(DQ)

                            dat|=0x80;

                     delayx(4);     

              }

       return(dat); }

void  write(uchar dat)

{    uchar i=0;

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

              {     DQ=0;

                     DQ=dat&0x01;

                     delayx(5);

                     DQ=1;

                     dat>>=1;}                   

       delayx(4);}

  Readtem(void)

{     uchar a=0;

       uchar b=0;      

       uchar t=0,t1;

       init_DS();

       write(0xcc);

       write(0x44);

       delayx(125);

       init_DS();

       write(0xcc);

       write(0xbe);

      

       a=Read();

       b=Read();

       t1=(a&0x0f)*0.0625;

      

       t=((b<<4)|(a>>4));

       if(t>128)

       {

              t=~t+1;

       }

       t=t+t1;

       return(t);      

}

 

void  fenlinao(void)

{

if(num==1)

{if(shanshuobz==0)

{naotab[0]=0x00;

naotab[1]=0x00;          

}

else

{

naotab[0]=disptab[naobj[0]/10];

naotab[1]=disptab[naobj[0]%10];

}

}

else

{

naotab[0]=disptab[naobj[0]/10];

naotab[1]=disptab[naobj[0]%10]; }

 

 

if(num==2)

{if(shanshuobz==0)

{naotab[2]=0x00;

naotab[3]=0x00;          

}

else

{

naotab[2]=disptab[naobj[1]/10];

naotab[3]=disptab[naobj[1]%10];

}

}

else

{

naotab[2]=disptab[naobj[1]/10];

naotab[3]=disptab[naobj[1]%10]; }

 

 

 

if(num==3)

{if(shanshuobz==0)

{naotab[4]=0x00;

naotab[5]=0x00;          

}

else

{

naotab[4]=disptab[naobj[2]/10];

naotab[5]=disptab[naobj[2]%10];

}

}

else

{

naotab[4]=disptab[naobj[2]/10];

naotab[5]=disptab[naobj[2]%10]; }

}

 

void naodisp(void)

{   

       uchar  a,b=0xfb;

       for(a=0;a<6;a++)

{     P2=b;           

       P0=naotab[a];

       delay(10);

       b=_crol_(b,1);

       P2=0xff;       

       P0=0x00;

} }

void  naozhongsz(void)

{    

      if(naobj[0]==hour)

        {     if(naobj[1]==minute)

        {     if(naobj[2]==second)

        {        xa=0;

                     nz=1;}               

        } }

        if(minute==0)

        { if(second<=2)

        {   xa=0;

        }

        else

        {xa=1;}

        }

        else

        {xa=1;} }

void panshi(void)

{

        if(nz==1)

        { naojs++;

        if(naojs==100)

        {   naojs=0;

             xa=1;

             nz=0; }       

        } }

void main()                     //主程序

{     uchar  dat=0;

       num=0;

       temp=0;

       x=0;

       nz=0;

       xa=1;

       naozhong=0;

       shanshuobz=0;                          

       initial_ds1302();           //时钟芯片初始化    DS1302                                                                           

       while(1)

       {     dat++;

              key();

              read_time();

              panshi();

              naozhongsz();             

              if(naozhong==0)         

              {fenli();

              display();}           

              else

              {fenlinao();

              naodisp();}          

              displaydq(tp);

              if(dat==10)

              {dat=0;  

              tp=Readtem();

              shanshuobz=~shanshuobz;

              }     }

                    

}     


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

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

Powered by 单片机教程网

返回顶部