chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>芯片引腳圖>

DS1307 C語言程序 - ds1307怎么使用(ds1307引腳圖及功能_c語言程序及典型應(yīng)用電路)

2018年01月26日 10:52 網(wǎng)絡(luò)整理 作者: 用戶評(píng)論(0
關(guān)鍵字:C語言(137200)DS1307(14151)

DS1307 C語言程序

//********************************************************************

//***************************DS1307調(diào)試 *****************************

//********************************************************************

//**DS1307實(shí)時(shí)時(shí)鐘芯片地址0xD0 讀0xD1 寫0xD0 *********************

//********************************************************************

#include《reg51.h》 //單片機(jī)80C51

sbit SCL=P1^1; //串口時(shí)鐘信號(hào)

sbit SDA=P1^0; //串口數(shù)據(jù)信號(hào)

sbit clock=P1^2; //調(diào)試用脈沖輸出信號(hào)**************

unsigned char error; //通訊正常error=0x10;超時(shí)error=0x11

void delay(int i); //延時(shí)子函數(shù)

void TimeInitial(); //時(shí)鐘初始化子函數(shù)

void Start_I2C(); //打開串口子函數(shù)

void Stop_I2C (); //關(guān)閉串口子函數(shù)

void Ack_I2C(); //接受應(yīng)答信號(hào)并判斷是否正常子函數(shù)

void SendAck(); //發(fā)送應(yīng)答信號(hào)子函數(shù)

void SendNotAck(); //發(fā)送非應(yīng)答信號(hào)子函數(shù)

void Send_I2C (int ch); //向總線上發(fā)送一個(gè)字節(jié)

unsigned int Receive_I2C(); //在總線上接受一個(gè)字節(jié)

int read_time(int address); //從芯片D1307讀出10為字節(jié) 地址1:秒 2:分 3:時(shí) 4:星期 5:號(hào) 6:月7:年 8 控制字

void write_time(int address,int date); //向芯片D1307 之中地址為address的寄存器寫入數(shù)據(jù)date 僅為八位字節(jié)

void main() //主程序************************************************************

{

TimeInitial(); //時(shí)鐘初始化

write_time(0x07,0x10); //向芯片D1307寫入控制字(芯片地址0X07)0x10 控制字:1晶振使能(0有效)4:SOUT方波輸出 7、8:方波頻率編碼

while(1)

{

}

}

void TimeInitial() //時(shí)鐘初始化

{

TMOD=0x10; //時(shí)鐘選擇方式2 T1時(shí)鐘

TH1=0x15;

TL1=0xA0; //定時(shí)60ms

EA=1; //中斷準(zhǔn)許

ET1=1; //時(shí)鐘T1 溢出中斷準(zhǔn)許

TR1=1; //啟動(dòng)時(shí)鐘T1

}

//**********************************延時(shí)

void delay(int i)

{

int j,h;

for(j=1;j《99;j++)

{

for(h=0;h《i;h++)

;

}

}

//**********************************傳送啟動(dòng)

void Start_I2C()

{

EA=0; //關(guān)閉中斷

SCL=0; //總線放空,以便更改總線數(shù)據(jù)

delay(1); //延時(shí)

SDA=1; //發(fā)送I2C總線起始條件的數(shù)據(jù)信號(hào)1以便總線使能時(shí)產(chǎn)生下降沿

delay(1); //延時(shí)

SCL=1; //發(fā)送I2C總線起始條件的時(shí)鐘信號(hào)

delay(1); //延時(shí)

SDA=0; //產(chǎn)生下降沿 總線傳輸開始

delay(1); //延時(shí)

SCL=0; //時(shí)鐘線從高到低一次跳變,總線放空 準(zhǔn)備傳輸數(shù)據(jù)

}

//**********************************傳送關(guān)閉

void Stop_I2C ()

{

SCL=0; //發(fā)送I2C總線時(shí)鐘信號(hào)放空

SDA=0; //發(fā)送I2C總線停止條件的數(shù)據(jù)信號(hào)0以便產(chǎn)生上升沿

delay(1); //延時(shí)

SCL=1; //時(shí)鐘線從低到高一次跳變 總線 使能

delay(1); //延時(shí)

SDA=1; //發(fā)送I2C總線數(shù)據(jù)信號(hào)產(chǎn)生上升沿 終止傳送

delay(1); //延時(shí)

SCL=0; //發(fā)送I2C總線時(shí)鐘信號(hào)放空

delay(1);

SDA=0; //發(fā)送I2C總線放空 準(zhǔn)備下次動(dòng)作

EA=1; //傳輸結(jié)束開啟中斷

}

//**********************************傳送響應(yīng)

void Ack_I2C()

{

unsigned char errtime=255; //因故障接收方無ACK,超時(shí)值為255。

SDA=1; //數(shù)據(jù)線升高,以便捕捉相應(yīng)信號(hào),(相應(yīng)信號(hào):拉低數(shù)據(jù)線)

SCL=1; // 主機(jī)放出一脈沖,等待捕捉相應(yīng)信號(hào)

error=0x10; //通訊正常(即:接受到了相應(yīng)信號(hào))為0X10;

while(SDA) //等待捕捉相應(yīng)信號(hào),信號(hào)沒有到來前一直保持循環(huán),信號(hào)到來后迅速跳出循環(huán)

{

errtime--; //每循環(huán)一次,倒計(jì)時(shí)減一

if(!errtime) //判斷倒計(jì)時(shí)是否減到了0,即循環(huán)了255次,如果減到了0,判定此次通訊未接受到響應(yīng)信號(hào),傳送失敗

{

Stop_I2C (); //傳送失敗,停止傳送

error=0x11; //傳送結(jié)果未傳送失敗0x11

return; //跳出循環(huán)

}

}

SCL=0; //無論傳送是否正確,都需放空總線,以備后用

}

//**********************************向總線傳送響應(yīng)

void SendAck()

{

SDA=0; //數(shù)據(jù)線保持拉低,時(shí)鐘線發(fā)生一次從高低的跳變 發(fā)送一個(gè)應(yīng)答信號(hào)

delay(1);

SCL=1;

delay(1);

SCL=0;

}

//**********************************向總線傳送非響應(yīng)

void SendNotAck()

{

SDA=1; //數(shù)據(jù)線保持高,時(shí)鐘線發(fā)生一次從高低的跳變 沒有應(yīng)答

delay(1);

SCL=1;

delay(1);

SCL=0;

}

//**********************************向總線傳送字節(jié)

void Send_I2C (int ch)

{

int i;

for (i=1;i《=8;i++) //發(fā)送八位

{

SCL=0; //總線放空

delay(1); //延時(shí)

SDA=(ch&0x80); //根據(jù)給定數(shù)據(jù),又高位到低位逐步提出字節(jié)位,發(fā)送到總線上

ch《《=1; //左循環(huán)以便輸出下一位

delay(1); //延時(shí)

SCL=1; //總線使能,發(fā)送總線數(shù)據(jù)

delay(1); //延時(shí)

}

SCL=0; //總線8位傳送完成,總線放空

}

//**********************************向總線讀入字節(jié)

unsigned int Receive_I2C()

{

unsigned char i,a;

SDA=1; //不知道為啥,1的時(shí)候讀入正確 0的時(shí)候讀入全部為0;

for (i=1;i《=8;i++) //讀入八個(gè)位

{

a《《=1; // 讀入數(shù)據(jù)左循環(huán)

SCL=0; //總線放空

delay(1);

SCL=1; //時(shí)鐘做一次從低到高的跳變 可以接收一位數(shù)據(jù)

delay(1);

a|=SDA; // 將數(shù)據(jù)編入變量a

}

SCL=0; //總線放空

return a; //反饋接收到的信息

}

//**********************************向芯片D1307 之中地址為address的寄存器寫入數(shù)據(jù)date 僅為八位字節(jié)

void write_time(int address,int date)

{

Start_I2C(); //啟動(dòng)總線

Send_I2C (0xD0); //呼叫芯片D1307,并定義為 寫 動(dòng)作

Ack_I2C(); //等待響應(yīng)信號(hào)

Send_I2C (address); //發(fā)送地址

Ack_I2C(); //等待響應(yīng)信號(hào)

Send_I2C (date); //發(fā)送數(shù)據(jù)

Ack_I2C(); //等待響應(yīng)信號(hào)

Stop_I2C (); //停止總線

}

//****************從芯片D1307讀出10為字節(jié) 地址1:秒 2:分 3:時(shí) 4:星期 5:號(hào) 6:月7:年 8 控制字

int read_time(int address)

{

int a[10]; //定義一個(gè)數(shù)組以便接受數(shù)據(jù)

int i=1;

Start_I2C(); //啟動(dòng)傳送

Send_I2C (0xD0); //呼叫芯片D1307,并定義為 寫 動(dòng)作

Ack_I2C(); //等待響應(yīng)信號(hào)

Send_I2C (0x00); //發(fā)送起始地址

Ack_I2C(); //等待響應(yīng)信號(hào)

Stop_I2C (); //關(guān)閉總線

Start_I2C(); //啟動(dòng)總線

Send_I2C (0xD1); //呼叫芯片D1307,并定義為 讀 動(dòng)作

SendAck(); //發(fā)送應(yīng)答就位,準(zhǔn)備接受數(shù)據(jù)

for(i;i《10;i++)

{

a[i]=Receive_I2C(); //接受自初始地址開始的10個(gè)字節(jié) 地址1:秒 2:分 3:時(shí) 4:星期 5:號(hào) 6:月7:年 8 控制字

SendAck(); //每成功接受一位發(fā)送一個(gè)響應(yīng)信號(hào) 以便接受下一位

}

Stop_I2C (); //接受完成停止

return a[address]; //反饋所需數(shù)據(jù)

}

void t1(void) interrupt 3 using 0 //T1溢出中斷

{

TH1=0x15;

TL1=0xa0; //重新載入60ms

clock=~clock; //調(diào)試用脈沖

P0=read_time(1); //將實(shí)時(shí)時(shí)鐘 秒 送入P0口

}

非常好我支持^.^

(8) 72.7%

不好我反對(duì)

(3) 27.3%

( 發(fā)表人:李倩 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?