谁会读写DS1307,并显示到1602上?

作者&投稿:产亚 (若有异议请与网页底部的电邮联系)
ds1307模块怎么检验好坏~

你好
DS1307 时钟芯片,单纯对模块检验是无法的
除非你有制具通电测试
但这是不实际的

这东西不贵
只能打件之後确认

以上

ds1032更准确

/******************************************************************************************************************************/
/* smally 2008.5.20 南阳师范学院*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^7;
sbit lcden=P2^6;
sbit rtscl=P2^1;
sbit rtsda=P2^2;
sbit da_18b20=P2^0;
uchar code table[]="0123456789";
uchar table1[8];
uchar convert_begin;
uint t_click,tp;
//*****************************************/
//1602操作相关函数
//*****************************************/
void wait() //上电后延时操作,等待各芯片准备好 //avoid error
{
uint i=60000;
while(i>0)i--;
}
void delay() // 操作之间的时间间隔
{
uchar i=200;
while(i>0)i--;
}
void write_com(uchar com) //写命令到1602
{
lcdrs=0;
P0=com;
lcden=1;
delay();
lcden=0;
}
void write_dat(uchar dat) //写数据到1602
{
lcdrs=1;
P0=dat;
lcden=1;
delay();
lcden=0;
}

void init_1602() //初始化1602
{
lcden=0;
write_com(0x01);delay();
write_com(0x80);delay();
write_com(0x38);delay();
write_com(0x0c);delay();
write_com(0x06);delay();
}
//**********************************************
//over
//**********************************************

//********************************************/
//ds1307相关操作函数//传送与接收数据都是先高位
//********************************************/
void rt_delay() //操作延时,等待信号稳定
{
uchar i=10;
while(i>0)i--;
}
void init_1307() //初始化1307
{
rtscl = 1; rt_delay(); rtsda = 1; rt_delay();
}
void start_1307() // 开始信号
{
rtsda = 1; rtscl = 1; rt_delay(); rtsda = 0; rt_delay();
}
void stop_1307() // 结束信号
{
rtsda = 0; rtscl = 1; rt_delay(); rtsda = 1; rt_delay();
}
void write_1307(uchar d ) //写1307
{
uchar i,j; rtscl = 0;
for(i = 0;i < 8; i++)
{
rtsda = (d >> 7);
rtscl = 1;
rt_delay();
d = d << 1;
rtscl = 0;
}
rtsda = 1;
rtscl = 1;
while((rtsda == 1) && (j < 255))j++;
rtscl=0;
}
uchar read_1307(uchar b) //读1307
{
uchar d ,i;
rtsda = 1; rtscl = 0;
for(i = 0; i < 8; i++)
{
rtscl = 1;
rt_delay();
d = d << 1;
d = d | rtsda;
rtscl=0;
}
rtsda = b;
rt_delay();
rtscl = 0;
rtscl = 1;
return d;
}
read_8byte_1307()
{
uchar i;
start_1307( );
write_1307( 0xd0 );
write_1307( 0x00 );
stop_1307( );
for(i = 0;i < 8; i++)
{
start_1307();
write_1307(0xd1);
table1[i]=read_1307(1);
stop_1307();
}
}
//**********************************************
//over
//**********************************************

//**********************************************
//18b20操作相关函数
//**********************************************
void reset_time_18b20() //延时640us
{
uint i;
i=80;
while(i>0)i--;
}

void wrbyte(uchar b) //写一个字节
{
uchar i,j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1;
if(btmp)
{
da_18b20=0;
i++;i++;
da_18b20=1;
i=40; //写1时,15us内拉高数据线,总时间时隙不低于60us
while(i>0)i--;
}
else
{
da_18b20=0;
i=40; //写0时,拉低至少60us
while(i>0)i--;
da_18b20=1;
}
}
}

bit rdbit() //读取18b20的一位
{
uchar i;
uchar b;
da_18b20=0;
i++;i++;i++;i++;i++;
da_18b20=1;
i=10; //上升沿15us后读有效
while(i>0)i--;
b=da_18b20;
i=30;
while(i>0)i--; ///总时间不低于60us
return(b);
}

