DS18b20 实时时钟
请大家详解void int_0(void) interrupt 0,这段程序,为什么定时闹钟打开,时钟显示是十秒一跳,怎么修改成一秒一秒显示,谢谢。。
#include "AT89X51.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int idata
#define DIN P2_0
#define LOAD P2_1
#define CLK P2_2
sbit ADD=P1^1;
sbit SUB=P1^0;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit T_CLK = P2^3;
sbit T_IO = P2^4;
sbit T_RST = P2^5;
sbit speaker=P3^7;
uchar showTime={0,0,10,0,0,10,0,0};
uchar setTime={0,0};
uchar time={0,0x59,0x19,0x24,0x7,0x01,0x08};
uchar Tmod=7;
uchar count;
uchar n=0;
unsigned int code LED_code_09={0xfE,0xb0,0xeD,0xf9,0xb3,0xdB,0xdF,0xf0,0xfF,0xfB,0x81,0x00,0x3D,0x5B};
unsigned int code LED_code_L07={0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800};
uchar code music_tab[] ={
0x18, 0x30, 0x1C , 0x10,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void delay_1ms(void)
{
unsigned int i;
for (i=1;i<(unsigned int)(1144-2);i++);
}
void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}
void delay (unsigned char m)
{
unsigned i=3*m;
while(--i);
}
void delayms(unsigned char a)
{
while(--a);
}
void int0()interrupt 1
{TH0=0xd8;
TL0=0xef;
n--;
}
void sound()
{ unsigned char p,m;
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;
TL0=0xef;
IE=0x82;
play:
while(1)
{
p=music_tab;
if(p==0x00) { i=0, delayms(1000); goto play;}
else if(p==0xff){ i=i+1;TR0=0; goto playend;}
else {m=music_tab, n=music_tab;}
TR0=1;
while(n!=0) speaker=~speaker,delay(m);
TR0=0;
}
playend:
speaker=1;
}
void sent_LED( unsigned int n )
{
unsigned int i;
unsigned int a;
count=0;
a= (unsigned char)(n);
CLK = 0;
LOAD = 0;
DIN = 0;
for ( i=0x8000; i>=0x0001; i=i>>1 )
{
if ( ( n & i ) == 0 ) DIN = 0; else DIN = 1;
CLK = 1;
CLK = 0;
count++;
}
LOAD = 1;
}
/******************************************************************************
初始化 MAX7219
******************************************************************************/
void initMAX7219(void)
{
sent_LED( 0x0C01 );
sent_LED( 0x0A04 );
sent_LED( 0x0B07 );
sent_LED( 0x0900 );
}
/******************************************************************************
void cls()
******************************************************************************/
void cls()
{
uint i;
for (i=0x0100; i<=0x0800; i+=0x0100 ) sent_LED(i); /* DIGIT0-7 = 0 */
}
void disp_09(unsigned char H,unsigned char n )
{
if ( ( n & 0x80 ) == 0 )
{
sent_LED( LED_code_L07[ H ] | LED_code_09[ n ] );
}
else
{
sent_LED( LED_code_L07[ H ] | LED_code_09[ n & 0x7F ] | 0x80 );
}
}
void disp_88(unsigned char *showda)
{
char idata i;
for (i=0;i<8;i++)
{
disp_09(i,*showda);
showda++;
}
}
//************************************************
void showDay(void)
{
showTime=time & 0x0f;
showTime=time>>4;
showTime=time & 0x0f;
showTime=time>>4;
showTime=time & 0x0f;
showTime=time>>4;
showTime=showTime=10;
disp_88(& showTime);
}
//*************************************************
void showData(void)
{
showTime=time & 0x0f;
showTime=time>>4;
showTime=time & 0x0f;
showTime=time>>4;
showTime=time & 0x0f;
showTime=time>>4;
showTime=showTime=10;
disp_88(& showTime);
}
//*************************************************
void showDishi(void)
{
showTime=setTime & 0x0f;
showTime=setTime>>4;
showTime=setTime & 0x0f;
showTime=setTime>>4;
showTime=12;
showTime=13;
showTime=showTime=10;
disp_88(& showTime);
}
//*****************************************
void flash_max7219(unsigned char n)
{
switch(n)
{
case 0:
showData();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 1:
showData();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 2:
showData();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 3:
showDay();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 4:
showDay();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 5:
showDishi();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
case 6:
showDishi();
delay_ms(40);
showTime=11;
showTime=11;
disp_88(& showTime);
break;
}
}
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
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);
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();
T_CLK = 1;
T_RST =0;
return(ucDa);
}
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00);
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa);
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80);
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime = uc_R1302(ucAddr);
ucAddr += 2;
}
}
void main()
{
delay_ms(200);
initMAX7219();
cls();
EX0=1;
EX1=1;
IT1=1;
IT0=1;
EA=1;
v_Get1302(& time);
showDay();
while(1)
{
v_Get1302(& time);
showDay();
if ((setTime==time)&&(setTime==time))sound();
}
}
//***********************************************
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)
{
flash_max7219(Tmod);
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;
}
//**********************************************
void int_1(void) interrupt 2
{
showData();
delay_ms(200);
}
楼主标题错了吧
把for语句中i 值改小点试试 谢谢楼主,是DS1302,还请各位详解下,谢谢。。 被标题吸引进来的{:lol:} yongjia 发表于 2013-12-11 17:58
被标题吸引进来的
我也是~~~~~~~~~~~~~~~~~
页:
[1]