#include <STC8.H>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //读寄存器的秒分钟日月周年
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //写寄存器的秒分钟日月周年
uchar TIME[7] = {0x50, 0x43, 0x21, 0x25, 0x07, 0x06, 0x20};
sbit SCK=P3^2; //位选时钟线
sbit SDA=P3^3; //位选输出输出
sbit RST=P3^4; //位选复位
//DS1302的写操作(写地址,写数据)
void write1302(uchar addr,uchar dat)
{
uchar i;
SCK=0; _nop_(); //时钟线为0
RST=0; _nop_(); //一开始RST为0
RST=1; _nop_(); //过段时间RST为1开始工作
for(i=0;i<8;i++) //FOR循环八次,写八次地址
{
SCK=0; _nop_(); //时钟线降低,为下一次for循环的上升沿做准备
SDA=addr&0x01; //从最低位开始接收
addr=addr>>1; //右移一位,执行8次
SCK=1; _nop_(); //时钟线升高,上升沿
}
for(i=0;i<8;i++) //FOR循环八次,写八次地址
{
SCK=0; _nop_(); //时钟线降低,为下一次for循环的上升沿做准备
SDA=dat&0x01; //从最低位开始接收
dat=dat>>1; //右移一位,执行8次
SCK=1; _nop_(); //时钟线升高,上升沿
}
RST=0; _nop_(); //RST为0,停止工作
}
//DS1302的读操作(读地址,读数据)
uchar read1302(uchar addr)
{
uchar i, dat=0x00;//存储读出来的数据
SCK=0; _nop_();//时钟总线清零
RST=0; _nop_();//停止数据传送
RST=1; _nop_();//数据操作
for(i=0;i<8;i++) //FOR循环八次,写八次地址
{
SCK=0; _nop_(); //时钟线降低,为下一次for循环的上升沿做准备
SDA=addr&0x01; //从最低位开始接收
addr=addr>>1; //右移一位,执行8次
SCK=1; _nop_(); //时钟线升高,上升沿
}
for(i=0;i<8;i++)
{
SCK=0; _nop_();
dat=dat>>1;
if(SDA==1)
{
dat=dat | 0x80 ; //因为从低位开始读
}
SCK=1; _nop_();
}
RST=0; _nop_();
SCK=0; _nop_();
SDA=0; _nop_();
return dat;
}
//初始化ds1302
void init1302()
{
uchar i;
write1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write1302(WRITE_RTC_ADDR,TIME);//循环七次的目的就是为了能够将秒分钟日月周年输入,括号内就是为之前的写地址和写数据
}
//write1302(0x8e,0x80); //重新赋予写保护
}
//读取ds1302的数据
void read1302time()
{
uchar i;
for(i=0;i<7;i++)
{
TIME=read1302(READ_RTC_ADDR);
}
}
// UART发送一字节
void UART_Send_Byte(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
//将数据转换成ASC码并通过UART发送出去
void UART_Send_Dat(uchar dat) //注意是关于16取余
{
UART_Send_Byte(dat/16+'0');
UART_Send_Byte(dat%16+'0');
}
void UartInit(void) //9600bps@11.0592MHz
{
}
void main()
{
P3M0 = 0x14; //0001 0100
P3M1 = 0x00; //0000 0000
//init1302();
UartInit();
while(1)
{
read1302time();
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');
Delay1000ms();
}
}
用的是STC8A的单片机
读字节的时候SCLK先0再1的话,就会有16个脉冲,先1再0的话,就是15个脉冲,但是16个脉冲的时候,秒那边是有变化的(如下图),15个脉冲的时候则没有变化。
|