森狼藤野 2024-07-31 17:52 采纳率: 63.6%
浏览 14
已结题

51单片机ds1302读取数据不正常


#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
sbit DSL302_IO=P3^4;
sbit DSL302_CE=P3^5;
sbit DSL302_SCLK=P3^6;
void test()
{
    DSL302_CE=0;
    DSL302_SCLK=0;
}

void write(unsigned char byte,date)
{
    char  i=0;
    DSL302_CE=1;
    for(i=0;i<8;i++)   //操作指令
    {
        DSL302_IO=byte&(0x01<<i);    //DSL302_IO 可以看做逻辑位  如果为0,则为0,不为0则为1
        DSL302_SCLK=1;
        DSL302_SCLK=0;
    }    

  for(i=0;i<8;i++)   //操作数据
    {
        DSL302_IO=date&(0x01<<i);    //DSL302_IO 可以看做逻辑位  如果为0,则为0,不为0则为1
        DSL302_SCLK=1;
        DSL302_SCLK=0;
    }    
        DSL302_CE=0;
}

unsigned char read(unsigned char byte)
{
    char i;
    char FK=0x00;
    DSL302_CE=1;
    for(i=0;i<8;i++)  //操作指令
    {
        DSL302_IO=byte&(0x01<<i);    //DSL302_IO 可以看做逻辑位  如果为0,则为0,不为0则为1
        DSL302_SCLK=0;
        DSL302_SCLK=1;
    }    
        
    for(i=0;i<8;i++)   //操作数据
    {
        DSL302_SCLK=1;
        DSL302_SCLK=0; //读出数据
        if(DSL302_IO)  //10000001  //逻辑判断  将数据读取出来   
    {                                                         
            FK|=(0x01<<i);    //00000000|00000001=00000001   00000001|10000000=10000001
        }
    }    
    DSL302_CE=0;
    return FK;
    
}

unsigned char second,min;
void main()
{
  
 LCD_Init();
 test();
 write(0x8E,0x00); 
 write(0x80,0x55);  //写秒
 write(0x82,0x55);  //写分钟
 while(1)
 {
    second=read(0x81); //读秒  
    min=read(0x83);    //读分钟
    LCD_ShowNum(2,4,second/16*10+second%16,2);  //显示秒
    LCD_ShowNum(2,1,min/16*10+ min%16,2); //显示分钟
    Delay(500);  //延迟500ms
 }
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/98e28db458ae4c3698b4efd436b6566b.jpeg "#left")

显示屏上分钟一直显示65,正常是应该小于60,秒满60,分钟加一

  • 写回答

1条回答 默认 最新

  • 森狼藤野 2024-07-31 17:57
    关注

    img

    评论

报告相同问题?

问题事件

  • 系统已结题 8月8日
  • 修改了问题 7月31日
  • 修改了问题 7月31日
  • 修改了问题 7月31日
  • 展开全部