基于51单片机的读取ds1307在LCD1302上显示

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/////////////////以下是DS1307头文件/////////////////////////#includereg51.h#includeintrins.h//nop函数sbitsda=P1^6;sbitscl=P1^5;voiddelay()//5u秒的延时{_nop_();_nop_();_nop_();}voidstart()//开始{scl=1;delay();sda=1;delay();sda=0;delay();}voidstop()//停止{scl=1;delay();sda=0;delay();sda=1;delay();}voidwrite(ucharslave_write_address,ucharbyte_address,uchardata_data)//写一个数据{uchartemp,temp1,i,ii;start();//开始for(ii=0;ii3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}elseif(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}elseif(ii==2){temp=data_data;//送数据temp1=data_data;}for(i=0;i8;i++){scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;//相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1sda=1;elsesda=0;delay();//5us延时scl=1;delay();//5us延时scl=0;delay();//5us延时temp1=temp11;//向左移出1位}sda=1;//释放数据线delay();//5us延时scl=1;delay();//5us延时scl=0;}stop();//停止}ucharread(ucharslave_write_address,ucharbyte_address,ucharslave_read_address)//读一个数据{uchartemp,temp1,i,ii,x,data_data;start();//开始for(ii=0;ii3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}elseif(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}elseif(ii==2){start();//开始temp=slave_read_address;//送器件读地址temp1=slave_read_address;}for(i=0;i8;i++)//开始写数据{scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;//相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1sda=1;elsesda=0;delay();//5us延时scl=1;//此时ds1307吸收数据delay();//5us延时scl=0;delay();//5us延时temp1=temp11;//向左移出1位}sda=1;//释放数据线delay();//5us延时scl=1;delay();//5us延时scl=0;//ds1307应答成功与否信号}for(x=0;x8;x++){data_data=data_data1;//向左移入1位sda=1;//非必要delay();//5us延时scl=0;//此时ds1307弹出数据delay();//5us延时scl=1;delay();//5us延时if(sda==1)//判断数据线是否是高电平data_data|=0x01;//把读到的数据或0X01}scl=0;//单片机应答非应答信号delay();//5us延时sda=1;delay();//5us延时scl=1;delay();//5us延时stop();//停止returndata_data;//返回读到的数据}voidds1307init(){write(0xd0,0x00,0x40);write(0xd0,0x01,0x45);write(0xd0,0x02,0x22);write(0xd0,0x03,0x02);write(0xd0,0x04,0x24);write(0xd0,0x05,0x10);write(0xd0,0x06,0x17);}/////////////////以下是LCD1302头文件/////////////////////////#includereg51.h#defineucharunsignedchar#defineuintunsignedint#defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b;for(;c0;c--){for(b=199;b0;b--){for(a=1;a0;a--);}}}voidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能LCD1602_RS=0;//选择发送命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}voidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择输入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//写入数据Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}voidLcdInit()//LCD初始化子程序{LcdWriteCom(0x38);//开显示LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}/////////////////以下是主函数/////////////////////////#includereg51.h#includelcd.h#includeds1307.h#defineucharunsignedchar#defineuintunsignedintuintaa=0,bb=0,cc=0,dd=0,ee=0,ff=0,gg=0,hh=0,jj=0,kk=0,ll=0,mm=0,nn=0;ucharnian=0,yue=0,ri=0,shi=0,fen=0,miao=0,xingqi=0;voidLcdDisplay(){aa=miao/10;bb=miao%10;cc=fen/10;dd=fen%10;ee=shi/10;ff=shi%10;gg=ri/10;hh=ri%10;jj=yue/10;kk=yue%10;ll=nian/10;mm=nian%10;nn=xingqi;LcdWriteCom(0x80+0X40);LcdWriteData('0'+ee);//时LcdWriteData('0'+ff);LcdWriteData('-');LcdWriteData('0'+cc);//分LcdWriteData('0'+dd);LcdWriteData('-');LcdWriteData('0'+aa);//秒LcdWriteData('0'+bb);LcdWriteCom(0x80);LcdWriteData('2');LcdWriteData('0');LcdWriteData('0'+ll);//年LcdWriteData('0'+mm);LcdWriteData('-');LcdWriteData('0'+jj);//月LcdWriteData('0'+kk);LcdWriteData('-');LcdWriteData('0'+gg);//日LcdWriteData('0'+hh);LcdWriteCom(0x8D);LcdWriteData('0'+xingqi);//星期}voidmain(){LcdInit();ds1307init();while(1){miao=read(0xd0,0x00,0xd1);//读出秒的BCD码miao=((miao&0x70)4)*10+(miao&0x0f);//将BCD码转换成10进制数fen=read(0xd0,0x01,0xd1);//以下同理fen=((fen&0x70)4)*10+(fen&0x0f);shi=read(0xd0,0x02,0xd1);shi=((shi&0x70)4)*10+(shi&0x0f);xingqi=read(0xd0,0x03,0xd1);//星期最多是7所以不需转换ri=read(0xd0,0x04,0xd1);ri=((ri&0x70)4)*10+(ri&0x0f);yue=read(0xd0,0x05,0xd1);yue=((yue&0x70)4)*10+(yue&0x0f);nian=read(0xd0,0x06,0xd1);nian=((nian&0xf0)4)*10+(nian&0x0f);LcdDisplay();}}

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功