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);
}
这哪是大虾干的活,明显是来找免费苦力的。
页:
[1]