ds1302时钟芯片。。。谁给我看下这个程序?液晶可以显示,但是时钟不会走显示的也不是我初始化的时间。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ds1302时钟芯片。。。谁给我看下这个程序?液晶可以显示,但是时钟不会走显示的也不是我初始化的时间。相关的知识,希望对你有一定的参考价值。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigend int
sbit clk=P3^6;
sbit ce=P3^5;
sbit io=P3^4;
sbit acc0=ACC^0;
sbit acc7=ACC^7;
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcden=P2^7;
uchar a[]="0123456789";
uchar a1[]="-";
void write_8bit(uchar ds)//写入8位数据

uchar i;
ACC=ds;
for(i=0;i<8;i++)

io=acc0;
clk=1;
clk=0;
ACC=ACC>>1;


uchar read_8bit(void) //读出8位数据

uchar i,DS;
for(i=0;i<8;i++)

acc7=io;
clk=1;
clk=0;
ACC=ACC>>1;

DS=ACC;
return (DS);

void write_1302(uchar add,uchar dat) //给1302写信息

ce=0;
clk=0;
_nop_();
ce=1;
write_8bit(add);
write_8bit(dat);
ce=0;
clk=1;

uchar read_1302(uchar add) //从1302读信息

uchar dat;
ce=0;
clk=0;
_nop_();
ce=1;
write_8bit(add);
dat=read_8bit();
ce=0;
clk=1;
return (dat);

void init_1302() //初始化ds1302

write_1302(0x8e,0x00);
write_1302(0x80,0x00);
write_1302(0x82,0x00);
write_1302(0x84,0x00);
write_1302(0x86,0x13);
write_1302(0x88,0x04);
write_1302(0x8a,0x02);
write_1302(0x8c,0x0b);
write_1302(0x8e,0x10);

/****************************************/
//1602液晶显示程序
void delay(uchar z)

uchar x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);

void write_add(uchar add)

rs=0;
rw=0;
lcden=0;
P0=add;
delay(1);
lcden=1;
delay(2);
lcden=0;

void write_dat(uchar dat)

rs=1;
rw=0;
lcden=0;
P0=dat;
delay(1);
lcden=1;
delay(2);
lcden=0;

void init_1602()

lcden=0;
write_add(0x38);
write_add(0x0c);
write_add(0x06);
write_add(0x01);
write_add(0x80);//从80处开始显示

/********************************************/
void main()

uchar miao,miaoh,miaol;
uchar fen,fenh,fenl;
uchar shi,shih,shil;
//uchar day;
//uchar ri,rih,ril;
//uchar yue,yueh,yuel;
//uchar nian,nianh,nianl;
init_1302();
init_1602();
while(1)

miao=read_1302(0x81);
miaoh=miao/10;
miaol=miao%10;
fen=read_1302(0x83);
fenh=fen/10;
fenl=fen%10;
shi=read_1302(0x85);
shih=shi/10;
shil=shi%10;
write_add(0x80);
write_dat(a[shih]);
write_dat(a[shil]);
write_dat(a1[0]);
write_dat(a[fenh]);
write_dat(a[fenl]);
write_dat(a1[0]);
write_dat(a[miaoh]);
write_dat(a[miaol]);

1、存储和读取的时间的内容应为BCD码。write_1302(0x8c,0x11);maioh=(miao&0x7f)>>4;……
2、建议上电后,ce=0;clk=0;延时一会儿再操作1302。或者多写两次撤销写保护命令。
write_1302(0x8e,0x10);笔误,应该是 write_1302(0x8e,0x80);
3、建议读写1302的clk速率降低,如datasheet,2MHz最大。
4、建议首次改写时间时,将秒值最高位置为1,时间设置完毕后,清秒值最高位。
5、建议,刷新LCD速率在100mS~500mS。没有必要不停地读1302,写1602。
6、检查硬件连接,及起振晶体。或更换一片1302再看看。
最后调试成功,请告知原因。谢谢!
参考技术A void write_8bit(uchar ds)//写入8位数据

uchar i;
ACC=ds;
for(i=0;i<8;i++) 应改为for(i=8;i>0;i--)
参考技术B s);
Write_Ds1302_Byte(dat);
这两个函数是网DS1302中写地址和数据的,根据DS1302的时序,可以看明白顺序。
参考技术C s);
Write_Ds1302_Byte(dat);
这两个函数是网DS1302中写地址和数据的,根据DS1302的时序,可以看明白顺序。

51单片机对DS1302(实时时钟芯片)的仿真

51单片机对DS1302(实时时钟芯片)的仿真

  • 仿真效果
    在这里插入图片描述

  • 源代码

#include <reg51.h>
#include <intrins.h>  //因为要调用nop函数,所以添加了这个库NOP,延时作用
sbit RS=P3^0;    //NOP指令本身的含义是空操作,即此时CPU什么也不做,仅仅是等待,直到下一个机器周期的到来。
sbit RW=P3^1;
sbit E=P3^2;
sbit T_RST=P3^3;
sbit T_CLK=P3^4;
sbit T_IO=P3^5;
unsigned char datechar[]={"DATE:"};
unsigned char timechar[]={"TIME:"};
unsigned char datebuffer[10]={0x32,0x30,0,0,0x2d,0,0,0x2d,0,0};//0x32表示2,0x30表示0,0x2d表示—
unsigned char timebuffer[8]={0,0,0x3a,0,0,0x3a,0,0};//0x3a表示:
unsigned char weekbuffer={0x30};

