基于ds1302的电子日历系统
0x0e);
break; case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break; case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian--;
if(nian==-1) nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
}
}
//定时器、计数器设置函数
void init()
{
TMOD=0x11;
TH0=0;
TL0=0;
EA=1;
ET0=1;
TR0=1;
}
/******************************* 延时函数 ********************************
* 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
**************************************************************************/
void DS18_delay(int useconds)
{
int s;
for (s=0; s《useconds;s++);
}
/******************************* 复位函数 *******************************
* 功能:完成单总线的复位操作
* 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。
* 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
**************************************************************************/
unsigned char ow_reset(void)
{
unsigned char presence;
DQ = 0;
DS18_delay(29);
DQ = 1;
DS18_delay(3);
presence = DQ;
DS18_delay(25);
return(presence);
}
/****************************** 位写入函数 *******************************
* 功能:向单总线写入1位值:bitval
*************************************************************************/
void write_bit(char bitval) { DQ = 0;
if(bitval==1) DQ =1;
DS18_delay(5);
DQ = 1;
}
/**************************** 字节写入函数 *******************************
* 功能:向单总线写入一个字节值:val
*************************************************************************/
void ds18write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i《8; i++) {
temp = val》》i;
temp &= 0x01;
write_bit(temp);
}
DS18_delay(5);
}
/**************************** 位读取函数 ********************************
* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 * 的DS18_delay()函数,而采用一个for()循环来实现延时。 *
***********************************************************************/
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0;
DQ = 1;
for (i=0; i《3; i++);
return(DQ);
}
/**************************** 字节读取函数 *******************************
*功能:从单总线读取一个字节的值*
*************************************************************************/
unsigned char DSread_byte(void)
{
unsigned char i; unsigned char value = 0; for (i=0;i《8;i++)
{
if(read_bit()) value|=0x01《《i;
DS18_delay(6);
}
return(value);
}
//*******************主函数**************************
void main() { lcd_init();
ds1302_init();
init();
delay(80);
while(1)
{
keyscan();
}
}
//取得并显示日历和时间
void TImer0() interrupt 1
{
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(r
- ds1302晶振不起振_ds1302晶振电路图(07-26)
- ds1302和ds1307区别_ds1302和ds12c887区别(07-26)
- 用ds1302做时钟电路图详解(09-19)
- 一种智能化的温湿度智能控制系统设计(02-02)
- AT89S51实现LED显示数字电压表设计(07-05)
- 单片机的智能温度预警系统教学案例(03-21)