?? sd2000的c51程序.c
字號(hào):
#pragma small
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------//SD2000IIC總線管腳定義
sbit SDA=P1^0;
sbit SCL=P1^1;
//----------------------------------//SD2000操作時(shí)使用的變量定義
uchar bdata bitbyte;
sbit bitbyte_7=bitbyte^7;
sbit bitbyte_6=bitbyte^6;
sbit bitbyte_5=bitbyte^5;
sbit bitbyte_4=bitbyte^4;
sbit bitbyte_3=bitbyte^3;
sbit bitbyte_2=bitbyte^2;
sbit bitbyte_1=bitbyte^1;
sbit bitbyte_0=bitbyte^0;
uchar year; //年
uchar month; //月
uchar date; //日
uchar week; //星期
uchar hour; //時(shí)
uchar minute;//分
uchar second;//秒
//===================================================
// 以下是與SD2000時(shí)鐘芯片有關(guān)的子程序 |
/*===================================================
命令格式: 0 1 1 0 c2 c1 c0 r/w
器件地址 命令分類 1讀、0寫
C2 C1 C0 操作 ACK數(shù)目
0 0 0 復(fù)位:00年/01月/01天/0星期/00分/00秒 1
0 0 1 狀態(tài)寄存器存取 2
0 1 0 實(shí)時(shí)數(shù)據(jù)1(從年數(shù)據(jù)開始)存取 8
0 1 1 實(shí)時(shí)數(shù)據(jù)2(從小時(shí)數(shù)據(jù)開始)存取 4
1 0 0 頻率事件設(shè)置1(INT1腳) 3
1 0 1 頻率事件2(INT2腳) 3
1 1 0 測(cè)試模式開始(*2) 1
1 1 1 測(cè)試模式結(jié)束(*2) 1 */
//------------------延時(shí)程序
void delay(uint i)
{ uint j;
for(j=0;j<=i;j++);
}
//------------------啟用IIC總線
void i2cstart(void)
{ SCL=0;
SDA=1;
delay(1);
SCL=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
}
//關(guān)閉IIC總線
void i2cstop(void)
{ SDA=0;
SCL=0;
delay(1);
SCL=1;
delay(1);
SDA=1;
delay(1);
SCL=0;
}
//從MCU發(fā)送一位數(shù)給SD2000A
void i2cbitout(bit bitout)
{ SDA=0;
SCL=0;
SDA=bitout;
delay(1);
SCL=1;
delay(1);
SCL=0;
}
//MCU從SD2000A接收一位數(shù)
bit i2cbitin(void)
{ bit bitin;
SDA=1;
SCL=0;
delay(1);
bitin=SDA;
delay(1);
SCL=1;
delay(1);
SCL=0;
return bitin;
}
//從MCU發(fā)送一個(gè)字節(jié)給SD2000A,由低位到高位發(fā)送
void i2cbyteout_lh(uchar shu)
{ uchar i;
for(i=1;i<=8;i++)
{i2cbitout((bit)(shu&0x01));
shu=shu>>1;
}
i2cbitin();
}
//從MCU發(fā)送一個(gè)字節(jié)給SD2000A,由高位到低位發(fā)送
void i2cbyteout_hl(uchar shu)
{ uchar i;
for(i=1;i<=8;i++)
{i2cbitout((bit)(shu&0x80));
shu=shu<<1;
}
i2cbitin();
}
//MCU從SD2000A接收一個(gè)字節(jié)
uchar i2cbytein(void)
{ bitbyte_0=i2cbitin();
bitbyte_1=i2cbitin();
bitbyte_2=i2cbitin();
bitbyte_3=i2cbitin();
bitbyte_4=i2cbitin();
bitbyte_5=i2cbitin();
bitbyte_6=i2cbitin();
bitbyte_7=i2cbitin();
i2cbitout(0);
return bitbyte;
}
//寫SD2000A內(nèi)部實(shí)時(shí)數(shù)據(jù)寄存器程序
//將設(shè)定年、月、日、星期、時(shí)、分、秒數(shù)據(jù)寫入SD2000A
void writesd2000(void)
{ year=0x04;//輸入時(shí)間的具體數(shù)值,BCD碼(根據(jù)真實(shí)時(shí)間設(shè)定)
month=0x02;
date=0x21;
week=0x06;
hour=0x15;
minute=0x04;
second=0x00;
i2cstart();
i2cbyteout_hl(0x64);//發(fā)送寫實(shí)時(shí)數(shù)據(jù)1命令
i2cbyteout_lh(year);
i2cbyteout_lh(month);
i2cbyteout_lh(date);
i2cbyteout_lh(week);
i2cbyteout_lh(hour);
i2cbyteout_lh(minute);
i2cbyteout_lh(second);
i2cstop();
}
//讀、寫SD2000A狀態(tài)寄存器,對(duì)SD2000A進(jìn)行設(shè)置
void setsd2000(void)
{ i2cstart();
i2cbyteout_hl(0x60);//發(fā)送SD2000A復(fù)位命令
i2cstop();
i2cstart();
i2cbyteout_hl(0x62);//發(fā)送寫SD2000A狀態(tài)寄存器命令
i2cbyteout_lh(0xc0);//24小時(shí)進(jìn)制,關(guān)所有中斷輸出
i2cstop();
}
//從SD2000A讀入當(dāng)前時(shí)間數(shù)據(jù)
//接收數(shù)據(jù)放在年、月、日、星期、時(shí)、分、秒各寄存器
void readsd2000(void)
{ i2cstart();
i2cbyteout_hl(0x65);//發(fā)送讀數(shù)據(jù)命令
year=i2cbytein();
month=i2cbytein();
date=i2cbytein();
week=i2cbytein();
hour=i2cbytein()&0x7f;//調(diào)整hour數(shù)據(jù)(個(gè)人認(rèn)為是芯片的故障)
minute=i2cbytein();
second=i2cbytein();
i2cstop();
}
//--------------------------------------------//主程序
void main()
{
setsd2000(); //設(shè)置SD2000的工作模式
writesd2000(); //寫入時(shí)間
readsd2000(); //讀取的時(shí)間數(shù)據(jù)在變量year/month/day/week/hour/minute/second中
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -