找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
打印 上一主题 下一主题
收起左侧

ds1302通信求助帖

[复制链接]
跳转到指定楼层
楼主
ID:1159713 发表于 2025-9-1 23:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近在看江协科技的视频学习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;
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表