版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-------------精选文档------------------------------精选文档-----------------可编辑可编辑-------------精选文档-----------------可编辑//DS3231,经测试,日期,时间,星期,温度可以用1602显示#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineyh0x80//第一行的初始位置#defineer0x80+0x40//第二行初始位置sbitwr=P1^1;sbitrs=P1^0;sbiten=P2^5;sbitSDA=P3^6;//模拟I2C数据传送位SDAsbitSCL=P3^7;//模拟I2C时钟控制位SCLsbitINT=P3^2;sbitkey1=P1^7;//功能键,修改键sbitkey2=P3^4;//上调键sbitkey3=P3^5;//下调键sbitRESET=P3^3;bitack;//应答标志位#defineDS3231_WriteAddress0xD0//器件写地址#defineDS3231_ReadAddress0xD1//器件读地址#defineDS3231_SECOND0x00//秒#defineDS3231_MINUTE0x01//分#defineDS3231_HOUR0x02//时#defineDS3231_WEEK0x03//星期#defineDS3231_DAY0x04//日#defineDS3231_MONTH0x05//月#defineDS3231_YEAR0x06//年//闹铃1#defineDS3231_SALARM1ECOND0x07//秒#defineDS3231_ALARM1MINUTE0x08//分#defineDS3231_ALARM1HOUR0x09//时#defineDS3231_ALARM1WEEK0x0A//星期/日//闹铃2#defineDS3231_ALARM2MINUTE0x0b//分#defineDS3231_ALARM2HOUR0x0c//时#defineDS3231_ALARM2WEEK0x0d//星期/日#defineDS3231_CONTROL0x0e//控制寄存器#defineDS3231_STATUS0x0f//状态寄存器#defineBSY2//忙#defineOSF7//振荡器停止标志#defineDS3231_XTAL0x10//晶体老化寄存器#defineDS3231_TEMPERATUREH0x11//温度寄存器高字节(8位)#defineDS3231_TEMPERATUREL0x12//温度寄存器低字节(高2位)uchara,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp;ucharcodetab1[]={"2017--FRI"};ucharcodetab2[]={"::."};ucharHEX2BCD(ucharval)//B码转换为BCD码{uchark; k=(val)/10*16+(val)%10;returnk;}ucharBCD_Decimal(ucharbcd){ucharDecimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}voiddelayus(uintus){while(us--);}voidStart_I2C(){SDA=1;//发送起始条件的数据信号delayus(1);SCL=1;delayus(5);//起始条件建立时间大于4.7us,延时SDA=0;//发送起始信号delayus(5);//起始条件锁定时间大于4μsSCL=0;//钳住I2C总线,准备发送或接收数据delayus(2);}voidStop_I2C(){SDA=0;//发送结束条件的数据信号delayus(1);//发送结束条件的时钟信号SCL=1;//结束条件建立时间大于4usdelayus(5);SDA=1;//发送I2C总线结束信号delayus(4);}voidSendByte(ucharc){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位{if((c<<BitCnt)&0x80)SDA=1;//判断发送位elseSDA=0;delayus(1);SCL=1;//置时钟线为高,通知被控器开始接收数据位delayus(5);//保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1;//8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;delayus(2);}ucharRcvByte(){ucharretc;ucharBitCnt;retc=0;SDA=1;//置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0;//置时钟线为低,准备接收数据位delayus(5);//时钟低电平周期大于4.7μsSCL=1;//置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1;//读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);return(retc);}voidAck_I2C(bita){if(a==0)SDA=0;//在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5);//时钟低电平周期大于4μsSCL=0;//清时钟线,钳住I2C总线以便继续接收delayus(2);}ucharwrite_byte(ucharaddr,ucharwrite_data){Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return0;SendByte(addr);if(ack==0)return0;SendByte(write_data);if(ack==0)return0;Stop_I2C();delayus(10);return1;}ucharread_current(){ucharread_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data=RcvByte();Ack_I2C(1);Stop_I2C();returnread_data;}ucharread_random(ucharrandom_addr){Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}voidModifyTime(ucharyea,ucharmon,ucharda,ucharhou,ucharmin,ucharsec,ucharweek){uchartemp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp);//修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp);//修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp);//修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp);//修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp);//修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp);//修改秒 temp=HEX2BCD(week);write_byte(DS3231_WEEK,temp);//修改星期}/******************液晶写入************************/write_1602com(ucharcom)//液晶写入指令函数{ rs=0;//置为写入命令 P0=com;//送入数据 delayus(1000); en=1;//拉高使能端 delayus(1000); en=0;//完成高脉冲}write_1602dat(uchardat){ rs=1;//置为写入数据 P0=dat;//送入数据 delayus(1000); en=1; delayus(1000); en=0;}/*********************over***********************/lcd_init()//液晶初始化函数{wr=0; write_1602com(0x38);//设置液晶工作模式 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,指针加一 write_1602com(0x01); write_1602com(yh+1);//字符写入的位置 for(a=0;a<14;a++) { write_1602dat(tab1[a]); //delay(3); } write_1602com(er); for(a=0;a<12;a++) { write_1602dat(tab2[a]); //delay(3); } write_1602com(er+14);//写温度符号 write_1602dat(0xdf); write_1602dat(0x43);}voidwrite_sfm(ucharadd,uchardat)//写时分秒及温度{ uchargw,sw; gw=dat%10; sw=dat/10; write_1602com(er+add); write_1602dat(0x30+sw); write_1602dat(0x30+gw); }voidwrite_nyr(ucharadd,uchardat)//写日期{ uchargw,sw; gw=dat%10; sw=dat/10; write_1602com(yh+add); write_1602dat(0x30+sw); write_1602dat(0x30+gw); } voidwrite_week(ucharweek)//写星期函数{ write_1602com(yh+0x0c); switch(week) { case1:write_1602dat('M');//delay(5); write_1602dat('O');//delay(5); write_1602dat('N'); break; case2:write_1602dat('T');//delay(5); write_1602dat('U');//delay(5); write_1602dat('E'); break; case3:write_1602dat('W');//delay(5); write_1602dat('E');//delay(5); write_1602dat('D'); break; case4:write_1602dat('T');//delay(5); write_1602dat('H');//delay(5); write_1602dat('U'); break; case5:write_1602dat('F');//delay(5); write_1602dat('R');//delay(5); write_1602dat('I'); break; case6:write_1602dat('S');//delay(5); write_1602dat('T');//delay(5); write_1602dat('A'); break; case7:write_1602dat('S');//delay(5); write_1602dat('U');//delay(5); write_1602dat('N'); break;}}voidkeyscan(){ if(key1==0)//key1为功能键 { delayus(5000); if(key1==0) { while(!key1); key1n++; if(key1n==9) key1n=1; switch(key1n) { case1:TR0=0;//关闭定时器 //TR1=0; write_1602com(er+0x06);//写入光标位置 write_1602com(0x0f);//设置光标为闪烁 break; case2:write_1602com(er+3);//fen //write_1602com(0x0f); break; case3:write_1602com(er+0);//shi //write_1602com(0x0f); break; case4:write_1602com(yh+0x0d);//week //write_1602com(0x0f); break; case5:write_1602com(yh+0x09);//ri //write_1602com(0x0f); break; case6:write_1602com(yh+0x06);//yue //write_1602com(0x0f); break; case7:write_1602com(yh+0x03);//nian //write_1602com(0x0f); break; case8:write_1602com(0x0c);//设置光标不闪烁 write_sfm(6,miao);//写入新的秒数 temp=(miao)/10*16+(miao)%10; write_byte(DS3231_SECOND,temp);//退出时修改秒 write_1602com(er+6); write_sfm(0x03,fen); temp=(fen)/10*16+(fen)%10; write_byte(DS3231_MINUTE,temp);//修改分 write_1602com(er+3); TR0=1;//打开定时器break; } } } if(key1n!=0)//当key1按下以下。再按以下键才有效 { if(key2==0)//上调键 { delayus(5000); if(key2==0) { while(!key2); switch(key1n) { case1:miao++; if(miao==60) miao=0; write_sfm(6,miao);//写入新的秒数 temp=(miao)/10*16+(miao)%10; write_byte(DS3231_SECOND,temp);//修改秒 write_1602com(er+6);//设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case2:fen++; if(fen==60) fen=0; write_sfm(0x03,fen); temp=(fen)/10*16+(fen)%10; write_byte(DS3231_MINUTE,temp); write_1602com(er+3); break; case3:shi++; if(shi==24) shi=0; write_sfm(0,shi); temp=(shi)/10*16+(shi)%10; write_byte(DS3231_HOUR,temp); write_1602com(er+0); break; case4:week++; if(week==8) week=0; write_week(week); write_byte(DS3231_WEEK,week);//修改星期 write_1602com(yh+0x0d); break; case5:ri++; if(ri==31) ri=0; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10; write_byte(DS3231_DAY,temp);//修改日 write_1602com(yh+9); break; case6:yue++; if(yue==13) yue=0; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10; write_byte(DS3231_MONTH,temp);//修改月 write_1602com(yh+6); break; case7:nian++; if(nian==100) nian=0; write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_byte(DS3231_YEAR,temp);//修改年 write_1602com(yh+3); break; } } } if(key3==0) { delayus(5000); if(key3==0) { while(!key3); switch(key1n) { case1:miao--; if(miao==-1) miao=59; write_sfm(6,miao);//写入新的秒数 temp=(miao)/10*16+(miao)%10; write_byte(DS3231_SECOND,temp);//修改秒 write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case2:fen--; if(fen==-1) fen=59; write_sfm(3,fen); temp=(fen)/10*16+(fen)%10; write_byte(DS3231_MINUTE,temp);//修改分 write_1602com(er+3); break; case3:shi--; if(shi==-1) shi=23; write_sfm(0,shi); temp=(shi)/10*16+(shi)%10; write_byte(DS3231_HOUR,temp);//修改时 write_1602com(er+0); break; case4:week--; if(week==-1) week=7; write_week(week); write_byte(DS3231_WEEK,week);//修改星期 write_1602com(yh+0x0d); break; case5:ri--; if(ri==-1) ri=30; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10; write_byte(DS3231_DAY,temp);//修改日 write_1602com(yh+9); break; case6:yue--; if(yue==-1) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10; write_byte(DS3231_MONTH,temp);//修改月 write_1602com(yh+6); break; case7:nian--; if(nian==-1) nian=99; write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_byte(DS3231_YEAR,temp);//修改年 write_1602com(yh+3); break; } } } }}voidmain(){uintii=0;lcd_init();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年演艺经纪合同保密条款设计
- 经营场所承包合同
- 2026届新高考英语冲刺复习语填错题技巧及错题本指导
- 娱乐公司介绍
- 水暖施工员年终总结
- 安全培训讲师证年审流程课件
- 培训演讲能力课件
- 员工规范培训课件
- 儿童癫痫持续状态诊断治疗2026
- 2024年崇州市公务员考试真题
- 中国热带农业科学院橡胶研究所高层次人才引进考试题库附答案
- 2025年度机动车辆检验检测机构管理体系内审资料
- 喉癌患者吞咽功能康复护理
- 2025中原农业保险股份有限公司招聘67人笔试历年常考点试题专练附带答案详解
- 政协课件教学
- 2025年安徽省普通高中学业水平合格性考试英语试卷(含答案)
- 合法效收账协议书
- DB32∕T 5167-2025 超低能耗建筑技术规程
- 2025年天津市直机关遴选公务员面试真题及解析
- 糖尿病周围神经病护理查房
- 雨课堂学堂在线学堂云《科学研究方法与论文写作(复大)》单元测试考核答案
评论
0/150
提交评论