日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 技術(shù)學(xué)院 > 熱搜器件
[導(dǎo)讀]ds1302是具有時(shí)鐘功能的芯片,一旦啟動(dòng),可以自動(dòng)計(jì)時(shí),內(nèi)部含有年月日時(shí)分秒寄存器等。先說(shuō)下我這幾天遇到的問(wèn)題,其實(shí)歸結(jié)起來(lái)滿簡(jiǎn)單的一個(gè)問(wèn)題,針對(duì)ds1302芯片的讀寫字節(jié)操作滿簡(jiǎn)單的,見(jiàn)附表的datasheet,但這里

ds1302是具有時(shí)鐘功能的芯片,一旦啟動(dòng),可以自動(dòng)計(jì)時(shí),內(nèi)部含有年月日時(shí)分秒寄存器等。

先說(shuō)下我這幾天遇到的問(wèn)題,其實(shí)歸結(jié)起來(lái)滿簡(jiǎn)單的一個(gè)問(wèn)題,針對(duì)ds1302芯片的讀寫字節(jié)操作滿簡(jiǎn)單的,見(jiàn)附表的datasheet,但這里要強(qiáng)調(diào)的是往ds1302芯片寫數(shù)據(jù)或者是讀數(shù)據(jù),在程序執(zhí)行上一般會(huì)分別調(diào)用先后調(diào)用往ds1302寫一個(gè)字節(jié)或者讀一個(gè)字節(jié)的方法(當(dāng)然這兩個(gè)方法得自己寫)。不過(guò)記得在調(diào)用這兩個(gè)方法的過(guò)程中要保持CE(即芯片的置位端)持續(xù)為高電平,切不可寫完一個(gè)字節(jié)就將置位端拉低,接著要寫下一個(gè)字節(jié)又把置位端拉高?,F(xiàn)在看看下面的代碼:

sbit clk = P3^6;//時(shí)鐘

sbit io = P3^4; //數(shù)據(jù)

sbit reset = P3^5;// DS1302復(fù)位

/寫一字節(jié)到ds1302

void write_byte(uchar dat)

{

uchar i = 0;

reset = 1; //置位端高電平允許寫

for(i=0; i<8; i++)

{

clk = 0;

io = dat&0x01; //從最低位開(kāi)始寫

clk = 1; //時(shí)鐘信號(hào)上升沿接收數(shù)據(jù)

dat = dat >> 1; //數(shù)據(jù)右移

}

reset = 0;

}

//從ds1302讀一個(gè)字節(jié)

uchar read_byte()

{

uchar rev = 0x00;

uchar i = 0;

reset = 1; //置位端高電平允許讀

for(i=0; i<8; i++)

{

clk = 0;

if(io)

{

rev |= 0x80; //讀取的數(shù)據(jù)放在高位端

}

rev >>= 1; //數(shù)據(jù)右移

clk = 1; //時(shí)鐘信號(hào)上升沿接收數(shù)據(jù)

}

return rev;

}

void write_data_ds1302(uchar address, uchar dat)

{

reset=0;

_nop_();

clk=0;

_nop_();

reset = 1;

_nop_(); //啟動(dòng)

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

write_byte(dat); //發(fā)送數(shù)據(jù)

clk = 1;

reset = 0; //恢復(fù)

}

在主函數(shù)里

write_data_ds1302(0x82, 0x36); //在分鐘寄存器里寫入數(shù)據(jù)

minute = read_data_ds1302(0x83); //讀出分鐘寄存器里的數(shù)據(jù)

write_data(minute);

得到的minute卻是0x7e,或者0x00這樣明顯錯(cuò)誤的答案!!

原因在于write_byte(uchar dat)中最后一行代碼reset = 0;相當(dāng)于拉低置位端,數(shù)據(jù)后續(xù)的傳輸被破壞了。

真正的函數(shù)方法只要這樣寫就可以了

sbit SCK = P3^6;//時(shí)鐘

sbit SDA = P3^4; //數(shù)據(jù)

sbit RST = P3^5;// DS1302復(fù)位

//寫一字節(jié)到ds1302

void write_byte(uchar dat)

{

uchar i = 0;

SCK = 0;

RST = 1; //置位端高電平允許寫

for(i=0; i<8; i++)

{

SCK = 0;

delay(1);

SDA = dat&0x01; //從最低位開(kāi)始寫

dat >>= 1; //數(shù)據(jù)右移

SCK = 1; //時(shí)鐘信號(hào)上升沿接收數(shù)據(jù)

}

}

//從ds1302讀一個(gè)字節(jié)

uchar read_byte()

{

uchar rev = 0x00;

uchar i = 0;

for(i=0; i<8; i++)

{

if(SDA)

{

rev |= 0x80; //讀取的數(shù)據(jù)放在高位端

}

SCK = 0;

rev >>= 1; //數(shù)據(jù)右移

SCK = 1;

}

return rev;

}

void write_data_ds1302(uchar address, uchar dat)

{

RST = 0;

SCK = 0;

RST = 1;

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

write_byte(dat);//發(fā)送數(shù)據(jù)

RST = 0; //恢復(fù)

}

uchar read_data_ds1302(uchar address)

{

uchar rev = 0x00;

RST = 0;

SCK = 0;

delay(4);

RST = 1;

write_byte(address);

rev = read_byte();

return rev;

}

這里的write_data_ds1032(uchar address, uchar dat)指的是寫入地址后接著寫入一個(gè)字節(jié)的數(shù)據(jù),如果還要寫第二個(gè)字節(jié)數(shù)據(jù),應(yīng)當(dāng)把末行的RST = 0; 去掉,同時(shí)調(diào)用write_byte(uchar dat)方法。

在這里談下ds1302 數(shù)據(jù)的注意事項(xiàng),比如write_data_ds1302(0x84, 18); //在分鐘寄存器里寫入數(shù)據(jù) 這里將18無(wú)論以十進(jìn)制的方法或者十六進(jìn)制0x12的方法存到寄存器中,在讀取出來(lái)是0x18,因?yàn)榇嫒氲郊拇嫫骼锏陌宋粩?shù)據(jù),在寄存器的八位中,寄存器的前四位存放十位,后四位存放個(gè)位。(因?yàn)榉昼娂拇嫫鞔娣诺臄?shù)據(jù)最大也就59即0x59).所以minute = read_data_ds1302(0x85); //讀出分鐘寄存器里的數(shù)據(jù) 將得到0x18.

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