我用DS1302+LCD1602+单片机制作的的电子钟,可以显示,但是时间不会走,而且显示出来的是乱的

单片机和时钟芯片都是正常工作的
显示的数据如图所示,仿真是完全正常的

DS1302的数据显示存在16进制转换的问题,这个要特别注意。

另外不要随便抄别人的程序,用之前一定要读懂,就是抄也要抄那种有正规注释的程序,这样查找问题比较容易。。

建议你去杜洋的网站去下载一段标准的代码使用。。

下面只是一部分。。

/**************** DS1302 *************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2008年9月11日23时59分35秒星期四)*/
write_clock(0x8e,0x00);//允许写操作

write_clock(0x8c,0x08);//08年
write_clock(0x8a,0x04);//星期
write_clock(0x88,0x09);//月
write_clock(0x86,0x11);//日
write_clock(0x84,0x23);//小时
write_clock(0x82,0x59);//分钟
write_clock(0x80,0x35);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8c,0x08);//重启

write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}

/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
if(read_clock(0x8d) != yy){
yy = read_clock(0x8d);
write_com(0x90);
hzkdis("20");
write_com(0x91);
write_data((yy/16)+0x30);
write_data(yy%16+0x30);
write_com(0x92);
hzkdis("年");

} }
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
if(read_clock(0x89) != mo){
mo = read_clock(0x89);
write_com(0x93);
write_data((mo/16)+0x30);
write_data(mo%16+0x30);
write_com(0x94);
hzkdis("月");
lcm_w_yy();//刷新 日

} }
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
if(read_clock(0x87) != dd){
dd = read_clock(0x87);
write_com(0x95);
write_data((dd/16)+0x30);
write_data(dd%16+0x30);
write_com(0x96);
hzkdis("日");
lcm_w_mo();//刷新 小时

} }
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
unsigned char sel;
if(read_clock(0x8b) != xq){
write_com(0x88);
hzkdis("星期");
xq = read_clock(0x8b);
sel = xq%16; //字节低4位的BCD码放入sel
write_com(0x8a);//写入指定区域
if(sel==7) {hzkdis("日");} //
if(sel==6) {hzkdis("六");} //
if(sel==5) {hzkdis("五");} //
if(sel==4) {hzkdis("四");} //
if(sel==3) {hzkdis("三");} //
if(sel==2) {hzkdis("二");} //
if(sel==1) {hzkdis("一");} //星期一

} }

/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
if(read_clock(0x85)!=hh){
hh = read_clock(0x85);
write_com(0x8c);
write_data((hh/16)+0x30);
write_data(hh%16+0x30);
lcm_w_dd();//刷新 分钟
lcm_w_xq();//刷新 分钟

} }
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
if(read_clock(0x83)!=mm){
mm = read_clock(0x83);
write_com(0x8d);
write_data(0x3a); //":"
write_data((mm/16)+0x30);
write_data(mm%16+0x30);
write_data(0x3a); //":"
lcm_w_hh();//刷新 秒

} }
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
if(read_clock(0x81)!=ss){
ss = read_clock(0x81); //更新数据
write_com(0x8f); //秒值在LCM上的写入位置
write_data((ss/16)+0x30); //写十位
write_data(ss%16+0x30); //写个位
lcm_w_mm();//刷新 秒

LED=~LED;

/*********DS18B20************************************************************/
Read_18B20();
write_com(0x30); //选择8bit数据流
i=ResultTemperatureH/10;
j=ResultTemperatureH-(i*10);
b=ResultTemperatureLH/10;

write_com(0x9D);
write_data(i|0x30);
write_data(j|0x30);
write_data(0x2E);
write_data(b|0x30);

} }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-23
时间不走,一般是1302接的晶振未起振。
如果程序没错的话,出现乱码一般是接触不良,可以拿起来紧一下再试试,用洞洞板做电路很容易出现这个问题。追问

已经确定是程序问题了,但是不知道改哪里

追答

这个设计已经很成熟了,照网上成功的方案做就可以了~~~

第2个回答  2011-05-23
这说明你的读取时序是错的,你调整下你的延时或者读取时序可以了。追问

我不会写程序,我的程序从网上载下来改的,你能帮我看一下吗?

第3个回答  2011-05-23
我以前也做过,当时的问题是51复位电路没接好,所以每次都要上电后复位一次。
如果你不是的话,估计就是读值没读出来。或者你的代表时间标量没有设置成全局变量。
第4个回答  2011-05-23
这种问题,我来帮你速度搞定追问

请问具体应该会是哪些问题呢?

追答

程序有问题

相关了解……

你可能感兴趣的内容

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