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]);
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时钟芯片那个精度比较高?