?? sbjj.c
字號:
#include<c8051F040.h>
#include<absacc.h>
#include<intrins.h>
#define u_char unsigned char
#define uint unsigned int
sbit SDA = P5^3; /* 數據傳送位 */
sbit SCL = P5^4; /* 時鐘控制位 */
/* 函數聲明 */
void s3530a_wait(void); /* 延時 */
void s3530a_start(void); /* 開啟總線 */
void s3530a_stop(void); /* 關閉總線 */
void s3530a_ack(void); /* 發送ACK信號 */
void s3530a_no_ack(void); /* 發送NOACK信號 */
bit s3530a_wait_ack(void); /* 等待ACK信號 */
void s3530a_send_byte(u_char demand, bit order); /* MCU發送一個字節 */
u_char s3530a_receive_byte(void); /* MCU接收一個字節 */
void s3530a_read_date(void); /* 讀取時鐘數據 */
void s3530a_write_date(void); /* 寫入時鐘數據 */
void s3530a_write_status(void); /* 寫狀態寄存器 */
/* 聲明結束 */
u_char read_date[7],dis_date[14];
u_char write_date[7] = {0x07, 0x08, 0x17, 0x05, 0x09, 0x09, 0x58};
/* 延時 */
void s3530a_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 開啟總線 */
void s3530a_start(void)
{
SDA = 1;
SCL = 1;
s3530a_wait();
SDA=0;
s3530a_wait();
SCL = 0;
s3530a_wait();
}
/* 關閉總線 */
void s3530a_stop(void)
{
SDA=0;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SDA=1;
}
/* 發送ACK信號 */
void s3530a_ack(void)
{
SDA=0;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SCL=0;
}
/* 發送NOACK信號 */
void s3530a_no_ack(void)
{
SDA=1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SCL=0;
}
/****************************************************************************/
/* 函數名:s3530a_wait_ack */
/* 功 能:等待ACK信號 */
/****************************************************************************/
bit s3530a_wait_ack(void)
{
u_char errtime=255;
SDA=1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
while(SDA)
{
errtime--;
if(!errtime)
SCL=0;
return 0;
}
SCL=0;
return 1;
}
/****************************************************************************/
/* 函數名:s3530a_send_byte */
/* 功 能:向s3530a設備發送一個字節 */
/****************************************************************************/
void s3530a_send_byte(u_char demand, bit order)
{
u_char i = 8;
if (order)
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x80);
demand <<= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
else
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x01);
demand >>= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
}
/*void s3530a_send_byte2(u_char demand, bit order)
{
u_char i = 16;
if (order)
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x0001);
demand <<= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
else
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x01);
demand >>= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
}*/
/****************************************************************************/
/* 函數名:s3530a_receive_byte */
/* 功 能:從s3530a設備接收一個字節 */
/****************************************************************************/
u_char s3530a_receive_byte(void)
{
u_char i=8;
u_char ddata=0;
SDA=1;
while(i--)
{
ddata >>= 1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
if(SDA)
{
ddata |= 0x80;
}
}
SCL=0;
return ddata;
}
/****************************************************************************/
/* 函數名:s3530a_read_date */
/* 功 能:讀取s3530a時鐘數據 */
/****************************************************************************/
void s3530a_read_date(void)
{
u_char i;
s3530a_start();
s3530a_send_byte(0x65,1); /* 從年開始讀取數據 */
s3530a_wait_ack();
for (i=0; i<7; i++)
{
read_date[i] = s3530a_receive_byte();
if (i != 6) /* 最后一個數據不應答 */
{
s3530a_ack();
}
}
read_date[4] &= 0x7F;
s3530a_no_ack();
s3530a_stop();
}
/****************************************************************************/
/* 函數名:s3530a_write_date */
/* 功 能:寫入s3530a時鐘數據 */
/****************************************************************************/
void s3530a_write_date(void)
{
u_char i;
s3530a_start();
s3530a_send_byte(0x64,1); /* 從年開始寫入數據 */
s3530a_wait_ack();
for(i=0; i<7; i++)
{
s3530a_send_byte(write_date[i],0);
s3530a_wait_ack();
}
s3530a_stop();
}
/****************************************************************************/
/* 函數名:s3530a_write_status */
/* 功 能:寫s3530a狀態寄存器 */
/****************************************************************************/
void s3530a_write_status(void)
{
s3530a_start();
s3530a_send_byte(0x62,1); /* 發送s3530a狀態寄存器命令 */
s3530a_wait_ack();
s3530a_send_byte(0xC8,0); /* 24小時制,打開中斷 */
s3530a_wait_ack();
s3530a_stop();
}
void s3530a_write_status2(void)
{
s3530a_start();
s3530a_send_byte(0x62,1); /* 發送s3530a狀態寄存器命令 */
s3530a_wait_ack();
s3530a_send_byte(0xC0,0); /* 24小時制,打開中斷 */
s3530a_wait_ack();
s3530a_stop();
}
/****************************************************************************/
/* 函數名:s3530a_write_int1 */
/* 功 能:寫s3530ajint1寄存器 */
/****************************************************************************/
/* void s3530a_write_int1(void)
{
s3530a_start();
s3530a_send_byte(0x68,1); 發送s3530a狀態寄存器命令
s3530a_wait_ack();
s3530a_send_byte2(0x8000,1);
s3530a_wait_ack();
s3530a_stop();
}*/
void delay(void)
{
u_char i;
for (i=0; i<200; i++);
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關使能,但沒有進行外圍設備配置
XBR0 = 0x00;
XBR1 = 0x14;
XBR2 = 0x02;
//XBR3 = 0x01;
//管腳輸出配置
SFRPAGE = 0x0F;
P1MDIN = 0xE3;
XBR2=0x40;
P1MDOUT &= 0xE3;
P1 |= 0x1C;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
main()
{
delay();
config();
EA = 1;
EX1=1;
P3=0xff;
s3530a_start();
delay();
s3530a_send_byte(0x60,1); /* 發送s3530a復位命令 */
s3530a_wait_ack();
s3530a_stop();
s3530a_read_date();
delay();
s3530a_write_status();
delay();
// s3530a_write_int1();
// delay();
s3530a_write_date();
delay();
while(1)
{
s3530a_read_date();
delay();
delay();
delay();
s3530a_write_status();
}
}
void s3530a_ISR () interrupt 2
{
dis_date[0]=read_date[0] & 0xF0;
dis_date[1]=read_date[0] & 0x0F;//year
dis_date[2]=0x10;//-
dis_date[3]=read_date[1] & 0xF0;
dis_date[4]=read_date[1] & 0x0F;//month
dis_date[5]=0x10;//-
dis_date[6]=read_date[2] & 0xF0;
dis_date[7]=read_date[2] & 0x0F;//day
dis_date[8]=0x10;//kongge
dis_date[9]=read_date[4] & 0x70;
dis_date[10]=read_date[4] & 0x0F;//hour
dis_date[11]=0x10;//:
dis_date[12]=read_date[5] & 0xF0;
dis_date[13]=read_date[5] & 0x0F;//minute
s3530a_write_status2();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -