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-(i10);
b=ResultTemperatureLH/10;
write_com(0x9D);
write_data(i|0x30);
write_data(j|0x30);
write_data(0x2E);
write_data(b|0x30);
} }
不知道你对硬件是否熟悉,一般即使不写程序,直接给其供电LCD1602也可以显示(背光点亮,第一行全部显示)。你这个连背光都不亮,肯定是硬件有问题用万用表测试一2315脚下5V供电是否正常116脚是否可靠接地
应该延时不够精确引起,不知道你用的是什么型号单片机,DS18B20延时要求很严格,不同单片机执行后延时不同的,而DS18B20要求的延时差一点点就会出现各种奇怪问题,慢慢调整延时试试吧
以上就是关于我用DS1302+LCD1602+单片机制作的的电子钟,可以显示,但是时间不会走,而且显示出来的是乱的全部的内容,包括:我用DS1302+LCD1602+单片机制作的的电子钟,可以显示,但是时间不会走,而且显示出来的是乱的、LCD1602液晶显示问题(数字钟。DS1302时钟芯片)、用lcd1602显示DS18B20的 温度,为什么温度值一直是25.5度,然而改了定义类型,就变成15.9度,急求解答。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)