jamasliu 发表于 2014-5-29 22:19:17

DS1302可调时钟程序困惑

大虾们好,我想时钟和日期可调,设置闹钟,顺便闹钟铃声是歌曲同时怎么修改,谢谢。。。






/*********************************包含头文件********************************/
#include "reg51.h"
#include <intrins.h>
#include <stdio.h>

/*********************************端口定义**********************************/
sbit T_CLK=P1^0;
sbit T_IO=P1^1;
sbit T_RST=P1^2;

sbit ADD1=P3^0;      //定义端口参数
sbit SUB=P3^1;


sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;



#define uchar unsigned char
#define uint unsigned int


uchar Tmod=7;//此时的调节模式

/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar time={0,0x59,0x19,0x24,0x7,0x01,0x08};//秒 分 时 日 月 星期 年
uchar showTime={0,0,10,0,0,10,0,0};//显示的时间
/******************************定义全局变量*********************************/
unsigned char second,minute,hour,week,day,month,year;                //秒、分、时、星期、日、月、年

void delay1(unsigned int m)//延时子程序,约500个机器周期
{
      while(m--);
}


void delay_1ms(void)
{
unsigned int i;
for (i=1;i<(unsigned int)(1144-2);i++);
}

//延时nMS
void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}

void delayms(unsigned char a)//豪秒延时子程序
{
while(--a);//采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(void)
{
      P2=0xfe;                        
      P0=tab/16];
      delay1(300);

      P2=0xfd;
      P0=tab%16];
      delay1(300);

      P2=0xfb;
      P0=0xbf;                        //显示"-"
      delay1(300);

      P2=0xf7;
      P0=tab/16];
      delay1(300);

      P2=0xef;
      P0=tab%16];
      delay1(300);

      P2=0xdf;
      P0=0xbf;                        //显示"-"
      delay1(300);

      P2=0xbf;
      P0=tab/16];
      delay1(300);

      P2=0x7f;
      P0=tab%16];
      delay1(300);

}







void display1(void)
{
      P2=0xfe;                        
      P0=tab/16];
      delay1(300);

      P2=0xfd;
      P0=tab%16];
      delay1(300);

      P2=0xfb;
      P0=0xbf;                        //显示"-"
      delay1(300);

      P2=0xf7;
      P0=tab/16];
      delay1(300);

      P2=0xef;
      P0=tab%16];
      delay1(300);

      P2=0xdf;
      P0=0xbf;                        //显示"-"
      delay1(300);

      P2=0xbf;
      P0=tab/16];
      delay1(300);

      P2=0x7f;
      P0=tab%16];
      delay1(300);
}


void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}



uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7=T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}

void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}

uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}


void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}



void v_Get1302(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{

*ucCurtime++= uc_R1302(ucAddr);
ucAddr += 2;
}




/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
void main(void)
{
      EX0=1;
      EX1=1;
      IT1=1;//下降沿触发
      IT0=1;
      EA=1;//开中断
      v_Get1302(&time);
      while(1)
      {
                v_Get1302(&time);

                display();                                        //显示时间
               
               

      }
}


//***********************************************中断0子程序
void int_0(void) interrupt 0
{
      uint i;
      EA=0;
      delay_ms(10);

                while(!INT0);
      
               
      Tmod+=1;
      
      if(Tmod==7)goto inout;
      if (Tmod==8)Tmod=0;
      while(1)
      {



                for (i=0;i<20000;i++)
                {
                        if (!INT0)
                        {
                              delay_ms(40);

                              while(!INT0);      
                              if(Tmod==6)goto inout;
                              Tmod+=1;
                              if(Tmod==8)Tmod=0;
                        }
                        else if ((!ADD) || (!SUB))//调节时间
                        {
                              switch(Tmod)
                              {
                              case 0:                                                                                                                //年
                                        if (!ADD)
                                        {
                                                time+=0x01;
                                                if ((time & 0x0f)==10)
                                                      
                                                time+=0x06;
                                                
                                                if ((time>>4)==10)
                                                      
                                                      time=0;
                                        }
                                        else
                                        {
                                                time-=0x01;
                                                
                                                
                                                if ((time&0x0f)==15)
                                                      
                                                time-=0x06;
                                                
                                                
                                                if ((time>>4)==15)
                                                      
                                                
                                                time=0x99;
                                        }
                                        break;
                              case 1:                                                                                                                //月
                                        if (!ADD)
                                        {
                                                time+=0x01;
                                                if((time & 0x0f)==10)time+=0x06;
                                                if(time==0x13)time=0x01;
                                        }
                                        else
                                        {
                                                time-=0x01;
                                                if((time & 0x0f)==15)time-=0x06;
                                                if(time==0)time=0x12;
                                        }
                                        break;
                              case 2:                                                                                                                //日
                                        if (!ADD)
                                        {
                                                time+=0x01;
                                                if ((time & 0x0f)==10)time+=0x06;
                                                if (time==0x32)time=1;
                                        }
                                        else
                                        {
                                                time-=0x01;
                                                if ((time & 0x0f)==15)time-=0x06;
                                                if (time==0)time=0x31;
                                        }
                                        break;
                              case 3:                                                                                                                //时
                                        if (!ADD)
                                        {
                                                time+=0x01;
                                                if ((time & 0x0f)==10)time+=0x06;
                                                if (time==0x24)time=0;
                                        }
                                        else
                                        {
                                                time-=0x01;
                                                if ((time & 0x0f)==15)time-=0x06;
                                                if ((time>>4)==15)time=0x23;
                                        }
                                        break;
                              case 4:                                                                                                                //分
                                        if (!ADD)
                                        {
                                                time+=0x01;
                                                if ((time & 0x0f)==10)time+=0x06;
                                                if (time==0x60)time=0;
                                        }
                                        else
                                        {
                                                time-=0x01;
                                                if ((time & 0x0f)==15)time-=0x06;
                                                if ((time>>4)==15)time=0x59;
                                        }
                                        break;
                              case 5:                                                                                                                //定时
                                        if (!ADD)
                                        {
                                                if (setTime==0xAA)setTime=0x24;
                                                setTime+=0x01;
                                                if ((setTime & 0x0f)==10)setTime+=0x06;
                                                if (setTime==0x25)setTime=0;
                                                if (setTime==0x24)setTime=0xAA;
                                        }
                                        else
                                        {
                                                if (setTime==0xAA)setTime=0x24;
                                                setTime-=0x01;
                                                if ((setTime & 0x0f)==15)setTime-=0x06;
                                                if ((setTime>>4)==15)setTime=0x24;
                                                if (setTime==24)setTime=0xAA;
                                        }
                                        break;                                       
                              case 6:                                                                                                                //定分
                                        if (!ADD)
                                        {
                                                setTime+=0x01;
                                                if ((setTime & 0x0f)==10)setTime+=0x06;
                                                if (setTime==0x60)setTime=0;
                                        }
                                        else
                                        {
                                                setTime-=0x01;
                                                if ((setTime & 0x0f)==15)setTime-=0x06;
                                                if ((setTime>>4)==15)setTime=0x59;
                                                
                                        }
                                        break;
                              case 7:
                                        break;
                              }

                              while((!ADD) || (!SUB));      
                                       
                        }

                }

      }
      
inout:
      v_Set1302(& time);

      EA=1;
}



//**********************************************中断序1子程序
void int_1(void) interrupt 2
{
      
      display1();
      delay_ms(200);
}




uindex 发表于 2014-5-30 00:11:28

这哪是大虾干的活,明显是来找免费苦力的。

页: [1]
查看完整版本: DS1302可调时钟程序困惑