关于ds1302的问题(比较冗长)
时间:10-02
整理:3721RD
点击:
大家好,最近在搞ds1302,但是被困扰了。
我先说说自己的意图:
由于对寄存器的了解不是很多,所以希望通过51逐一地往ds1302中写入和读出。我写了一个程序,期望是写入0x18(秒),并读出0x18,把这个结果放在P2口上以便用led来观察(然后循环上述)。但实际的情况是读出了0x02。
我手头有一个arduino的板子,我从网上down了一个ok的程序,运行结果正确,我用万用表量32.768那个晶振两端分别是2.5V左右;而我量我自己用51做的那个,晶振两端电压一个是0,一个是5V,我怀疑是这个晶振根本没有起振。
以下附上我的程序,请大家指点,万分感谢。(因为在arduino上是ok的,所以可以判定不是硬件的问题)
- #include <reg51.h>
- sbit RST=P1^7; //yellow
- sbit IO =P1^6; //green
- sbit SCLK=P1^5; //blue
- int i;
- int j;
- int result; //缓存
- int address;
- void write_address(); //写地址 (控制字)
- void read_address(); //读地址 (控制字)
- void write_byte(); //写数据
- void read_byte(); //读数据
- void delay(unsigned int i); //1ms
- void delay(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {for(j=0;j<125;j++);}
- }
- void write_address()
- { address=0x80; //写秒地址
- for(i=0;i<8;i++)
- {
- SCLK=0;
- delay(1);
- IO=address & 1;
- SCLK=1;
- delay(1);
- address=address >> 1;
- }
- }
- void read_address()
- { address=0x81; //读秒地址
- for(i=0;i<8;i++)
- {
- SCLK=0;
- delay(1);
- IO=address & 1;
- SCLK=1;
- delay(1);
- address=address >> 1;
- }
- }
- void write_byte()
- { address=0x18; //写入18
- for(i=0;i<8;i++)
- {
- SCLK=1;
- delay(1);
- IO=address & 1;
- SCLK=0;
- delay(1);
- address=address >> 1;
- }
- }
- void read_byte()
- { result=0;
- for(i=0;i<8;i++)
- {
- SCLK=1;
- delay(1);
- SCLK=0;
- delay(1);
- if(IO == 1) result++ ;
- SCLK=0;
- delay(1);
- result=result << 1;
- }
- }
- void main()
- {
- while(1)
- {
- RST=0;
- delay(1);
- RST=1;
- write_address();
- write_byte();
- RST=0; //写
- RST=0;
- delay(1);
- RST=1;
- read_address();
- read_byte();
- RST=0;
- P2=result; //读出秒的结果放在P2
- delay(10); //读
- }
- }
不错,,,参考参考..到时我也做个时钟..
看电压 不太可以确定 还是测一下方波比较好。ds1302的数据格式好像是 4位bcd吧