大虾们好,我想时钟和日期可调,设置闹钟,顺便闹钟铃声是歌曲同时怎么修改,谢谢。。。
/*********************************包含头文件********************************/
#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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>