DS1302可调时钟程序困惑

2020-01-23 14:39发布

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






/*********************************包含头文件********************************/
#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[7]={0,0x59,0x19,0x24,0x7,0x01,0x08};//秒 分 时 日 月 星期 年
uchar showTime[8]={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[time[2]/16];
        delay1(300);

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

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

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

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

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

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

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

}







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

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

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

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

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

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

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

        P2=0x7f;
        P0=tab[time[3]%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[6]+=0x01;
                                                if ((time[6] & 0x0f)==10)
                                                        
                                                time[6]+=0x06;
                                                
                                                if ((time[6]>>4)==10)
                                                        
                                                        time[6]=0;
                                        }
                                        else
                                        {
                                                time[6]-=0x01;
                                                
                                                
                                                if ((time[6]&0x0f)==15)
                                                        
                                                  time[6]-=0x06;
                                                
                                                
                                                if ((time[6]>>4)==15)
                                                        
                                                
                                                time[6]=0x99;
                                        }
                                        break;
                                case 1:                                                                                                                //月
                                        if (!ADD)
                                        {
                                                time[4]+=0x01;
                                                if((time[4] & 0x0f)==10)time[4]+=0x06;
                                                if(time[4]==0x13)time[4]=0x01;
                                        }
                                        else
                                        {
                                                time[4]-=0x01;
                                                if((time[4] & 0x0f)==15)time[4]-=0x06;
                                                if(time[4]==0)time[4]=0x12;
                                        }
                                        break;
                                case 2:                                                                                                                //日
                                        if (!ADD)
                                        {
                                                time[3]+=0x01;
                                                if ((time[3] & 0x0f)==10)time[3]+=0x06;
                                                if (time[3]==0x32)time[3]=1;
                                        }
                                        else
                                        {
                                                time[3]-=0x01;
                                                if ((time[3] & 0x0f)==15)time[3]-=0x06;
                                                if (time[3]==0)time[3]=0x31;
                                        }
                                        break;
                                case 3:                                                                                                                //时
                                        if (!ADD)
                                        {
                                                time[2]+=0x01;
                                                if ((time[2] & 0x0f)==10)time[2]+=0x06;
                                                if (time[2]==0x24)time[2]=0;
                                        }
                                        else
                                        {
                                                time[2]-=0x01;
                                                if ((time[2] & 0x0f)==15)time[2]-=0x06;
                                                if ((time[2]>>4)==15)time[2]=0x23;
                                        }
                                        break;
                                case 4:                                                                                                                //分
                                        if (!ADD)
                                        {
                                                time[1]+=0x01;
                                                if ((time[1] & 0x0f)==10)time[1]+=0x06;
                                                if (time[1]==0x60)time[1]=0;
                                        }
                                        else
                                        {
                                                time[1]-=0x01;
                                                if ((time[1] & 0x0f)==15)time[1]-=0x06;
                                                if ((time[1]>>4)==15)time[1]=0x59;
                                        }
                                        break;
                                case 5:                                                                                                                //定时
                                        if (!ADD)
                                        {
                                                if (setTime[0]==0xAA)setTime[0]=0x24;
                                                setTime[0]+=0x01;
                                                if ((setTime[0] & 0x0f)==10)setTime[0]+=0x06;
                                                if (setTime[0]==0x25)setTime[0]=0;
                                                if (setTime[0]==0x24)setTime[0]=0xAA;
                                        }
                                        else
                                        {
                                                if (setTime[0]==0xAA)setTime[0]=0x24;
                                                setTime[0]-=0x01;
                                                if ((setTime[0] & 0x0f)==15)setTime[0]-=0x06;
                                                if ((setTime[0]>>4)==15)setTime[0]=0x24;
                                                if (setTime[0]==24)setTime[0]=0xAA;
                                        }
                                        break;                                       
                                case 6:                                                                                                                //定分
                                        if (!ADD)
                                        {
                                                setTime[1]+=0x01;
                                                if ((setTime[1] & 0x0f)==10)setTime[1]+=0x06;
                                                if (setTime[1]==0x60)setTime[1]=0;
                                        }
                                        else
                                        {
                                                setTime[1]-=0x01;
                                                if ((setTime[1] & 0x0f)==15)setTime[1]-=0x06;
                                                if ((setTime[1]>>4)==15)setTime[1]=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);
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。