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();//报数字
}
}
}