标题:
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