uchar rdbyte() //读取18b20的一字节
{
uchar i,j,byte;

for(i=1;i<=8;i++)
{
j=rdbit();
byte=(j<<7)|(byte>>1);
}

return(byte);
}

uchar init_18b20() //初始化18b20
{
uint j=0;
da_18b20=0;
reset_time_18b20();
da_18b20=1;
while((da_18b20==1)&&(j<250))j++;
if(da_18b20) return 0;
else
{
while(!da_18b20);
return 1;
}
}

void restore()
{
if(t_click==0)
{
if(init_18b20())
{
ET0=0;
while(ET0); //////////操作命令时关闭中断,以免影响时序
wrbyte(0xcc);//////////skip rom命令
wrbyte(0x44);//////////convert 命令
ET0=1; //////////操作命令后再打开中断
convert_begin=1;
}
}
}

void read_18b20()
{
uchar tplsb,tpmsb;
if(t_click>100)
{
convert_begin=0;t_click=0;
if(init_18b20())
{
ET0=0;
while(ET0); //////////操作命令时关闭中断,以免影响时序
wrbyte(0xcc);//////////skip rom命令
wrbyte(0xbe);//////////读暂存器
tplsb=rdbyte();
tpmsb=rdbyte();
ET0=1; //////////操作命令后再打开中断
tp=tpmsb*256+tplsb;
}
}
}
//**********************************************
//over
//**********************************************

//**********************************************
//1602显示函数
//**********************************************

void display()
{
uint nian;
write_com(0x80);delay();
write_dat('D');delay();write_dat('a');delay();
write_dat('t');delay();write_dat(':');delay();
//显示日期信息
nian=table1[7]/16*10+table1[7]%16;
write_dat('2');delay();
write_dat(table[(table1[6]/100)]);delay();
write_dat(table[(table1[6]%100/10)]);delay();
write_dat(table[(table1[6]%10)]);delay();
//间隔符号'-'
write_dat('-');delay();
//显示月份
write_dat(table[table1[5]/16%2]);delay();
write_dat(table[table1[5]%16]);delay();
//间隔符号'-'
write_dat('-');delay();
//显示日期
write_dat(table[table1[4]/16%4]);delay();
write_dat(table[table1[4]%16]);delay();
//星期
write_dat(' ');delay();
write_dat(table[table1[3]%16]);delay();
//LCD第二行
write_com(0x80+0x40);delay();
write_dat('T');delay();write_dat('i');delay();
write_dat('m');delay();write_dat(':');delay();
//显示小时
write_dat(table[table1[2]/16%4]);delay();
write_dat(table[table1[2]%16]);delay();
//间隔符号'-'
write_dat('-');delay();
//显示分钟
write_dat(table[table1[1]/16%8]);delay();
write_dat(table[table1[1]%16]);delay();
//间隔符号'-'
write_dat('-');delay();
//显示秒
write_dat(table[table1[0]/16%8]);delay();
write_dat(table[table1[0]%16]);delay();
//显示温度
write_dat(' ');delay();
if((tp>>11)==0)
{write_dat('+');delay();
write_dat(table[(tp>>4)/10]);delay();
write_dat(table[(tp>>4)%10]);delay();
}
else
{write_dat('-');delay();
write_dat(table[((~(tp-1))>>4)/10]);delay();
write_dat(table[((~(tp-1))>>4)%10]);delay();
}

}

//**********************************************
//over
//**********************************************

//**********************************************

//main主函数

//**********************************************
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //定时器初始化
EA=1;
ET0=1;
TR0=1;