void  WriteB(unsigned char  dat)//单字节写
{ 
   unsigned char  i;
   for(i=8; i>0; i--)
  {
        T_IO=dat&0x01;
        T_CLK = 1;
        T_CLK = 0;
        dat = dat >> 1; 
   } 
}

unsigned char  ReadB(void) //单字节读
{ 
	unsigned char i,readdat=0;
	for(i=8; i>0; i--)
	{
		readdat=readdat>>1;
		if(T_IO)
		{
			readdat|=0x80;
		}
		T_CLK = 1;
		T_CLK = 0;            
	} 
	return(readdat); 
}

void  W1302(unsigned char address,unsigned char dat)
{
	T_RST = 0;
	T_CLK = 0;
	_nop_();
	_nop_();
	T_RST = 1;
	_nop_();
	_nop_();
	WriteB(address);         
	WriteB(dat);           
	T_CLK = 1;
	T_RST =0;
} 

unsigned char  R1302(unsigned char  address)//上面的是DS1302的函数
{
	unsigned char dat=0;
	T_RST = 0;
	T_CLK = 0;
	T_RST = 1;
	WriteB(address);           
	dat = ReadB();           
	T_CLK = 1;
	T_RST =0;
	return(dat);
}

void delay(unsigned int n)//延时函数
{
  unsigned i=0,j=0;
	for(i=0;i<n;i++)
	{
	  for(j=0;j<120;j++);
	}
}
void writedat(unsigned char dat)//写数据函数lcd的下面这些函数
{
  RS=1;  //  RS:数据/命令选择端
	RW=0;  //  R/W :读/写选择端 
	E=0;   //  使能端:下降沿有效 
	P2=dat;
	delay(5);
	E=1;
	E=0;
}

void writecom(unsigned char com)//写命令函数 
{
  RS=0;  //  RS:数据/命令选择端 
	RW=0;  //  R/W :读/写选择端  
	E=0;   //使能端:下降沿有效 
	P2=com;
	delay(5);
	E=1;
	E=0; 
}
void initlcd()//初始化LCD1602
{
  writecom(0x38);  //0x38;设置16×2显示
	writecom(0x0c);  //0x0C:设置开显示,不显示光标
	writecom(0x06);  //0x06:写一个字符后地址指针加1
	writecom(0x01);  //0x01:显示清0,数据指针清0
}


void display()//显示函数
{
	int i=0,temp=0;
	temp=R1302(0x8d);  //读年
	datebuffer[2]=0x30+temp/16;
	datebuffer[3]=0x30+temp%16;
	
	temp=R1302(0x8b);  //读星期
	weekbuffer=0x30+temp;
	
	temp=R1302(0x89);  //读月
	datebuffer[5]=0x30+temp/16;
	datebuffer[6]=0x30+temp%16;
	
	temp=R1302(0x87);  //读日
	datebuffer[8]=0x30+temp/16;
	datebuffer[9]=0x30+temp%16;
	
	temp=R1302(0x85);  //读时
  temp=temp&0x7f;
	timebuffer[0]=0x30+temp/16;
	timebuffer[1]=0x30+temp%16;
	
	temp=R1302(0x83);  //读分
	timebuffer[3]=0x30+temp/16;
	timebuffer[4]=0x30+temp%16;
	
	temp=R1302(0x81);  //读秒
	temp=temp&0x7f;
	timebuffer[6]=0x30+temp/16;
	timebuffer[7]=0x30+temp%16;
	
	writecom(0x80);  //0x80:LCD第一行的起始地址
	for(i=0;i<5;i++)
	{
	  writedat(datechar[i]);
	}
	writecom(0xc0);
	for(i=0;i<5;i++)
	{
	  writedat(timechar[i]);
	}
	
	writecom(0x86);//显示日历
	for(i=0;i<10;i++)
	{
	  writedat(datebuffer[i]);
	}
	writecom(0xc6);//显示时间
	
	for(i=0;i<8;i++)
	{
	  writedat(timebuffer[i]);
	}
	writedat(' ');
	writedat(weekbuffer);//显示星期
}


void main()
{
	initlcd();
	W1302(0x8e,0);   //打开写保护
	W1302(0x8c,0x21);//打开年,BCD码
	W1302(0x8a,0x04);//写入星期
	W1302(0x88,0x07);//写入月
	W1302(0x86,0x15);//写入日
	W1302(0x84,0x22);//写入时
	W1302(0x82,0x42);//写入分
	W1302(0x80,0x30);//写入秒
	W1302(0x8e,0x80);//关闭写保护
	while(1)
	{
	  display();
	}
}

以上是关于ds1302时钟芯片。。。谁给我看下这个程序?液晶可以显示,但是时钟不会走显示的也不是我初始化的时间。的主要内容,如果未能解决你的问题,请参考以下文章

电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真

51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真

DS12C887,DS1302,DS3231时钟芯片那个精度比较高?

DS12C887,DS1302,DS3231时钟芯片哪个精度比较高

4.7 51单片机-DS1302 实时时钟芯片