|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
为什么我的ds1302读出来的都是FF呢?搞了N天了, |
作者:northerns 栏目:单片机 |
我都快疯了,求各位救命啊 程序如下: sbit ds_clk=P4^0; sbit ds_io =P4^1; sbit ds_rst=P4^2; sbit ACC_0=ACC^0; sbit ACC_7=ACC^7; uchar i,j,c; //uchar data txdata[12]={"HELLO MOTO\n"}; //uchar txdata; uchar data txdata[7]; uchar data second,mintue,hour,dat,month,week,year; uchar data ucbuffer; void DISPLAY(); void delay() { uchar j; for(j=250;j>0;j--) //continue ; } void write_data(uchar ucsenddata) { uchar i; ACC=ucsenddata; for(i=8;i>0;i--) { ds_io=ACC_0; ds_clk=1; _nop_(); _nop_(); ds_clk=0; //ACC=_cror_(ACC,1); ACC=ACC>>1; } } uchar read_data() { uchar i; for(i=8;i>0;i--) { //ACC=_cror_(ACC,1); ACC=ACC>>1; ACC_7=ds_io; ds_clk=1; _nop_(); _nop_(); ds_clk=0; } return ACC; } void write_DS1302(uchar ucaddress,uchar ucdata) { ds_rst=0; delay(); ds_clk=0; delay(); ds_rst=1; delay(); write_data(ucaddress); delay(); delay(); write_data(ucdata); delay(); ds_clk=0; delay(); ds_rst=0; delay(); } uchar read_DS1302(uchar ucaddress) { ds_rst=0; delay(); ds_clk=0; delay(); ds_rst=1; delay(); write_data(ucaddress); delay(); ucbuffer=read_data(); delay(); ds_clk=0; delay(); ds_rst=0; delay(); return ucbuffer; } a() { write_DS1302(0x8e,0x00); delay(); delay(); write_DS1302(0x90,0xa5); delay(); delay(); write_DS1302(0x80,0x00); delay(); delay(); write_DS1302(0x82,0x00); delay(); delay(); write_DS1302(0x84,0x08); delay(); delay(); write_DS1302(0x86,0x31); delay(); delay(); write_DS1302(0x88,0x12); delay(); delay(); write_DS1302(0x8a,0x06); delay(); delay(); write_DS1302(0x8c,0x00); delay(); delay(); } /* clockstart() { uchar val; val=read_DS1302(0x81); val&=0x7f; write_DS1302(0x8e,0x00); write_DS1302(0x80,val); write_DS1302(0x90,0xa5); write_DS1302(0x8e,0x80); } */ b() { second=read_DS1302(0x81); delay(); delay(); mintue=read_DS1302(0x83); delay(); delay(); hour=read_DS1302(0x85); delay(); delay(); dat=read_DS1302(0x87); delay(); delay(); month=read_DS1302(0x89); delay(); delay(); week=read_DS1302(0x8b); delay(); delay(); year=read_DS1302(0x8d); delay(); delay(); } set() { PCON=0x00; TMOD=0x20; TH1=0xfa; TL1=0xfa; SCON=0x50; TR1=1; EA=1; } main() { set(); a(); //write_DS1302(0xC0,0x02); // clockstart(); while(1) { b(); //month=read_DS1302(0xC1); //ds_rst=1; i=0; txdata[i]=second; txdata[++i]=mintue; txdata[++i]=hour; txdata[++i]=dat; txdata[++i]=month; txdata[++i]=week; txdata[++i]=year; // while(txdata[i]!=0x00) for (i=0;i<7;i++) { SBUF=txdata[i]; while(TI==0); TI=0; //i++; } for(j=0;j<50000;j++); } } serial() interrupt 4 {TR1=0; TH1=0xfa; TL1=0xfa; TR1=1; } 由串口中读出的数据:FF FF FF FF FF FF FF |
2楼: | >>参与讨论 |
作者: northerns 于 2006/1/4 15:25:00 发布:
电池暂时还没接 |
3楼: | >>参与讨论 |
作者: coldra 于 2006/1/4 17:16:00 发布:
一看别人的程序就头疼 要下班了,回家给你看看,建议你去找一下别人的成熟一点的程序,网上很多的,C语言移置很多方便,我找过一个,稍修改一下竟然一下子就成功了,呵呵 |
4楼: | >>参与讨论 |
作者: 扬欣电子 于 2006/1/4 17:36:00 发布:
我用过很容易的呀。 1、晶振为何没有匹配电容? 2、DS1302的启动位设置了吗? |
5楼: | >>参与讨论 |
作者: northerns 于 2006/1/4 18:12:00 发布:
to 我这个程序也是在网上找的,可是不知道是不是有问题,我编程水平低,各位帮一下啦。 to coldra和扬欣电子 :谢谢两位了,两位要是有自己运行过的DS1302的程序,能给我发一份吗? 我的邮箱:northernstart@hotmail.com northernstart@yahoo.com.cn 晶振没有电容据说也没问题的。 启动位怎么设置啊?有人说把秒寄存器的高位设置为0,怎么设置呢? |
6楼: | >>参与讨论 |
作者: 扬欣电子 于 2006/1/4 20:34:00 发布:
我是51汇编的,你有用嘛? 你的CPU是什么? |
7楼: | >>参与讨论 |
作者: 扬欣电子 于 2006/1/4 21:03:00 发布:
看看这个帖子,里面有DS1302的读写程序 http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=1941533&tp=DS1302%u5728Protes%u4E0B%u7684%u4EFF%u771F |
8楼: | >>参与讨论 |
作者: zzz正 于 2006/1/4 21:43:00 发布:
你可以去这里看看 http://www.21icbbs.com/club/bbs/bbsview.asp?boardid=9&t=1925171&tp=%CE%D2%B5%C4%A3%B1%A3%B8%A3%E2%A3%B2%A3%B0%B2%E2%CE%C2%B3%CC%D0%F2%B6%C1%B2%BB%B3%F6%CE%C2%B6%C8%D6%B5 |
9楼: | >>参与讨论 |
作者: blliao 于 2006/1/4 22:13:00 发布:
给你一个成功的C sbit DS13CS =P3^5; /*DS1302的RST脚片选*/ sbit DS13IO =P3^4; /*DS1302的IO脚数据*/ sbit DS13CLK =P3^3; /*DS1302的SCLK脚脉冲*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能 _code读功能命令 */ uchar readds1302(uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能 fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x10); /*置位写保护*/ } |
10楼: | >>参与讨论 |
作者: northerns 于 2006/1/5 9:07:00 发布:
谢谢各位,我试一下先, |
11楼: | >>参与讨论 |
作者: northerns 于 2006/1/5 9:53:00 发布:
终于能读出数了 原来是管脚定义错误了 sbit ds_clk=P4^0; sbit ds_io =P4^1; sbit ds_rst=P4^2; 应该是 sbit ds_clk=P4^1; sbit ds_io =P4^0; sbit ds_rst=P4^2; 又有新问题了,时钟不走,该怎么做呢,可以的话顺便据个例子,最好是运行过的,先谢谢各位了,急盼啊 |
12楼: | >>参与讨论 |
作者: coldra 于 2006/1/5 20:48:00 发布:
时钟不走是没有启动1302吧 |
13楼: | >>参与讨论 |
作者: coldra 于 2006/1/5 21:10:00 发布:
billo的程序应该可以 你的1302不走应该是没有启动,另外你看一下你的晶振是否确实振起来了 我给你发了例程,你查收看一下吧 |
14楼: | >>参与讨论 |
作者: 陈双君 于 2006/1/7 21:25:00 发布:
就这样也能行了 就这样也能行了. 我要先去用一下才知道, 好像我认为总是少了一点什么似的. |
15楼: | >>参与讨论 |
作者: hotpower 于 2006/1/8 2:38:00 发布:
晕到... |
16楼: | >>参与讨论 |
作者: northerns 于 2006/1/10 8:55:00 发布:
我把80H写了00了 a() { write_ds1302(0x8e,0x00); delay(); delay(); write_ds1302(0x90,0xa5); delay(); delay(); write_ds1302(0x80,0x00); delay(); delay(); write_ds1302(0x82,0x00); delay(); delay(); write_ds1302(0x84,0x08); delay(); delay(); write_ds1302(0x86,0x31); delay(); delay(); write_ds1302(0x88,0x12); delay(); delay(); write_ds1302(0x8a,0x06); delay(); delay(); write_ds1302(0x8c,0x00); delay(); delay(); } 我把0x80单元写了00了,这样行吗 |
17楼: | >>参与讨论 |
作者: northerns 于 2006/1/10 8:59:00 发布:
先谢谢各位大侠了 |
18楼: | >>参与讨论 |
作者: northerns 于 2006/1/11 20:02:00 发布:
时钟开始走了,可是还是有点不明白 我把上面的我列出来的程序写了N遍都不行,今天我把主程序main()中的函数a()给屏蔽了(就是//a()这样了),时钟就可以走了,终于感动老天了。可是为什么那。函数a()是往DS1302的秒寄存器0x80、分寄存器0x82、小时寄存器0x84……里写初始值的,为什么我往CPU里写了N次程序以后,把它屏蔽掉后DS1302时钟就能运行了,百思不得其解。 跪求各位大侠们指点迷津,因为以后的还有好多程序要编,时钟终于能走了,我好怕再出什么问题啊,呜呜,这可是关系到我的这份工作的命运了,要是再干不好,就要被炒了,我好不容易找到这份工作的呀,恳请知道原因的大哥大姐们帮帮我呀!!!! |
19楼: | >>参与讨论 |
作者: 夏虫 于 2006/1/12 9:27:00 发布:
经验是时间积累的结果,不要怕出问题 经验是时间积累的结果,不要怕出问题,只有出问题了,才知道错在哪里,今后就可以避免类似的错误了,哪个工程师都是这么走出来的,今后也不能保证不出错啊~~ |
20楼: | >>参与讨论 |
作者: soho 于 2006/1/12 15:33:00 发布:
总结一下 是芯片/电路有问题?不是 是程序有问题?也不是. 编译通过了,说明程序可以跑起来(什么,没你要的结果,那不怪程序,它是按你的指示在执行). 那么问题在那? 1. 程序与硬件不相附,比如你把管脚搞错了; 2. 芯片不熟悉, 不知道怎样才是正确的. 所以,出现问题时,仔细检查,对不熟的芯片,反复看它的资料. |
21楼: | >>参与讨论 |
作者: northerns 于 2006/1/12 19:29:00 发布:
谢谢各位的忠告 我先把程序写到CPU里,这时,读出来的是写进去的,但是不计时,然后我再把主程序main()中的函数a()给屏蔽了(就是//a()这样了),再写一次程序时钟就可以走了,很怪啊,哪位高人遇到过或知道为什么的,能不能耽误点您的宝贵时间,告诉我一下啊,在这先谢谢啦 |
22楼: | >>参与讨论 |
作者: northerns 于 2006/1/18 12:30:00 发布:
问题解决了 问题解决了。加了一条语句以判断是否已经初始化。多谢各位大侠朋友的帮忙,谢谢!!! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |