亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 712|回復: 1
打印 上一主題 下一主題
收起左側

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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1159713 發表于 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);
        }
}

發帖的時候忘改了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表