完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 study***r 于 2014-1-8 15:37 编辑
#include #include #include uchar DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,}; uchar LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar DisplayData[8]; uchar datCODE[3]={0X30,0X45,0X11}; uchar datCODEConv[6]; uchar Read_CmdCODE[3]={0x81,0x83,0x85}; //sec min hour// uchar Write_CmdCODE[3]={0x80,0x82,0x84}; //sec min hour// void main() { uchar i,Read_Cmd,Write_Cmd; DS1302_Init() ; while(1) { for(i=0;i<3;i++) { Read_Cmd=Read_CmdCODE; //读控制字 //datCODE=DS1302_Read(Read_Cmd);//返回读取值,秒分时 Split_Display(i,datCODE); } Split_Display(3,0x00); //显示横线 delayus(2); } } void DS1302_Init(void) { DS1302_Write(0x8e,0x00);//写保护关 DS1302_Write(0x80,0x11); //初始秒值为0 DS1302_Write(0x82,0x11);//初始分钟值为0 DS1302_Write(0x84,0x11); //初始为24小时模式初始时间为0点 DS1302_Write(0x90,0x01); //充电 DS1302_Write(0xc0,0xf0); //初始化一次标示 DS1302_Write(0x8e,0x80); //写保护开 } uchar DS1302_Read(uchar cmd) { uchar dat; RST=0;//初始CE线置为0 SCLK=0;//初始时钟线置为0 RST=1;//初始CE置为1,传输开始 DS1302_WriteByte(cmd);//传输命令字,要读取的时间/日历地址 dat=DS1302_ReadByte();//读取要得到的时间/日期 SCLK=1;//时钟线拉高 RST=0;//读取结束,CE置为0,结束数据的传输 return dat;//返回得到的时间/日期 } uchar DS1302_ReadByte() { uchar i,dat; //delayus(2); ; for(i=0;i<8;i++) { dat>>=1;//要返回的数据左移一位 if(IOWR==1)//当数据线为高时,证明该位数据为1 dat|=0x80;//要传输数据的当前值置为1,若不是,则为0 SCLK=1;//拉高时钟线 delayus(2); SCLK=0;//制造下降沿 delayus(2); } return dat;//返回读取出的数据 } void DS1302_Write(uchar cmd, uchar dat) { RST=0; //初始CE线置为0 SCLK=0; //初始时钟线置为0 RST=1; //初始CE置为1,传输开始 DS1302_WriteByte(cmd); //传输命令字,要写入的时间/日历地址 DS1302_WriteByte(dat); //写入要修改的时间/日期 SCLK=1; //时钟线拉高 RST=0; //读取结束,CE置为0,结束数据的传输 } void DS1302_WriteByte(uchar dat) { uchar i; SCLK=0;//初始时钟线置为0 delayus(2); for(i=0;i<8;i++)//开始传输8个字节的数据 { IOWR=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的 delayus(2); SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输 delayus(2); SCLK=0;//时钟线拉低,为下一个上升沿做准备 dat>>=1;//数据右移一位,准备传输下一位数据 } } void Split_Display(uchar wei,uchar dat) { uchar i,j,conv1,conv2,x=10;//显示位置 conv1= dat/16 ; conv2= dat%16 ; switch(wei) { case 0: i=6;j=7;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //秒 case 1: i=3;j=4;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //分 case 2: i=0;j=1;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //时 default: i=2;j=5;DS1302_Display(i,x); delayus(5);DS1302_Display(j,x);break; } } void DS1302_Display(uchar i,uchar conv) { LED=0x00; switch(i) //依次选通各位动态显示 { case 0: a=0;b=0;c=0;break; case 1: a=1;b=0;c=0;break; case 2: a=0;b=1;c=0;break; case 3: a=1;b=1;c=0;break; case 4: a=0;b=0;c=1;break; case 5: a=1;b=0;c=1;break; case 6: a=0;b=1;c=1;break; case 7: a=1;b=1;c=1;break; default :break; } LED=LEDCODE[conv]; } void delayus(uchar c ) { for(;c>0;c--) ; } ------------------------------------------------------------------------------ 其中OwnDef.h内容 ***it RST=P0^5 ;***it SCLK=P0^6 ; ***it IOWR=P0^7 ; ***it a=P3^0; sbit b=P3^1; ***it c=P3^2; ***it CS=P2^7;- -------------------------------------------------------------------- 为什么读取出来的DS1302数据一直不对,如果在主函数中不读取数据而直接用我给定的数据,显示正常。 而采用读取出来的就一直为0和1.求助大神们。。想了好几天了没搞懂。。。。 图片如下 |
|
相关推荐
1个回答
|
|
路过学习学习。。。。。。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4131 浏览 3 评论
5418 浏览 1 评论
5698 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7423 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1210 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-17 02:26 , Processed in 0.421007 second(s), Total 46, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号