|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请教关于DS1302的问题 |
作者:hubo450 栏目:单片机 |
小弟根据网上找到的程序,结合读DS1302的datasheet,写了程序,但是设置日期和时间后,读出来都是ff或者fe等,怎么改也没有成功。有两个问题请教高手: 1、使用示波器量了DS1302的晶振脚,没有振荡波形,我搞不清楚是否一加电,32768HZ的晶体就开始振荡? 2、我读到的资料中是DS1302应该在上升沿触发,把数据总线上的数据写进去,读也是这样,我的程序如下: ;//////////////////////////////////////////// ; DS1302的控制程序 ;///////////////////////////////////////////// ; DS1302的引脚定义 ;//////////////////////////////////////////// rtc_rst equ P2.7 rtc_clk equ P2.0 rtc_io equ P2.1 ;//////////////////////////////////////////// ; DS1302用到的寄存器定义 ;/////////////////////////////////////////// address equ 60h tmdata equ 61h year equ 62h month equ 63h day equ 64h hour equ 65h min equ 66h sec equ 67h year1 equ 68h month1 equ 69h day1 equ 6ah hour1 equ 6bh min1 equ 6ch sec1 equ 6dh org 0000H ljmp main org 0100h main: mov year, #06h mov month,#03h mov day, #13h mov hour, #00h mov min, #10h mov sec, #00h lcall ds_op nop lcall ds_setday nop nop lcall ds_settm nop lcall ds_rdday nop nop lcall ds_rdtm nop ;/////////////////////////////////////////////// ; DS1302读日期 ;/////////////////////////////////////////////// ds_rdday: lcall ds_op mov address,#8bh lcall ds_rddata mov day1,r7;读日期 mov address,#89h lcall ds_rddata mov month1,r7;读月份 mov address,#8dh lcall ds_rddata mov year1,r7;读年份 ret ;/////////////////////////////////////////////// ; DS1302读时间 ;/////////////////////////////////////////////// ds_rdtm: lcall ds_op mov address,#81h lcall ds_rddata mov sec1,r7 ;读秒 mov address,#83h lcall ds_rddata mov min1,r7 ;读分 mov address,#85h lcall ds_rddata mov hour1,r7 ;读小时 ret ;/////////////////////////////////////////////// ; DS1302设置日期 ;////////////////////////////////////////////// ds_setday: lcall ds_op mov address,#8ah mov tmdata,day lcall ds_wrdata ;写日期 mov address,#88h mov tmdata,month lcall ds_wrdata;写月份 mov address,#8ch mov tmdata,year lcall ds_wrdata;写年 ret ;/////////////////////////////////////////////// ; DS1302设置时间 ;////////////////////////////////////////////// ds_settm: lcall ds_op;打开写保护 mov address,#80h mov tmdata,sec lcall ds_wrdata;写秒 mov address,#82h mov tmdata,min lcall ds_wrdata;写分 mov address,#84h mov tmdata,hour &nbs |
2楼: | >>参与讨论 |
作者: leituoxin 于 2006/4/14 9:18:00 发布:
你的程序我没看 你的程序我没看,如果是没有振荡的话,你可能振荡的控制字没有写,DS1302有停振的控制字 |
3楼: | >>参与讨论 |
作者: sixpower 于 2006/4/14 11:46:00 发布:
我能通过的程序 void rd_DS1302(void) { byte i; byte t2; byte ddd; IO=1; RST=0; CLK=0; t2=10; while(t2){t2--;} RST=1; t2=10; for(i=0;i<8;i++) { CLK=0; ddd=ds_add; ddd=ddd & 0x01; if(ddd==0x00) IO=0; else IO=1; t2=10; while(t2){t2--;} CLK=1; ds_add=ds_add>>1; t2=10; while(t2){t2--;} } IO=1; ds_data=0; for(i=0;i<8;i++) { CLK=0; t2=5; while(t2){t2--;} ds_data=ds_data>>1; if(IO==1) ds_data=ds_data | 0x80; CLK=1; t2=5; while(t2){t2--;} ; } RST=0; } void wr_DS1302(void) { byte i; byte t2; byte ddd; IO=1; RST=0; CLK=0; t2=3; while(t2){t2--;} RST=1; t2=10; for(i=0;i<8;i++) { CLK=0; ddd=ds_add; ddd=ddd & 0x01; if(ddd==0x00) IO=0; else IO=1; t2=3; while(t2){t2--;} CLK=1; ds_add=ds_add>>1; t2=3; while(t2){t2--;} } for(i=0;i<8;i++) { CLK=0; ddd=ds_data; ddd=ddd & 0x01; if(ddd==0x00) IO=0; else IO=1; t2=3; while(t2){t2--;} CLK=1; ds_data=ds_data>>1; t2=10; while(t2){t2--;} } RST=0; } ds_add=0x81; // DS1302读数据 rd_DS1302(); ds_add=0x80; //DS1302写数据 ds_data=mem_data; wr_DS1302(); |
4楼: | >>参与讨论 |
作者: hubo450 于 2006/4/14 18:28:00 发布:
振荡的命令字是把秒寄存器清0吗? |
5楼: | >>参与讨论 |
作者: leituoxin 于 2006/4/17 14:52:00 发布:
振荡的命令字是把秒寄存器清0吗? 是的。 |
6楼: | >>参与讨论 |
作者: winhiwang 于 2006/4/17 18:25:00 发布:
上电后32768是不振的,要软件启动,我之前发过帖子可查找一下 |
7楼: | >>参与讨论 |
作者: sdyxm21 于 2006/4/22 23:43:00 发布:
[ o |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |