最近在做DS1302的单片机程序,写好了但老是出错,不论怎么改都显示85,这是我写的程序,麻烦高手检查下
voidwrite_ONE_BYTE(ucharz)//DS1302,写一字节{uchari;for(i=0;i<8;i++){slk=0;io=((bit)z&0x01...
void write_ONE_BYTE(uchar z)//DS1302,写一字节
{
uchar i;
for(i=0;i<8;i++)
{
slk=0;
io=((bit)z&0x01);
slk=0;
slk=1;
delay2us();
z=z>>1;
}
slk=0;
}
uchar read_ONE_BYTE()//DS1302,读一字节
{
uchar i,byte=0;
io=1;
for(i=0;i<8;i++)
{
slk=1;
if(io==1)
byte=byte|0x80;
else
byte=byte&0x7f;
slk=1;
slk=0;
byte=byte>>1;
}
return(byte);
}
////////////////////////////////////////////////////////////////DS1302写一字节和读一字节
void write_ds1302(uchar add,uchar dat)//ds1302写底层协议
{
reset=0;
slk=0;
reset=1;
write_ONE_BYTE(add);
write_ONE_BYTE(dat);
slk=0;
reset=0;
}
uchar read_ds1302(uchar add)//ds1302读底层协议
{
uchar BYTE;
reset=0;
slk=0;
reset=1;
write_ONE_BYTE(add);
BYTE=read_ONE_BYTE();
reset=0;
slk=0;
return(BYTE);
}
////////////////////////////////////////DS1302底层协议
void get_time()
{
uchar hourtime,minutetime;
//////////////////定义中间变量
secondtime=read_ds1302(0x81);//读秒16进制
minutetime=read_ds1302(0x83);//读分16进制
hourtime=read_ds1302(0x85);//读时16进制
///////////////////////////////////////////
second=(secondtime/16)*10+secondtime%16;
minute=(minutetime/16)*10+minutetime%16;
hour=(hourtime/16)*10+hourtime%16;
////////////////////////////十六进制转换成十进制
void ds1302_initial()//ds1302初始化
{
uchar i;
reset=0;
for(i=0;i<250;i++)
delay1_6ms();
write_ds1302(0x8e,0x00);//写允许
write_ds1302(0x90,0xaa);//涓流充电
write_ds1302(0x80,0x55);//写入30秒
write_ds1302(0x82,0x30);//写入30分
write_ds1302(0x84,0x05);//写入5小时
write_ds1302(0x8e,0x80);//写禁止
}
void LCD_initial()//LCD初始化
{
uchar i;
dula=0;
wela=0;
lcdrd=1;
write_com72us(0x30);
write_com72us(0x0c);
write_com1_6ms(0x01);
write_com72us(0x80);
for(i=0;i<12;i++)
write_data(table[i]);
}
void main()//主函数
{
uchar a,b,c;
LCD_initial();
ds1302_initial();
while(1)
{
get_time();
write_lcd(0x84,second);
write_lcd(0x82,minute);
write_lcd(0x80,hour);
}
}
看看是写出错了还是读出错了。如果没那是什么错了,LCD122864的我不不写的它能显示出字来,就是DS1302哪出错了麻烦高手看下。 展开
{
uchar i;
for(i=0;i<8;i++)
{
slk=0;
io=((bit)z&0x01);
slk=0;
slk=1;
delay2us();
z=z>>1;
}
slk=0;
}
uchar read_ONE_BYTE()//DS1302,读一字节
{
uchar i,byte=0;
io=1;
for(i=0;i<8;i++)
{
slk=1;
if(io==1)
byte=byte|0x80;
else
byte=byte&0x7f;
slk=1;
slk=0;
byte=byte>>1;
}
return(byte);
}
////////////////////////////////////////////////////////////////DS1302写一字节和读一字节
void write_ds1302(uchar add,uchar dat)//ds1302写底层协议
{
reset=0;
slk=0;
reset=1;
write_ONE_BYTE(add);
write_ONE_BYTE(dat);
slk=0;
reset=0;
}
uchar read_ds1302(uchar add)//ds1302读底层协议
{
uchar BYTE;
reset=0;
slk=0;
reset=1;
write_ONE_BYTE(add);
BYTE=read_ONE_BYTE();
reset=0;
slk=0;
return(BYTE);
}
////////////////////////////////////////DS1302底层协议
void get_time()
{
uchar hourtime,minutetime;
//////////////////定义中间变量
secondtime=read_ds1302(0x81);//读秒16进制
minutetime=read_ds1302(0x83);//读分16进制
hourtime=read_ds1302(0x85);//读时16进制
///////////////////////////////////////////
second=(secondtime/16)*10+secondtime%16;
minute=(minutetime/16)*10+minutetime%16;
hour=(hourtime/16)*10+hourtime%16;
////////////////////////////十六进制转换成十进制
void ds1302_initial()//ds1302初始化
{
uchar i;
reset=0;
for(i=0;i<250;i++)
delay1_6ms();
write_ds1302(0x8e,0x00);//写允许
write_ds1302(0x90,0xaa);//涓流充电
write_ds1302(0x80,0x55);//写入30秒
write_ds1302(0x82,0x30);//写入30分
write_ds1302(0x84,0x05);//写入5小时
write_ds1302(0x8e,0x80);//写禁止
}
void LCD_initial()//LCD初始化
{
uchar i;
dula=0;
wela=0;
lcdrd=1;
write_com72us(0x30);
write_com72us(0x0c);
write_com1_6ms(0x01);
write_com72us(0x80);
for(i=0;i<12;i++)
write_data(table[i]);
}
void main()//主函数
{
uchar a,b,c;
LCD_initial();
ds1302_initial();
while(1)
{
get_time();
write_lcd(0x84,second);
write_lcd(0x82,minute);
write_lcd(0x80,hour);
}
}
看看是写出错了还是读出错了。如果没那是什么错了,LCD122864的我不不写的它能显示出字来,就是DS1302哪出错了麻烦高手看下。 展开
3个回答
展开全部
如果你是硬件做好了,出了这个问题,那你首先需要检查你的sclk和i/o有没有接反。如果这个没有问题,那么你需要着重检查下你的DS1302芯片的VCC2脚的对地电压(4脚是GND,1脚是VCC2)如果这个电压在4.6V以下,那么你的DS1302很可能不能正常工作,虽然在DS1302的介绍资料上这个芯片的工作电压是2.0~5.5V,但是实测发现4.6V以下这块芯片是无法正常工作的,我跟LZ遇到的也是相同的情况,最后使用稳压电源供给DS1302 VCC24.7V的电压以后,该芯片正常工作,调回到4.6以下后,又不正常了,可见这块芯片对电压的要求非常高,希望LZ能够使用正常!
展开全部
你的数转换好象错了吧,DS1302读出的是BCD码,不是16进的
secondtime=read_ds1302(0x81);//读秒
second=(secondtime>>4)*10+secondtime & 0x0F;转换成10进
还有 ds1302初始化 秒写0才能启到DS1302
secondtime=read_ds1302(0x81);//读秒
second=(secondtime>>4)*10+secondtime & 0x0F;转换成10进
还有 ds1302初始化 秒写0才能启到DS1302
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-04-15
展开全部
你可以没启动Ds1302工作,好想没启动时秒的最高位是1所以十位会现实8
追问
那怎么启动DS1302工作,指令好像没啊
追答
write_ds1302(0x80,0x00);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询