DS1302秒位一直为FF

请问哪位高手玩过DS1302?为什么我的输出总是0XFF?_百度知道
请问哪位高手玩过DS1302?为什么我的输出总是0XFF?
首先感谢热心朋友的回答!!
本人玩的是STM8S芯片,请问有谁是玩其他芯片出现过同样的错误么?或者谁可以说出几个可能的情况?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你的电路接对了吗。我这有ds1302的驱动程序你可以参考一下是avr单片机的//复位脚#define RST_CLR PORTD&= ~(1 && PD6)#define RST_SET PORTD |= (1 && PD6)#define RST_IN DDRD &= ~(1 && PD6)#define RST_OUT DDRD |= (1 && PD6)//双向数据#define IO_CLR PORTD &= ~(1 && PD5)#define IO_SET PORTD |= (1 && PD5)#define IO_R PIND & (1 && PD5)#define IO_IN DDRD &= ~(1 && PD5)#define IO_OUT DDRD |= (1 && PD5)//时钟信号#define SCK_CLR PORTD &= ~(1 && PD4)#define SCK_SET PORTD |= (1 && PD4)#define SCK_IN DDRD &= ~(1 && PD4)#define SCK_OUT DDRD |= (1 && PD4)#define ds1302_sec_add
//秒数据地址#define ds1302_min_add
//分数据地址#define ds1302_hr_add
//时数据地址#define ds1302_date_add
//日数据地址#define ds1302_month_add
//月数据地址#define ds1302_day_add
//星期数据地址#define ds1302_year_add
//年数据地址#define ds1302_control_add
//控制数据地址#define ds1302_charger_add
//涓流充电地址
#define ds1302_clkburst_add
0xbe///////////闹钟地址///////////////#define ds1302_date1_add
//关日数据地址#define ds1302_hr1_add
//关时数据地址#define ds1302_min1_add
//关分数据地址#define ds1302_date2_add
//开日数据地址#define ds1302_hr2_add
//开时数据地址#define ds1302_min2_add
//开分数据地址//向DS1302写入一字节数据void ds1302_write_byte(unsigned char addr, unsigned char d) { RST_SET;
//启动DS1302总线
//写入目标地址:addr IO_OUT; addr = addr & 0xFE;//最低位置零 for (i = 0; i & 8; i ++)
if (addr & 0x01) {
addr = addr && 1;
//写入数据 IO_OUT; for (i = 0; i & 8; i ++) {
if (d & 0x01)
d = d && 1;
} RST_CLR;
//禁止DS1302总线}//读出一个字节unsigned char ds1302_read_byte(unsigned char addr) { RST_SET;
//启动DS1302总线 //写入目标地址:addr IO_OUT; addr = addr | 0x01;
//最低位置高 for (i = 0; i & 8; i ++) {
if (addr & 0x01) {
addr = addr && 1;
//输出数据 IO_IN; for (i = 0; i & 8; i ++) {
temp = temp && 1;
if (IO_R) {
temp |= 0x80;
temp &= 0x7F;
//禁止DS1302总线}//写入时钟数据void ds1302_write_time(unsigned char time_data[8]) { ds1302_write_byte(ds1302_control_add,0x00);
//关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80);
ds1302_write_byte(ds1302_charger_add,0xa9);
//涓流充电
ds1302_write_byte(ds1302_year_add,time_data[1]); //只写入后面两位 08 ds1302_write_byte(ds1302_month_add,time_data[2]); //月
ds1302_write_byte(ds1302_date_add,time_data[3]);
ds1302_write_byte(ds1302_hr_add,time_data[4]);
ds1302_write_byte(ds1302_min_add,time_data[5]);
//分 ds1302_write_byte(ds1302_sec_add,time_data[6]);
//秒 ds1302_write_byte(ds1302_day_add,time_data[7]);
ds1302_write_byte(ds1302_control_add,0x80);
//打开写保护 }//读出时钟数据void ds1302_read_time(unsigned char *time_data)
time_data++; *time_data=ds1302_read_byte(ds1302_year_add);
//只读出后面两位08 time_data++; *time_data=ds1302_read_byte(ds1302_month_add);
time_data++; *time_data=ds1302_read_byte(ds1302_date_add);
time_data++; *time_data=ds1302_read_byte(ds1302_hr_add);
time_data++; *time_data=ds1302_read_byte(ds1302_min_add);
time_data++; *time_data=(ds1302_read_byte(ds1302_sec_add))&0x7F; //秒
time_data++; *time_data=ds1302_read_byte(ds1302_day_add);
//周 }/**********************向DS302写入闹钟数据***********************/void ds1302_write_time1(unsigned char time_buf1[5]){
ds1302_write_byte(ds1302_control_add,0x00);
//关闭写保护
ds1302_write_byte(ds1302_charger_add,0xa9);
//涓流充电
ds1302_write_byte(ds1302_date1_add,time_buf1[0]);
//关日 ds1302_write_byte(ds1302_hr1_add,time_buf1[1]);
ds1302_write_byte(ds1302_min1_add,time_buf1[2]);
ds1302_write_byte(ds1302_date2_add,time_buf1[3]);
ds1302_write_byte(ds1302_hr2_add,time_buf1[4]);
//开时 ds1302_write_byte(ds1302_min2_add,time_buf1[5]);
//开分 ds1302_write_byte(ds1302_control_add,0x80);
//打开写保护 }/********************从DS302读出闹钟数据*********************/void ds1302_read_time1(unsigned char time_buf1[5]){
time_buf1[0] = ds1302_read_byte(ds1302_date1_add);
//关日 time_buf1[1] = ds1302_read_byte(ds1302_hr1_add);
//关时 time_buf1[2] = ds1302_read_byte(ds1302_min1_add);
time_buf1[3] = ds1302_read_byte(ds1302_date2_add);
time_buf1[4] = (ds1302_read_byte(ds1302_hr2_add));
time_buf1[5] = (ds1302_read_byte(ds1302_min2_add));
//开分 }//初始化void ds1302_init(void) {
}直接在主函数里调用相应的函数既可以了。
采纳率:50%
为您推荐:
其他类似问题
您可能关注的内容
ds1302的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。您当前的位置:&>&&>&
ds1302中文资料
发布时间: 20:39:51&&来源:资料室 & &作者:& &更新251
DS1302 涓流充电时钟保持芯片的原理与应用
摘要本文概括介绍了DS1302 时钟芯片的特点和基本组成通过实例详细说明了有关功能的应用
软件关于 DS1302 各寄存器的详细位控功能请参考DALLAS 达拉斯公司的相应产品资料
DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简
单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天
数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之
间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK
串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很
低保持数据和时钟信息时功率小于1mW
DS1302 是由DS1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1 为可
编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等
产品领域下面将主要的性能指标作一综合
? 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力
? 31 8 位暂存数据存储RAM
? 串行I/O 口方式使得管脚数量最少
? 宽范围工作电压2.0 5.5V
? 工作电流2.0V 时,小于300nA
? 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
? 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配
? 简单3 线接口
? 与TTL 兼容Vcc=5V
? 可选工业级温度范围-40 +85
? 与DS1202 兼容
? 在DS1202 基础上增加的特性
对Vcc1 有可选的涓流充电能力
双电源管用于主电源和备份电源供应
备份电源管脚可由电池或大容量电容输入
附加的7 字节暂存存储器
1 DS1302 的基本组成和工作原理
DS1302 的引脚功能排列及描述如下图所示
&&&&&&&&&&&&&&&&&&&ds1302引脚图
X1 X2 32.768KHz 晶振管脚
RST 复位脚
I/O 数据输入/输出引脚
SCLK 串行时钟
Vcc1,Vcc2 电源供电管脚
DS1302 串行时钟芯片8 脚DIP
DS1302S 串行时钟芯片8 脚SOIC 200mil
DS1302Z 串行时钟芯片8 脚SOIC 150mil
2. DS1302 内部寄存器
CH: 时钟停止位&&&&&&&&&&&&&&&&&&&&&&&&& 存器2 的第7 位12/24 小时标志
CH=0 振荡器工作允许&&&&&&&&&&&&& &bit7=1,12 小时模式
CH=1 振荡器停止&&&&&&&&&&&&&&&&&&&&&& bit7=0,24 小时模式
WP: 写保护位&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 寄存器2 的第5 位:AM/PM 定义
WP=0 寄存器数据能够写入&&&&&& AP=1 下午模式
WP=1 寄存器数据不能写入&&&&&&&AP=0 上午模式
TCS: 涓流充电选择&&&&&&&&&&&&&&&&&&&&& DS: 选择位
TCS=1010 使能涓流充电&&&&&&&&&&&& DS=01 选择一个
TCS=其它 禁止涓流充电&&&&&&&&&&&&DS=10 选择两个
DS=00 或11, 即使TCS=1010, 充电功能也被禁止
DS1302 与微控制器的接口软件及功能应用举例
下面首先给出基本的接口软件然后举例说明各种功能的应用
1 写保护寄存器操作
当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E,8F 来
规定禁止写入/读出写保护位不能在多字节传送模式下写入
Write_Enable:
MOV&& Command,#8Eh&&&&& &;命令字节为8E
MOV&& &ByteCnt,#1&&&&&&&&&&& &;单字节传送模式
MOV&&& R0,#XmtDat&&&&&&&& & &数据地址覆给R0
MOV&&& XmtDat,#00h&&&&&&&& &数据内容为0 写入允许
ACALL Send_Byte&&&&&&&&&&&& 用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &返回调用本子程序处
当写保护寄存器的最高位为1 时禁止数据写入寄存器
Write_Disable:
MOV&&&&&&& &Command,#8Eh&&&&&&&& &;命令字节为8E
MOV&&&&&&&&& ByteCnt,#1&&&&&&&&&&&&& & ;单字节传送模式
MOV&&&&&&&&& &R0,#XmtDat&&&&&&&&&&&&& 数据地址覆给R0
MOV&&&&&&&&& XmtDat,#80h&&&&&&&&&&&& &数据内容为80h 禁止写入
ACALL&&&&&&&Send_Byte&&&&&&&&&&&&&&&&&调用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回调用本子程序处
以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面
的程序亦使用了这个模块
2 时钟停止位操作
当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始
Osc_Enable:
MOV&&&&&& &Command,#80h&&&&&&&& &; 命令字节为80
MOV&&&&&&&&ByteCnt,#1&&&&&&&&&&&&&&& &; 单字节传送模式
MOV&&&&&&& 0,#XmtDat&&&&&&&&&&&&&&&&&& 数据地址覆给R0
MOV&&&&&&& XmtDat,#00h&&&&&&&&&&&&&& 数据内容为0 振荡器工作允许
ACALL&&&& Send_Byte&&&&&&&&&&&&&&&&&&调用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回调用本子程序处
当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式
Osc_Disable:
MOV&&&&&&&&&&&&&&&Command,#80h&&&& ;命令字节为80
MOV&&&&&&&&&&&&&& ByteCnt,#1&&&&&&&&&&& ;单字节传送模式
MOV&&&&&&&&&&&&&& R0,#XmtDat&&&&& && 数据地址覆给R0
MOV&&&&&&&&&&&&& &XmtDat,#80h&&&&&&& 数据内容为80h 振荡器停止
ACALL&&&&&&&&&& &Send_Byte&&&&&&&&&& 调用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回调用本子程序处
3. 多字节传送方式
当命令字节为BE 或BF 时DS1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开
始连续读写从0 位开始的数据当命令字节为FE 或FF 时DS1302 工作在多字节RAM 传送模式31 个
RAM 寄存器从0 地址开始连续读写从0 位开始的数据
例如写入00 年6 月21 日星期三13 时59 分59 秒程序设置如下
Write_Multiplebyte:
MOV&&&& &&&& Command,#0BEh&&&&&&&&&& &;命令字节为BEh
MOV&&&&&&&& ByteCnt,#8&&&&&&&&&&&&&&&&&&&&& ;多字节写入模式此模块为8 个
MOV&&&&&&&& R0,#XmtDat&&&&&&&&&&&&&&&&&&&& 数据地址覆给R0
MOV&&&&&&&&&XmtDat,#59h&&&&&&&&&&&&&&&&&& 秒单元内容为59h
MOV&&&&&&&& XmtDat+1,#59h&&&&&&&&&&&&& 分单元内容为59h
MOV&&&&&&& &XmtDat+2,#13h&&&&&&&&&&&&& 时单元内容为13h
MOV&&&&&&&& XmtDat+3,#21h&&&&&&&&&&&& 日期单元内容为21h
MOV&&&&&&&& XmtDat+4,#06h&&&&&&&&&&&& 月单元内容为06h
MOV&&&&&&& &XmtDat+5,#03h&&&&&&&&&&&& 星期单元内容为03h
MOV&&&&&&&& XmtDat+6,#0&&&&&&&&&&&&&&&& 年单元内容为00h
MOV&&&&&&&&&XmtDat+7,#0&&&&&&&&&&&&&&&& 写保护单元内容为00h
ACALL& & Send_Byte&&&&&&&&&&&&&&&&&&&&&& 调用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回调用本子程序处
读出寄存器0-7 的内容程序设置如下
Read_Multiplebyte:
MOV&&&&&&&&&& &Command,#0BFh&&&&&&&& 命令字节为BFh
MOV&&&&&&&&&&&&ByteCnt,#8 ;&&&&&&&&&&&&&&& 多字节读出模式此模块为8 个
MOV&&&&&&&&&&&&R1,#RcvDat&&&&&&&&&&&&&&&& 数据地址覆给R1
ACALL&&&&&&&&&Receive_Byte&&&&&&&&&&&&& 调用读出数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回调用本子程序处
以上程序调用了基本数据接收(Receive_Byte)模块及一些内存单元定义, 其源程序清单在附录中给
出下面的程 序亦使用了这个模块
4. 单字节传送方式
例如写入8 时12 小时模式程序设置如下
Write_Singlebyte:
MOV&&&&&&&&& &Command,#84h&&&&&&&&& &; 命令字节为84h
MOV&&&&&&&&& &ByteCnt,#1&&&&&&&&&&&&&&&&&&; 单字节传送模式
MOV&&&&&&&&&& R0,#XmtDat&&&&&&&&&&&&&&& 数据地址覆给R0
MOV&&&&&&&&&& XmtDat,#88h&&&&&&&&&&&&&& 数据内容为88h
ACALL&&&&&&& Send_Byte&&&&&&&&&&&&&&&&& 调用写入数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回调用本子程序处
上面所列出的程序模块Write_Enable Write_Disable Osc_Enable Osc_Disable
与单字节写入模块Write_Singlebyte 的程序架构完全相同仅只是几个入口参数不同本文是为了强调功
能使用的不同才将其分为不同模块另外,与涓流充电相关的设定也是单字节操作方式,这里就不再单独列出,
用户在使用中可灵活简略
下面模块举例说明如何单字节读出小时单元的内容.
Read_Singlebyte:
MOV&&&&&&&&&&& &Command,#85h&&&&&&&&&&& &; 命令字节为85h
MOV&&&&&&&&&&&&&ByteCnt,#1&&&&&&&&&&&&&&&&&&& ; 单字节传送模式
MOV&&&&&&&&&&& &R1,#RcvDat&&&&&&&&&&&&&&&&&& 数据地址覆给R1
ACALL&&&&&&&&&&Receive_Byte&&&&&&&&&&&&&&& 调用读出数据子程序
RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回调用本子程序处
DS1302 应用电路原理图P87LPC764 单片机选取内部振荡及内部复位电路
附录数据发送与接收模块源程序清单
; CPU 工作频率最大不超过20MHz
; P87LPC762/4 主控器发送接受数据程序
; 说明本程序是利用Philips 公司的P87LPC764 单片机任何具有51 内核或其它合适的单片机都可在此
作为主控器的普通I/O 口(如P1.2/P1.3/P1.4)实现总线的功能对总线 上的器件本程序采用DS1302
进行读写操作命令字节在Command 传送字节数在ByteCnt 中所发送的数据在XmtDat 中所接收
的数据在RcvDat 中
;P87LPC762/4 主控器总线发送接受数据程序头文件
;内存数据定义
BitCnt&&&& &&&&& data&&&&& 30h&& &&&& &; 数据位计数器
ByteCnt& &&&&& data&&&&&&31h&&&&&&& &; 数据字节计数器
Command&&&& data&&&&& 32h&&&&&&&& ; 命令字节地址
RcvDat&&&&&&& &DATA& 40H&&&&&&&&; 接收数据缓冲区
XmtDat&&&&&&&& DATA 50H&&&&&&& &; 发送数据缓冲区
;端口位定义
IO_DATA&& &bit&&&&&&&&& P1.3&&&&&& ; 数据传送总线
SCLK&&&&&&&&& &bit&&&&&&& &P1.4&&&&&& ; 时钟控制总线
RST&&&&&&&&&&&& &bit&&&&&&& &P1.2&&&&&&&&; 复位总线
;发送数据程序
;名称:Send_Byte
;描述:发送ByteCnt 个字节给被控器DS1302
;命令字节地址在Command 中
;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中
Send_Byte:
CLR&&&&&& RST&&&&& &;复位引脚为低电平所有数据传送终止
CLR&&&&&&&SCLK&&&& 清时钟总线
SETB&&&&&&&&&& RST&&&&&&& &&&&&&&&&&& &;复位引脚为高电平逻辑控制有效
MOV&&&&&&&&& &A,Command&&&&&&&& 准备发送命令字节
MOV&&&&&&&&&& &BitCnt,#08h&&&&& & &传送位数为8
RRC&&&&&&&&&& &A&&&&&&&&&&&&&&&&&&&&&& && 将最低位传送给进位位C
MOV&&&&&&&&& IO_DATA,C&&&&&&& &位传送至数据总线
SETB&&&&&&&&& &SCLK&&&&&&&&&&&&&&&& 时钟上升沿发送数据有效
CLR&&&&&&&&&& &SCLK&&&&&&&&&&&&&&&&&& 清时钟总线
DJNZ&&&&&&&&&&& &BitCnt,S_Byte0&&&&&&&&&&&& &位传送未完毕则继续
S_Byte1:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &准备发送数据
MOV&&&&&&&&&&&&& A,@R0&&&&&&&&&&&&&&&&&&&& && 传送数据过程与传送命令相同
MOV&&&&&&&&&&&& BitCnt,#08h
MOV&&&&&&&&&&&&& IO_DATA,C
SETB&&&&&&&&&&&&&SCLK
CLR&&&&&&&&&&&&& &SCLK
DJNZ&&&&&&&&&&&&&BitCnt,S_Byte2
INC&&&&&&&&&&&&&& &R0&&&&&&&&&&&&&&&&&&&&&&&&&&&& &发送数据的内存地址加1
DJNZ&&&&&&&&&&& &ByteCnt,S_Byte1&&&&&&&&字节传送未完毕则继续
CLR&&&&&&&&&&&& &&RST&&&&&&&&&&&&&&&&&&&&&&&&& &&逻辑操作完毕清RST
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
Receive_Byte:
CLR&&&&&&&&&&& &RST&&&&&&&&&&&&&&&&&&&&&&&&&& &;复位引脚为低电平所有数据传送终止
CLR&&&&&&&&&&& &SCLK&&&&&&&&&&&&&&&&&&&&&&&&清时钟总线
SETB&&&&&&&&&& RST&&&&&&&&&&&&&&&&&&&&&&&&&& ;复位引脚为高电平逻辑控制有效
MOV&&&&&&&&&& A,Command&&&&&&&&&&&&& 准备发送命令字节
MOV&&&&&&&&&&& BitCnt,#08h&&&&&&&&&&&& &传送位数为8
RRC&&&&&&&&&&&& &A&&&&&&&&&&&&&&&&&&&&&&&&&&&& 将最低位传送给进位位C
MOV&&&&&&&&&&&&IO_DATA,C&&&&&&&&& &位传送至数据总线
SETB&&&&&&&&&&& SCLK&&&&&&&&&&&&&&& &&& 时钟上升沿发送数据有效
CLR&&&&&&&&&&&&& SCLK&&&&&&&&&&&&&&&&&&& 清时钟总线
DJNZ&&&&&&&&&&& BitCnt,R_Byte0&&&&& 位传送未完毕则继续
NOP&&&&&&&&&&&
R_Byte1:&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&& &&&准备接收数据
CLR&&&&&&&&&&& &A&&&&&&&&&&&&&&&&&&&&&&&&&&&&清类加器
CLR&&&&&&&&&&&&& C&&&&&&&&&&&&&&&&&&&&&&&&&& 清进位位C
MOV&&&&&&&&&& &BitCnt,#08h&&&&&&&&&& &接收位数为8
MOV&&&&&&&&&&&&C,IO_DATA&&&&&&&&&数据总线上的数据传送给C
RRC&&&&&&&&&&&& A&&&&&&&&&&&&&&&&&&&&&&&&&& 从最低位接收数据
SETB&&&&&&&&&& &SCLK&&&&&&&&&&&&&&&&&&&时钟总线置高
CLR&&&&&&&&&&& &SCLK&&&&&&&&&&&&&&&&&& 时钟下降沿接收数据有效
DJNZ&&&&&&&&& &BitCnt,R_Byte2&&&& 位接收未完毕则继续
MOV&&&&&&&&& @R1,A&&&&&&&&&&&&&&&&& 接收到的完整数据字节放入接收内存缓冲区
INC&&&&&&&&&& &R1&&&&&&&&&&&&&&&&&&&&&&&&& 接收数据的内存地址加1
DJNZ&&&&&&& &ByteCnt,R_Byte1&&& 字节接收未完毕则继续
CLR&&&&&&&&&& RST&&&&&&&&&&&&&&& &&&&&&& 逻辑操作完毕清RST
&直流参数表:
主要电参数表:
交流参数表:
电容配置表:
&看不清楚,点击刷新ds1302读出的数据总是0XFF求助! - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
ds1302读出的数据总是0XFF求助!
<div class=""
#include&reg52.h&
#include&intrins.h&
#define& & & & uint unsigned int
#define uchar unsigned char
#define LCD1602_IO P0
sbit rst=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。
sbit sclk=P3^3;
sbit io=P3^2;
sbit&&E=P3^5;//1602的EA
sbit&&RS=P3^7;//1602
void delay_ms(uint a);//毫秒级别延时;
void wr_com(uchar dat);//1602写指令函数;
void wr_dat(uchar dat);//1602写数据函数;
void init_1602(void);//1602初始化函数;
void init();//时钟初始化
void _10zhuan16();//将10进制时间转化成16进制的8421BCD;
void write_byte(uchar a);//DS1302写1个字节函数;
uchar read_byte();//DS1302读一个字节函数;
void write_date(uchar address,uchar date);//正对某个字节写;
uchar read_date(uchar address);//针对某个字节读;
void read_time();//连续读取时间
uchar init_time[7]={12,4,9,6,17,50,30};//初始化时间 年 周 月 日 时 分 秒
uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组
uchar read_address[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读地址数组
void main()
&&init_1602();
&&while(1)
& &&&read_time();
& & & &&&wr_dat('2');
& & & &&&wr_dat('0');
& & & &&&wr_dat(init_time[0]/16+0x30);
& & & &&&wr_dat(init_time[0]%16+0x30);
& & & &&&wr_dat('y');
& & & &&&wr_dat(init_time[2]/16+0x30);
& & & &&&wr_dat(init_time[2]%16+0x30);
& & & &&&wr_dat('m');
& & & &&&wr_dat(init_time[3]/16+0x30);
& & & &&&wr_dat(init_time[3]%16+0x30);
& & & &&&wr_dat('d');
& & & &&&wr_dat(init_time[4]/16+0x30);
& & & &&&wr_dat(init_time[4]%16+0x30);
& & & &&&wr_dat('t');
& & & &&&wr_dat(init_time[5]/16+0x30);
& & & &&&wr_dat(init_time[5]%16+0x30);
& & & &&&wr_com(0x80+0x40);
& & & &&&wr_dat('m');
& & & &&&wr_dat(init_time[6]/16+0x30);
& & & &&&wr_dat(init_time[6]%16+0x30);
& & & &&&wr_dat('s');
& & & &&&wr_dat(init_time[1]+0x30);
& & & &&&wr_com(0x80);
void delay_ms(uint a)//毫秒级别延时;
uchar x,y;
for (a;a&0;a--)
& &for(x=0;x&114;x++)
& & for(y=0;y&1;y++);
void wr_com(uchar dat)//1602写指令函数;
& & & & E=0;
& & & & RS=0;;
& & & & LCD1602_IO=
& & & & E=1; delay_ms(2);
& & & & E=0;delay_ms(2);
void wr_dat(uchar dat)//1602写数据函数;
& & & & E=0;
& & & & RS=1;
& & & & LCD1602_IO=
& & & & E=1;delay_ms(2);
& & & & E=0;delay_ms(2);
void init_1602(void)//1602初始化函数;
& & & & delay_ms(20);
& & & & wr_com(0X38);
& & & & delay_ms(5);
& & & & wr_com(0X38);
& & & & delay_ms(5);
& & & & wr_com(0X01);
& & & & wr_com(0X06);
& & & & wr_com(0X0c);
& & & & wr_com(0X80);
void write_byte(uchar a)//DS1302写1个字节函数;
&&for(i=0;i&8;i++)
& && &sclk=0;
& && &io=(a&&i)&0x01;
& & & && &sclk=1;& & & && &
uchar read_byte()//DS1302读一个字节函数;
&&uchar i,date=0;
&&for(i=0;i&8;i++)
& && &sclk=1;& &
& & & && &if(io==1)
& & & && & {
& & & && && &date|=0x01&&i;
& & & && & }
& & & && &sclk=0;
& &return(date);
void write_date(uchar address,uchar date)//针对某个字节写;
& &rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
& &_nop_();
& &sclk=0;
& &_nop_();
& &_nop_();
& &write_byte(address);
& &write_byte(date);
& &_nop_();
& &sclk=1;
uchar read_date(uchar address)//针对某个字节读;
& &rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
& &_nop_();
& &sclk=0;
& &_nop_();
& &_nop_();
& &write_byte(address);
& &date=read_byte();
& & rst=1;
& &_nop_();
& &sclk=1;
& &return(date);
void _10zhuan16()//将10进制时间转化成16进制的8421BCD
&&uchar i,j=0;
&&for(i=0;i&7;i++)
& & & && &j=init_time[i]/10;
& & & && &init_time[i]=init_time[i]%10+j*16;
void init()//时钟初始化
&&_10zhuan16();
&&write_date(0x8e,0x00);
&&for(i=0;i&7;i++)
&&& & & & {
& && & & && &write_date(write_address[i],init_time[i]);
&&& & & & }
&&write_date(0x8e,0x80);
void read_time()
&&for(i=0;i&7;i++)
& &&&init_time[i]=read_date(read_address[i]);& & & && &
我的液晶上面显示独到的数据总是??,那就是读到的都是0xff,我觉得我的程序不会错啊!那么简单了,会不会是电路错了啊!
14:16:08  
该类别下有 43 个回答。
该类别下有 35 个回答。
该类别下有 27 个回答。
该类别下有 24 个回答。
该类别下有 23 个回答。
该类别下有 23 个回答,其中被选为最佳答案 1 次。
该类别下有 21 个回答。
该类别下有 21 个回答。
该类别下有 19 个回答。
该类别下有 19 个回答。
该类别下有 19 个回答。
该类别下有 19 个回答。
该类别下有 18 个回答。
该类别下有 18 个回答。
该类别下有 17 个回答。
该类别下有 17 个回答。
该类别下有 17 个回答。
该类别下有 16 个回答。
该类别下有 16 个回答。
该类别下有 16 个回答。
是不是你的1302都还在写保护。给e写一个解除写保护的命令;
还有可能是根本没有读到东西
求问下,就是在读数据的时候对他写地址的话,写保护开了,是不是地址也写不进去啊!所以就读不出来
可能根本就没有读到数据,怀疑是电路问题把电路贴上来看一下
按你的程序1602的RW引脚应该接地,不知道电路图怎么样?
我的情况变了我换了个ds1302,以后就有数字了!我是怀疑我之前USB封装画错了!导致电源接反!烧掉过芯片所以就换了个!但是不是我初始化后的时间,就算我把初始化里面的时间改掉了以后!读出的数据还是不变!而且也不会变化!而且我测量了晶振的两个管脚!一个是2.5V一个就是0V,会不会是晶振没有起振啊!
(839.69 KB, 下载次数: 1)
我现在想1602上面有数据了!是不是代表能读出了!至于为什么数值不变会不会我根本没有把数值写进去
而且,芯片也没运行!所以就一直不变!
楼主你的问题解决了吗,我也碰到同一个问题& &
楼主你的问题解决了吗,我也碰到同一个问题
同问& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司}

我要回帖

更多关于 许家印买下FF 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信