📄 main.c
字号:
/*
* DS1302 突发方式,连读,连写
*
*/
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit SCK = P3^5; //时钟
sbit SDA = P3^4; //数据
sbit RST = P1^7; //DS1302复位(片选)
#define DS1302_W_ADDR 0xBE
#define DS1302_R_ADDR 0xBF
uint8 time[7]={50,59,23,15,8,7,10};//秒分时日月周年10-08-15 23:59:50
void delay(uint16 n)
{
while (n--);
}
/**
* 写一个字节
*/
void write_ds1302_byte(uint8 dat)
{
uint8 i;
for (i=0;i<8;i++)
{
SDA = dat & 0x01;
SCK = 1;
dat >>= 1;
SCK = 0;
}
}
/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
uint8 i, dat=0;
for (i=0;i<8;i++)
{
dat >>= 1;
if (SDA)
dat |= 0x80;
SCK = 1;
SCK = 0;
}
return dat;
}
void reset_ds1302(void)
{
RST = 0;
SCK = 0;
RST = 1;
}
/**
* 清除写保护
*/
void clear_ds1302_WP(void)
{
reset_ds1302();
RST = 1;
write_ds1302_byte(0x8E);
write_ds1302_byte(0);
SDA = 0;
RST = 0;
}
/**
* 设置写保护
*/
void set_ds1302_WP(void)
{
reset_ds1302();
RST = 1;
write_ds1302_byte(0x8E);
write_ds1302_byte(0x80);
SDA = 0;
RST = 0;
}
/**
* 设定时钟数据
*/
void set_time(uint8 *timedata)
{
uint8 i, tmp;
for (i=0; i<7; i++) // 转化为BCD格式
{
tmp = timedata[i] / 10;
timedata[i] = timedata[i] % 10;
timedata[i] = timedata[i] + tmp*16;
}
clear_ds1302_WP();
reset_ds1302();
RST = 1;
write_ds1302_byte(DS1302_W_ADDR);
for (i=0; i<7; i++)
{
write_ds1302_byte(timedata[i]);
delay(10);
}
write_ds1302_byte(0);
SDA = 0;
RST = 0;
set_ds1302_WP();
}
/**
* 读时钟数据(BCD格式)
*/
void read_time(uint8 *timedata)
{
uint8 i;
clear_ds1302_WP();
reset_ds1302();
RST = 1;
write_ds1302_byte(DS1302_R_ADDR);
for (i=0; i<7; i++)
{
timedata[i] = read_ds1302_byte();
delay(10);
}
SDA = 0;
RST = 0;
set_ds1302_WP();
}
/**
* UART初始化
* 波特率:9600
*/
void uart_init(void)
{
TMOD = 0x21; // 定时器1工作在方式2(自动重装)
SCON = 0x50; // 10位uart,允许串行接受
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
/**
* UART发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/**
* 将数据转换成ASC码并通过UART发送出去
*/
void UART_Send_Dat(uint8 dat)
{
UART_Send_Byte(dat/16 + '0');
UART_Send_Byte(dat%16 + '0');
}
main()
{
uart_init();
set_time(&time); //设定时间值
while(1)
{
read_time(&time); //秒分时日月周年
UART_Send_Dat(time[6]);
UART_Send_Byte('-');
UART_Send_Dat(time[4]);
UART_Send_Byte('-');
UART_Send_Dat(time[3]);
UART_Send_Byte(' ');
UART_Send_Dat(time[2]);
UART_Send_Byte(':');
UART_Send_Dat(time[1]);
UART_Send_Byte(':');
UART_Send_Dat(time[0]);
UART_Send_Byte('\r');
UART_Send_Byte('\n');
delay(10000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -