STC51单片机+DS1302+18b20实现万年历.docx
《STC51单片机+DS1302+18b20实现万年历.docx》由会员分享,可在线阅读,更多相关《STC51单片机+DS1302+18b20实现万年历.docx(31页珍藏版)》请在冰豆网上搜索。
STC51单片机+DS1302+18b20实现万年历
STC51电子钟制作
最近做了一件DIY电子钟,自我感觉效果还不错,所以传到网上与大家分享一下,大家如果喜欢可以尝试做一下,也可以用作毕业设计。
这款电子钟可以显示年,月,日,小时,分,秒,星期,还有温度,可以调节时间。
1,电路原理图:
我的原理不是很清楚,大家可以看我的PCB图,我把每部分都截图了,效果挺好的。
2,PCB板图:
(1)蜂鸣器部分
(2)DS1302部分和复位电路部分
(3)18B20部分,和单片机晶振部分
(4)调时按键部分
(5)1602部分
(6)电源部分
3,元件清单
12M晶振
1个
9015三极管
1个
DS1302
1块
30pf电容
2个
蜂鸣器
1个
STC89c51
1块
100欧
1个
10pf电容
2个
104
1个
按键
5个
Lcd1602
1块
5.1k
1个
10k
9个
32.768k晶振
1个
备用锂电池
1块
18b20
1个
USB插口
1个
10uf电容
1个
4.7k
1个
20k滑动变阻器
1个
电池盒
1个
8脚插座
1个
40脚插座
1
4,源程序清单:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitLCD_RS=P2^4;//1602
sbitLCD_RW=P2^5;
sbitLCD_EN=P2^6;
sbitrst=P1^7;//DS1302
sbitio=P1^6;
sbitsclk=P1^5;
sbitACC_7=ACC^7;
sbitK1=P2^3;//按键
sbitK2=P2^2;
sbitK3=P2^1;
sbitK4=P2^0;
sbitBEEP=P1^0;//蜂鸣器
sbitDQ=P3^1;//温度传感器
bitflag=0;
bitflag1=0;
ucharyes;
//ucharcodetable2[]="SONGyou";
//ucharcodetable3[]="zhanpeng";
ucharcodetable4[]="0123456789";
chartable5[7];
uchartable6[2];
chartable7[2];
charleap;
//延时函数部分
voidDelay_ms(uintxms)//延时
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidDelayus(uchart)//延时1用于18b20
{
while(--t);
}
voidDelayms(uchart)//延时2用于18b20
{
while(t--)
{
//大致延时1mS
Delayus(245);
Delayus(245);
}
}
//18b20部分
bitinit18b20(void)//初始化18b20
{
bitdat=0;
DQ=1;
Delayus(5);
DQ=0;
Delayus(200);
Delayus(200);
DQ=1;
Delayus(50);
dat=DQ;
Delayus(25);
returndat;
}
ucharread18b20(void)//读18b20函数
{
uchari=0,dat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delayus(25);
}
return(dat);
}
voidwrite18b20(uchardat)//写18b20函数
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delayus(25);
DQ=1;
dat>>=1;
}
Delayus(25);
}
uintget_18b20(void)//读取温度函数
{
uchara=0;
uintb=0,t=0;
init18b20();
write18b20(0xCC);//跳过读序号列号的操作
write18b20(0x44);//启动温度转换
Delayms(10);
init18b20();
write18b20(0xCC);//跳过读序号列号的操作
write18b20(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=read18b20();//低位
b=read18b20();//高位
b<<=8;
t=a+b;
return(t);
}
//蜂鸣器部分
voidbeep()
{
BEEP=0;
Delay_ms(100);
BEEP=1;
}
//LCD1602部分
voidwrite1602(uchardat)//1602写数据函数
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
LCD_EN=1;
Delay_ms
(1);
LCD_EN=0;
}
voidwrite1602c(ucharcom)//1602写指令函数
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=com;
LCD_EN=1;
Delay_ms
(1);
LCD_EN=0;
}
voidinit1602()//1602初始化
{
write1602c(0x38);//16*2显示
write1602c(0x0f);//显示光标
write1602c(0x06);//光标右移
write1602c(0x01);//清屏
write1602c(0x80);
}
//DS1302部分
voidwrite1302(ucharaddr,dat)//1302写数据函数
{
uchari,temp;
rst=0;
sclk=0;
rst=1;
for(i=0;i<8;i++)//写地址,写数据
{
sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)//写地址,写数据
{
sclk=0;
temp=dat;
io=(bit)(temp&0x01);
dat>>=1;
sclk=1;
}
rst=0;
}
ucharread1302(ucharaddr)//1302读数据函数
{
uchari,temp,dat1,dat2;
rst=0;
sclk=0;
rst=1;
for(i=0;i<8;i++)
{
sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{
ACC_7=io;
sclk=1;
ACC>>=1;
sclk=0;
}
rst=0;
dat1=ACC;
dat2=dat1%16;
dat1=dat1/16;
dat1=dat1*10+dat2;
return(dat1);
}
voidinit1302()//1302初始化函数
{
write1302(0x8e,0x00);
write1302(0x80,0x00);//秒初始化
write1302(0x8e,0x80);
}
/*voidinit1602B()
{
uchari=0;
write1602c(0x80+16);
write1602(0xef);
while(table2[i]!
='\0')
{
write1602(table2[i]);
i++;
}
write1602(0xef);
write1602c(0x80+0x40+20);
i=0;
while(table3[i]!
='\0')
{
write1602(table3[i]);
i++;
}
for(i=0;i<16;i++)
{
write1602c(0x18);
Delay_ms(800);
}
Delay_ms(2000);
write1602c(0x01);
write1602c(0x06);
}*/
//显示部分
voidget_time()//获取时间函数
{
table5[5]=read1302(0x8d);
table5[4]=read1302(0x89);
table5[3]=read1302(0x87);
table5[2]=read1302(0x85);
table5[1]=read1302(0x83);
table5[0]=read1302(0x81);
table5[6]=read1302(0x8b);
}
voidDisplay_time(ucharyear,yue,day,hour,min,sec,xq)//显示函数
{
write1602c(0x80);
write1602('2');
write1602('0');
write1602(table4[year/10]);
write1602(table4[year%10]);
write1602('-');
write1602(table4[yue/10]);
write1602(table4[yue%10]);
write1602('-');
write1602(table4[day/10]);
write1602(table4[day%10]);
write1602('');
write1602('w');
write1602('e');
write1602('e');
write1602('k');
write1602(table4[xq]);
write1602c(0x80+0x40);
write1602(table4[hour/10]);
write1602(table4[hour%10]);
write1602(':
');
write1602(table4[min/10]);
write1602(table4[min%10]);
write1602(':
');
write1602(table4[sec/10]);
write1602(table4[sec%10]);
write1602('');
write1602('');
write1602('T');
write1602('');
write1602(table7[0]);
write1602(table7[1]);
write1602(0xdf);
write1602('c');
}
//调时部分
voidKeyprocess()
{
staticucharnum=0;
ucharyear1,yue1,day1,hour1,min1,xq1;
write1302(0x8e,0x00);
write1302(0x80,0x80);
if(K3==0)
{
Delay_ms(5);
if(K3==0)
{
while(!
K3);
beep();
num++;
}
}
if(num>6)
{
num=0;
}
if(num)
{
if(K1==0)
{
Delay_ms(5);
if(K1==0)
{
while(!
K1);
beep();
if(num==1)
{
table5[1]++;
if(table5[1]==60)
table5[1]=0;
min1=table5[1]/10*16+table5[1]%10;
write1302(0x82,min1);
}
if(num==2)
{
table5[2]++;
if(table5[2]==24)
table5[2]=0;
hour1=table5[2]/10*16+table5[2]%10;
write1302(0x84,hour1);
}
if(num==3)
{
table5[6]++;
if(table5[6]==8)
table5[6]=1;
xq1=table5[6]/10*16+table5[6]%10;
write1302(0x8a,xq1);
}
if(num==4)
{
if(table5[5]==0)
{
switch(table5[4])
{
case1:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case2:
table5[3]++;if(table5[3]==30)table5[3]=1;break;
case3:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case4:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case5:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case6:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case7:
table5[3]++;if(table5[3]==32)table5[3]=1;break;case8:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case9:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case10:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case11:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case12:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
}
}
elseif(leap&&table5[4]==2)
{
table5[3]++;
if(table5[3]==30)
table5[3]=1;
}
elseif(leap==0&&table5[4]==2)
{
table5[3]++;
if(table5[3]==29)
table5[3]=1;
}
else
switch(table5[4])
{
case1:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case3:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case4:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case5:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case6:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case7:
table5[3]++;if(table5[3]==32)table5[3]=1;break;case8:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case9:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case10:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
case11:
table5[3]++;if(table5[3]==31)table5[3]=1;break;
case12:
table5[3]++;if(table5[3]==32)table5[3]=1;break;
}
day1=table5[3]/10*16+table5[3]%10;
write1302(0x86,day1);
}
if(num==5)
{
table5[4]++;
if(table5[4]==13)
table5[4]=1;
yue1=table5[4]/10*16+table5[4]%10;
write1302(0x88,yue1);
}
if(num==6)
{
table5[5]++;
if(table5[5]==100)
table5[5]=0;
leap=table5[5]%4==0&&table5[5]%100!
=0;
year1=table5[5]/10*16+table5[5]%10;
write1302(0x8c,year1);
}
}
}
if(K2==0)
{
Delay_ms(5);
if(K2==0)
{
while(!
K2);
beep();
if(num==1)
{
table5[1]--;
if(table5[1]==-1)
table5[1]=59;
min1=table5[1]/10*16+table5[1]%10;
write1302(0x82,min1);
}
if(num==2)
{
table5[2]--;
if(table5[2]==-1)
table5[2]=23;
hour1=table5[2]/10*16+table5[2]%10;
write1302(0x84,hour1);
}
if(num==3)
{
table5[6]--;
if(table5[6]==0)
table5[6]=7;
xq1=table5[6]/10*16+table5[6]%10;
write1302(0x8a,xq1);
}
if(num==4)
{
if(table5[5]==0)
{
switch(table5[4])
{
case1:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case2:
table5[3]--;if(table5[3]==0)table5[3]=29;break;
case3:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case4:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case5:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case6:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case7:
table5[3]--;if(table5[3]==0)table5[3]=31;break;case8:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case9:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case10:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case11:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case12:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
}
}
elseif(leap&&table5[4]==2)
{
table5[3]--;
if(table5[3]==0)
table5[3]=29;
}
elseif(leap==0&&table5[4]==2)
{
table5[3]--;
if(table5[3]==0)
table5[3]=28;
}
else
switch(table5[4])
{
case1:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case3:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case4:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case5:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case6:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case7:
table5[3]--;if(table5[3]==0)table5[3]=31;break;case8:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case9:
table5[3]--;if(table5[3]==0)table5[3]=30;break;
case10:
table5[3]--;if(table5[3]==0)table5[3]=31;break;
case11:
table5[3]--;if(table5[3]==0)table