wait(); //上电前预热
init_1602();
init_1307();
if(init_18b20())
{
ET0=0;
while(ET0); //////////操作命令时关闭中断,以免影响时序
wrbyte(0xcc);//////////skip rom命令
wrbyte(0x4E);//////////写暂存器命令
wrbyte(0x01);//////////设置上限温度
wrbyte(0x00);//////////设置下限温度
wrbyte(0x1f);//////////设置分辨率TM/R1/R0/1/1/1/1/1
wrbyte(0x43);//////////复制暂存器
ET0=1; //////////操作命令后再打开中断

}
start_1307();
write_1307(0xd0);
write_1307(0x00);
write_1307(0x00);
write_1307(0x59);
write_1307(0x12);
write_1307(0x05);
write_1307(0x03);
write_1307(0x07);
write_1307(0x09);
stop_1307();
while(1)
{
restore();
read_18b20();
read_8byte_1307();
display();
}
}

//****************************************************************

//over

//***************************************************************

//***************************************************************

//中断服务子程序

//***************************************************************

void time0() interrupt 1 using 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(convert_begin)t_click++;
}
//****************************************************************

//over

//****************************************************************

//**********************************************that's alll*******************************************************************//


谁会读写DS1307,并显示到1602上?
\/\/ds1307相关操作函数\/\/传送与接收数据都是先高位\/\/***\/void rt_delay() \/\/操作延时,等待信号稳定{ uchar i=10; while(i>0)i--;}void init_1307() \/\/初始化1307{ rtscl = 1; rt_delay(); rtsda = 1; rt_delay();}void start_1307() \/\/ 开始信号{ rtsda = 1; rtscl = 1; rt_delay...

请单片机高手帮忙解决一下ds1307的问题
这是因为你用%d显示的十进制,所以才会这样子,ds1307存储和读取都是BCD码,所以你得需要用%x来显示,也就是通过16进制来显示,这样显示的值才是正确的。

3.3V单片机读取5V工作的ds1307,用I2C读取,电阻上拉要5V还是3.3V?_百度...
使用上拉电阻,是必须的,这中芯片内部是开喽的,,就是用经验来说,使用5V上啦,而且单片机端口需要配置为开喽输出,!!

DS1307的和单片机连接:
DS1307典型接线如图1所示。BT1为备用电池,3V,7脚为方波输出,通常把该脚接到单片机的能够产生电平变化中断的引脚,如设置成每秒输出1个方波,则会每秒中断一次,读取时间用以显示。图1中的R1、R2、R4是必须的上拉电阻。

Tiny RTC I2C模块的DS1307连续读取时间时,有时会死掉,这是什么问题...
IIC总线的时序有问题,看看总线的时钟频率和应答位那里处理的不合适

时钟芯片引言
在当今的电子设计中,串行时钟电路占据着重要地位,其中DS1302、DS1307和PCF8485等型号备受欢迎。这些电路以其简洁的接口、亲民的价格和易用性深受工程师们的青睐。本文将重点介绍一款由DALLAS公司推出的实时时钟芯片DS1302。DS1302是一种集成了涓细电流充电功能的时钟解决方案。其主要特点在于其采用串行数据...

时钟芯片DS1302功能及具体介绍
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器...

树莓派基础实验32:DS1302实时时钟模块实验
平时SCLK保持低电平,当需要写命令或者写数据时,在时钟输出变为高电平之前先输出数据;当需要读数据时,在时钟输出变为高电平之前采样读取数据。    第1步: 连接电路。    第2步: DS1302的Python程序比较复杂,我们先编写一个模块ds1302.py,在里面创建一个类DS1302(),在里面编写读取时钟信息等方法。

时钟电路原理及原理图
用作三线接口时的双向数据线;RST主要提供复位功能,其在数据的读写过程中,必须保持为高电位;GND引脚用于和大地相连。三、时钟电路原理 DS1302的控制字节的最高有效位即位7必须是逻辑1,若该位为0,则不能把该数据写入进DS1302中;位6为1表示存取RAM数据,为0表示存取日历时钟数据;位5至位1表示操作...

通过Internet 远程控制 家庭电气设施
在这里,DS1307作为I2C总线的从器件。I2C总线为同步串行数据传输总线,其内部为双向传输电路,端口输出为开漏结构,因此,需加上拉电阻。2.4MT8880C双音频编解码电路由于单片机是通过MT8880C芯片得到PSTN网络的双音频信号解码输出,也就是说,单片机可以识别来自PSTN网络的控制信号,用户可以根据系统的语音提示进行按键选择以实现...

吐鲁番地区19535434881: 谁会读写DS1307,并显示到1602上? -
单药结合: /******************************************************************************************************************************//* smally 2008.5.20 南阳师范学院*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int sbit lcdrs=P2^7; sbit lcden=P...

吐鲁番地区19535434881: 有源晶振怎么使用?是不是选好了型号,直接焊接? -
单药结合: 有源晶振一般都有个标志,附近的脚是1#脚.从顶部看是逆时针方向数脚的编号,2#脚接地,3#脚振荡输出,4#脚接电源.接DS1307时,将振荡输出脚与DS1307的X1脚相连,DS1307的X2脚悬空.有源晶振使用时要注意电压是否符合.

吐鲁番地区19535434881: 新手求助,如何使用DS模拟蛋白 -
单药结合: 这些数据都是十进制,除10再模10是转换为BCD码供显示. miao=23肯定是十进制23,十六进制表示是0x23程序里面有乘16的操作,这是将BCD码转换为十六进制数,送给DS1302,注意,对于时钟芯片而言,读写都是十六进制格式.

吐鲁番地区19535434881: 简易数字温度计制作(不用单片机) -
单药结合: #include#include #define uchar unsigned char #define uint unsigned int sbit CLK_164=P0^4;//数码管显示控制芯片74LS164时钟引脚 sbit DTAT_164=P0^5;//数码管显示控制芯片74LS164 AB sbit CS=P1^5;//AD转换 sbit CLK=P1^2;//AD转换 ...

吐鲁番地区19535434881: Arduino 1602如何添加Wire这个头文件 -
单药结合: 开个 google 翻译,或者 必应翻译 最多1~2钟就能看懂.给你一个 DS1307 的例子. 前提是DS1307 内已经有设好了时间. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ...

吐鲁番地区19535434881: ds1307时钟芯片中文资料 -
单药结合: 以AT89S52单片机为控制核心,通过实时时钟芯片DS1307和数字温度传感器DS18B20构成了一个多功能的数字时钟系统.详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计.系统采用液晶LCD1602作为显示器,具有实时时间与日历显示、环境温度显示、按键调时、闹铃定时等功能.软件程序采用均采用C语言编写,便于移植与升级.下载地址: http://share.dzkf.cn/down/2008/0203/file_897.html不过要用点数的 1点 呵呵 你去想办法挣分去吧

吐鲁番地区19535434881: Sun Fire V240出现如下提示,怎么解决该硬件问题?
单药结合: DS1307是低功耗、两线制串行读写接口、日历和时钟数据按BCD码存取的时钟/日历芯片.它提供秒、分、小时、星期、日期、月和年等时钟日历数据. TOD(Time Of Data) 实时时间常数(16/32位),

吐鲁番地区19535434881: ds1302是怎么个工作过程,怎么把当前时间赋给它,又是怎样通过控制段选、位选来显示ds1302写入的时间? -
单药结合: 首先、你要写一个读字节函数(根据1302的读写时序);其次、你要知道时、分、秒等寄存器的地址,给它们宏定义了;然后、你就可以根据原先定义好的读函数来读取当前时间寄存器中的数据了(也就是把时、分、秒等读取出来);最后、做数据处理就可以拿来显示了.不知楼主是否可以给分了……

吐鲁番地区19535434881: 电脑的CPU主板上装有纽扣电池我可以理解. 但为什么我买的51单片机的板子上装有3V的纽扣电池? -
单药结合: 看看板子上,电池旁边是不是有个8脚芯片,ds1302 或者ds1307,这两个是时钟芯片,需要电池保存时间和断电继续走时的,这...

吐鲁番地区19535434881: DS1302是不是和1602一样要进行读操作和写操作,方法是否一样?若要修改时间是不是修改DS1302中的数据? -
单药结合: DS1302要进行读写操作,而LCD1602一般只要写就行,如果你要读1602的寄存器的话也可用到读操作.修改时间是要往DS1302的寄存器中写入要修改的时间值,再送入LCD1602显示.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网