关于ds1302的问题(比较冗长)

2019-07-15 21:23发布

本帖最后由 harryrobot 于 2013-12-8 22:44 编辑

大家好,最近在搞ds1302,但是被困扰了。
我先说说自己的意图:
由于对寄存器的了解不是很多,所以希望通过51逐一地往ds1302中写入和读出。我写了一个程序,期望是写入0x18(秒),并读出0x18,把这个结果放在P2口上以便用led来观察(然后循环上述)。但实际的情况是读出了0x02。
我手头有一个arduino的板子,我从网上down了一个ok的程序,运行结果正确,我用万用表量32.768那个晶振两端分别是2.5V左右;而我量我自己用51做的那个,晶振两端电压一个是0,一个是5V,我怀疑是这个晶振根本没有起振。
以下附上我的程序,请大家指点,万分感谢。(因为在arduino上是ok的,所以可以判定不是硬件的问题)
  1. #include <reg51.h>
  2. sbit RST=P1^7;  //yellow
  3. sbit IO =P1^6;  //green
  4. sbit SCLK=P1^5; //blue
  5. int i;
  6. int j;
  7. int result;           //缓存
  8. int address;
  9. void write_address(); //写地址 (控制字)
  10. void read_address();  //读地址 (控制字)
  11. void write_byte();        //写数据
  12. void read_byte();        //读数据
  13. void delay(unsigned int i);   //1ms


  14. void delay(unsigned int i)
  15. {
  16.    unsigned int j;
  17.    while(i--)
  18.    {for(j=0;j<125;j++);}
  19. }
  20. void write_address()
  21. { address=0x80;          //写秒地址
  22.    for(i=0;i<8;i++)
  23.    {
  24.     SCLK=0;
  25.     delay(1);
  26.         IO=address & 1;
  27.         SCLK=1;
  28.     delay(1);
  29.         address=address >> 1;
  30.    }
  31. }
  32. void read_address()
  33. { address=0x81;          //读秒地址
  34.   for(i=0;i<8;i++)
  35.   {
  36.    SCLK=0;
  37.    delay(1);
  38.    IO=address & 1;
  39.    SCLK=1;
  40.    delay(1);
  41.    address=address >> 1;
  42.   }
  43. }
  44. void write_byte()
  45. {  address=0x18;        //写入18
  46.    for(i=0;i<8;i++)
  47.    {
  48.     SCLK=1;
  49.     delay(1);
  50.         IO=address & 1;
  51.         SCLK=0;
  52.     delay(1);
  53.         address=address >> 1;

  54.    }
  55. }
  56. void read_byte()
  57. {  result=0;
  58.    for(i=0;i<8;i++)
  59.    {
  60.    SCLK=1;
  61.    delay(1);
  62.    SCLK=0;
  63.    delay(1);
  64.    if(IO == 1) result++ ;
  65.    SCLK=0;
  66.    delay(1);
  67.    result=result << 1;
  68.    }
  69. }
  70. void main()
  71. {
  72. while(1)
  73.   {
  74.    RST=0;
  75.    delay(1);
  76.    RST=1;
  77.    write_address();
  78.    write_byte();
  79.    RST=0;                   //写


  80.    RST=0;
  81.    delay(1);
  82.    RST=1;
  83.    read_address();
  84.    read_byte();
  85.    RST=0;
  86.    P2=result;           //读出秒的结果放在P2
  87.    delay(10);           //读
  88.   }
  89. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。