整理基于单片机DS1302的时钟万年历带闹钟doc.docx
- 文档编号:575552
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:21
- 大小:19.13KB
整理基于单片机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('
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 基于 单片机 DS1302 时钟 万年历 闹钟 doc