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

2024-11-16 17:32:18
推荐回答(2个)
回答(1):

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);

} }
打字不易,如满意,望采纳。

回答(2):

明显死机了。程序问题