#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個脈沖的時候則沒有變化。
1.png (8.5 KB, 下載次數: 15)
下載附件
2022-8-23 12:13 上傳
|