STC51单片机+DS1302+18b20实现万年历.docx

上传人:b****2 文档编号:1130861 上传时间:2023-04-30 格式:DOCX 页数:31 大小:1.99MB
下载 相关 举报
STC51单片机+DS1302+18b20实现万年历.docx_第1页
第1页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第2页
第2页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第3页
第3页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第4页
第4页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第5页
第5页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第6页
第6页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第7页
第7页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第8页
第8页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第9页
第9页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第10页
第10页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第11页
第11页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第12页
第12页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第13页
第13页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第14页
第14页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第15页
第15页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第16页
第16页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第17页
第17页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第18页
第18页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第19页
第19页 / 共31页
STC51单片机+DS1302+18b20实现万年历.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

STC51单片机+DS1302+18b20实现万年历.docx

《STC51单片机+DS1302+18b20实现万年历.docx》由会员分享,可在线阅读,更多相关《STC51单片机+DS1302+18b20实现万年历.docx(31页珍藏版)》请在冰点文库上搜索。

STC51单片机+DS1302+18b20实现万年历.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2