标题: ds1302通信求助帖 [打印本页]

作者: pacman    时间: 2025-9-1 23:09
标题: ds1302通信求助帖
本人最近在看江协科技的视频学习51单片机,但在使用ds1302实时时钟时遇到了问题:
芯片型号:STC89C52RC
问题描述:在使用ds1302和mcu进行通信时遇到时序问题(大概),具体表现为:在mcu读取数据之前io口不置0,则通过串口通信接收到的数据总会间隔一个出现一次0x7F(此次通信IO口接收到的一直为1),代码如下:

main.c文件
#include <REGX52.h>
#include "ds1302.h"
#include "Delay.h"
#include "serial.h"

void main()
{
        unsigned char timer = 0x00;
        uart_init();
       
        DS1302_Write(0x8E, 0x00);
        DS1302_Write(0x80, 0x03);
       
        CE = 0;
        Delay_Microsecond(2);
        SCLK = 0;
        Delay_Microsecond(2);
        CE = 1;
        Delay_Microsecond(2);
       
        DS1302_Write_Byte(0x81);

        while(1)
        {
                timer = DS1302_Read_Byte() & 0x7F;
                uart_transmit(timer);
        }
}

ds1302.c文件
#include <REGX52.h>
#include "Delay.h"

sbit SCLK = P3^6;
sbit CE = P3^5;
sbit IO = P3^4;

void DS1302_Write_Byte(unsigned char command)
{
        unsigned char i = 0;
       
        for(i = 0; i < 8; i++)
        {
                IO = command & 0x01;
                Delay_Microsecond(2);
                SCLK = 0;
                Delay_Microsecond(2);
                SCLK = 1;

                command >>= 1;
        }
}

void DS1302_Write(unsigned char command, unsigned char control)
{
       
        CE = 0;
        Delay_Microsecond(2);
        SCLK = 0;
        Delay_Microsecond(2);
        CE = 1;
        Delay_Microsecond(2);
       
        DS1302_Write_Byte(command);
        DS1302_Write_Byte(control);
       
        CE = 0;
}


unsigned char DS1302_Read_Byte()
{
        unsigned char i = 0;
        unsigned char time = 0x00;
       
        //IO = 0;
        for(i = 0; i < 8; i++)
        {
                SCLK = 1;
                Delay_Microsecond(2);
                SCLK = 0;
                Delay_Microsecond(2);

                if(IO)
                        time |= (0x01 << i);
        }
       
        return time;
}


unsigned char DS1302_Read(unsigned char command)
{       
        unsigned char time = 0x00;
       
        CE = 0;
        Delay_Microsecond(2);
        SCLK = 0;
        Delay_Microsecond(2);
        CE = 1;
        Delay_Microsecond(2);
       
        DS1302_Write_Byte(command);
        time = DS1302_Read_Byte();
       
        CE = 0;
        return time;
}

Delay文件
#include "Delay.h"
#include <intrins.h>

void Delay(unsigned int xms)        //@11.0592MHz
{
        unsigned char data i, j;


        while(xms--)
        {
                _nop_();
                i = 2;
                j = 199;
       
                do
                {
                        while (--j);
                } while (--i);
        }
               
}

void Delay_Microsecond(unsigned char i)
{
        while(i--)
                _nop_();
}

serial.c文件
#include <regx52.h>
#include "serial.h"

void uart_init()
{
  PCON &= 0x0F;
        SCON = 0x50;
       
        TMOD &= 0x0F;
        TMOD |= 0x20;

        TL1 = 0xFD;
        TH1 = 0xFD;
       
        EA = 0;
        TI = 0;
        RI = 0;
        TR1 = 1;
}


void uart_transmit(unsigned char byte)
{
        SBUF = byte;
        while(!TI);
        TI = 0;
}






作者: pacman    时间: 2025-9-1 23:15
主函数如下:
#include <REGX52.h>
#include "ds1302.h"
#include "Delay.h"
#include "serial.h"

void main()
{
        unsigned char timer = 0x00;
        uart_init();
       
        DS1302_Write(0x8E, 0x00);
        DS1302_Write(0x80, 0x09);

        while(1)
        {               
                timer = DS1302_Read(0x81) & 0x7F;
                uart_transmit(timer);
        }
}

发帖的时候忘改了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1