论坛风格切换切换到宽版
  • 4635阅读
  • 6回复

ds1302时钟芯片终于调试好了 [复制链接]

上一主题 下一主题
离线bd9cr
 
发帖
1202
只看楼主 倒序阅读 0楼 发表于: 2007-09-30
diy好了一个用cw报时的时钟。感觉不好,是因为51的耗电还是很大,大概要有10到20ma。用电池也就能用几个星期到一个月。
而芯片1302整个耗电小于300na。
na这个单片还真的不常见。我想应该能推出了,毫米,微米,纳米,应该对应的是毫安,微安,纳安。每个单位之间应该是3个数量级。这样1ma=1000ua=1000000na
300na=0.0003ma
用1000mah的电池我算了一下理论上能用300多年,乖乖到那时候我都根屁着凉了。
看到它在省电方面的诱惑,我打算研究它的使用方法。
看了n编资料后发现这东西挺复杂的好多时序的东西对我菜鸟来说难了点。2.5买了一个1302,晕回来才发现没有买晶体。只好拆了一个电子表,把晶体拆掉。
参考书上的程序,加上自己的cw报时程序,搞了一下午愣是读出来的妙值是0。
接受以前的教训,搞不好就算出去玩去,不干了,硬干也干不出来。
过了一夜,今天上午接着搞,先看看控制1302的各个单片机io口能不能输出1,写程序让rst口输出1,用表测只有2v左右,看来高电平不够。
加上拉电阻试试,加上拉之后4.5v估计可以了。
把程序从新改好,初始化1302,把妙写零,
按p10就应该报妙。.........一切ok,cw发出3s,再按5s,9s妙不段的在增长。59妙以后就循环了。看来1302正常工作了。
把程序贴一下:
#include<at89x51.h>
#define uchar unsigned char
#define rst p2_4
#define io p2_5
#define clk p2_6
uchar bdata senddata;
uchar second;
unsigned int q;//for循环
sbit highbit=senddata^7;
sbit lowbit=senddata^0;
void send()
{
uchar i;
clk=0;
rst=1;
for(i=0;i<8;i++)
  {
     io=lowbit;
     clk=1;
     senddata=senddata>>1;
     clk=0;
  }
}
void writebyte(uchar address,uchar ch)//address是地址,ch是数据
{
senddata=0x80|(address<<1);
send();
senddata=ch;
send();
rst=0;
}
uchar readbyte(uchar address)//读1302的数据。
{
uchar i;
senddata=0x81|(address<<1);
send();
for(i=0;i<7;i++)
  {
  clk=0;
     highbit=io;
     senddata=senddata>>1;
     clk=1;
     }
clk=0;
highbit=io;
rst=0;
return senddata;
}
//发达的子程序
void da()
{
p2_3=1;
p2_1=1;
for(q=0;q<18000;q++);
p2_3=0;
p2_1=0;
for(q=0;q<6000;q++);
}
//发嘀的子程序
void di()
{
p2_3=1;
p2_1=1;
for(q=0;q<6000;q++);
p2_3=0;
p2_1=0;
for(q=0;q<6000;q++);
}
//发数字的函数,接受了bg4uvr的建议,
void no1()//1
{
di();da();da();da();da();
for(q=0;q<18000;q++);
}
void no2()//2
{
di();di();da();da();da();
for(q=0;q<18000;q++);
}
void no3()//3
{
di();di();di();da();da();
for(q=0;q<18000;q++);
}
void no4()//4
{
di();di();di();di();da();
for(q=0;q<18000;q++);
}
void no5()//5
{
di();di();di();di();di();
for(q=0;q<18000;q++);
}
void no6()//6
{
da();di();di();di();di();
for(q=0;q<18000;q++);
}
void no7()//7
{
da();da();di();di();di();
for(q=0;q<18000;q++);
}
void no8()//8
{
da();da();da();di();di();
for(q=0;q<18000;q++);
}
void no9()//9
{
da();da();da();da();di();
for(q=0;q<18000;q++);
}
void no0()//0
{
da();da();da();da();da();
for(q=0;q<18000;q++);
}
void talk()//报数子程序。把数字放到这里也不错,代码应该是一样的。
{
switch(second)
    {
    case 0:no0();break;
           case 1:no1();break;
           case 2:no2();break;
           case 3:no3();break;
           case 4:no4();break;
           case 5:no5();break;
           case 6:no6();break;
           case 7:no7();break;
           case 8:no8();break;
           case 9:no9();break;
           case 15:da();break;
           }
}
//以下是主程序
void main()
{
uchar temp;
p2=0;
writebyte(7,0);//1302写保护为0
writebyte(0,0);//妙为0,并且开始运行。
while(1)
  {
  if(p1_0==0)//按下p10开始读妙,并用电报报出来
          {
      temp=readbyte(0);//读出妙的值
      second=(temp&0x70)>>4;//把妙的10位搞成各位
                  talk();//报数字
                  second=(temp&0x0f);//妙的个位
                  talk();//报数字
                  }
           }
}
离线bd9cr
发帖
1202
只看该作者 1楼 发表于: 2007-09-30
下一步把调整时间,
报时加上。
研究数码管显示,加数码管。
加备用电池,平时关掉51系统。
需要报时,调整时间,闹铃时再打开51。
这样能充分的省电。
离线BG4UVR
发帖
11288
只看该作者 2楼 发表于: 2007-09-30
如果要省电,可以让单片机工作在掉电状态。按键接在复位上,按一下复位,启动后读取时间,用cw发出,然后掉电,直到下一次按键,再报一次,如此循环。这样可以把平均电流减小得非常多。

设置时间的部分,可以用另一个按键,按住时,按复位键,进入时间设置程序。

看89s51的datasheet,12mhz晶振时,电流25ma,但掉电模式,5.5v供电时,电流可以下降到50ua。
离线bd9cr
发帖
1202
只看该作者 3楼 发表于: 2007-09-30
'
如果要省电,可以让单片机工作在掉电状态。按键接在复位上,按一下复位,启动后读取时间,用cw发出,然后掉电,直到下一次按键,再报一次,如此循环。这样可以把平均电流减小得非常多。
设置时间的部分,可以用另一个按键,按住时,按复位键,进入时间设置程序。
看89s51的datasheet,12mhz晶振时,电流25ma,但掉电模式,5.5v供电时,电流可以下降到50ua。
'
我用的自动建就是10分钟不操作自动建,就进入掉电模式,是用的1000多毫安时的劣质充电电池做为,电源的。
用的2051,长时间不用,比如一个月不用,感觉电池就没有电了,可能是因为电池劣质。
可见单片机的耗电还是厉害的。
电子表就很省电,钮扣电池都能用1年。
离线BG4UVR
发帖
11288
只看该作者 4楼 发表于: 2007-09-30
普通充电电池自放电比较厉害,充满不用,放一个月也差不多了
离线BD0AAI
发帖
3050
只看该作者 5楼 发表于: 2007-10-08
恭喜搂主!!!!!!!!!!!
离线xidongs
发帖
149
只看该作者 6楼 发表于: 2007-10-08
使用普通的cr2032,3v锂电。可以用个一两年。