整理基于单片机DS1302的时钟万年历带闹钟doc.docx
《整理基于单片机DS1302的时钟万年历带闹钟doc.docx》由会员分享,可在线阅读,更多相关《整理基于单片机DS1302的时钟万年历带闹钟doc.docx(21页珍藏版)》请在冰豆网上搜索。
整理基于单片机DS1302的时钟万年历带闹钟doc
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdws=P2^1;//1602管脚定义
sbitlcden=P2^0;
sbitlcdrs=P2^2;
sbitkey1=P2^3;//闹钟设置键
sbitkey2=P2^4;
sbitkey3=P1^5;//功能键定义
sbitkey4=P1^6;//增大键定义
sbitkey5=P1^7;//减小键定义
ucharshi,fen,miao,ashi,afen,amiao,year,month,day,week;
uchars1num=0,s1num2=0,temp;
bitflag;
floatf_temp;
uinti,d;
ucharcodetable2[]={0x20,0x20,0x2e,0x20,0xdf,0x43};
ucharcodetable[]="20--";
ucharcodetable1[]=":
:
";
sbitds=P1^0;//ds18b20信号线
sbitbeep=P1^4;//蜂鸣器管脚定义
sbitACC_7=ACC^7;//位寻址寄存器定义
sbitSCLK=P1^2;//DS1302时钟信号
sbitDIO=P1^1;//DS1302数据信号
sbitCE=P1^3;
//地址、数据发送子程序
//voiddelay2(uintms)
//{
//uchart;
//while(ms--);for(t=0;t<120;t++);
//}
//voidplaymusic()
//{
//uinti2=0,j2,k2;
//while(jiepai[i2]!
=0||song[i2]!
=0)
//{
//for(j2=0;j2//{
//beep=~beep;
//for(k2=0;k2//}
//delay2(10);
//i2++;
//}
//}
voidwrite_1302(ucharaddr,uchardat)
{
uchari,temp;
CE=0;//CE引脚为低,数据传送中止
SCLK=0;//清零时钟总线
CE=1;//CE引脚为高,逻辑控制有效
//发送地址
for(i=8;i>0;i--)//循环8次移位
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;//右移一位
SCLK=1;
}
//发送数据
for(i=8;i>0;i--)
{
SCLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=1;
}
CE=0;
}
//数据读取子程序
ucharRead1302(ucharaddr)
{
unsignedchari,temp,dat1,dat2;
CE=0;
SCLK=0;
CE=1;
//发送地址
for(i=8;i>0;i--)//循环8次移位
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;//右移一位
SCLK=1;
}
//读取数据
for(i=8;i>0;i--)
{
ACC_7=DIO;
SCLK=1;
ACC>>=1;
SCLK=0;
}
CE=0;
dat1=ACC;
dat2=dat1/16;//数据进制转换
//十六进制转十进制
dat1=dat1%16;
dat1=dat1+dat2*10;
return(dat1);
}
//初始化DS1302
voidInitial(void)//初始化13022010年09月30日23点58分56秒星期一
{
write_1302(0x8e,0x00);//允许写保护
write_1302(0x80,0x56);//秒位初始化
write_1302(0x82,0x58);//分钟初始化
write_1302(0x84,0x23);//小时初始化
write_1302(0x86,0x30);//日初始化
write_1302(0x88,0x09);//月初始化
write_1302(0x8c,0x10);//年初始化
write_1302(0x8a,0x01);//日期始化
write_1302(0x8e,0x80);//禁止写保护
}
voiddelay(uintz)//延时1ms
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//1602写命令
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//1602写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voiddsreset(void)//DS18B20,初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)//读1位数据函数
{
uinti;
bitdat;
ds=0;i++;
ds=1;i++;i++;//i++起到延时作用
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读一个字节数据函数
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwritebyte(uchardat)//向DS18B20写一个字节数据函数
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uintget_temp()//获取温度
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//读高8位
b=tempread();//读低8位
temp=b;
temp<<=8;//两个字节组合成1个字节
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;//温度在寄存器中为12位,分辨率为0.0625^
returntemp;
}
voiddisplay(ucharaddr,uchardat)
{
write_com(0x80+0x40+addr);
write_data(0x30+dat);
delay(5);
}
voiddis_temp(uintt)
{
uchari;
i=t/100;
display(10,i);
i=t%100/10;
display(11,i);
i=t%100%10;
display(13,i);
}
voidinit()//初始化程序
{
ucharnum;
flag=1;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(5);
}
write_com(0x80+0x40+10);
for(num=0;num<6;num++)
{
write_data(table2[num]);
delay(10);
}
}
voiddi()//蜂鸣器响函数
{
beep=0;
delay(100);
beep=1;
}
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_nyrz(ucharadd,uchardate)//显示年,月,日,周
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voiddisplay_week(ucharwe)
{
write_com(0x80+12);
switch(we)
{
case1:
write_data('