![]() |
Great88 發(fā)表于 2015-9-19 21:46 謝謝您 |
//********向1302寫數(shù)據(jù)********* void Write1302(uchar dat) { uchar i; SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備 delay1(1); //稍微等待,使硬件做好準備 for(i=0;i<8;i++) //連續(xù)寫8個二進制位數(shù)據(jù) { IO=dat&0x01; //取出dat的第0位數(shù)據(jù)寫入1302 delay(1); //稍微等待,使硬件做好準備 SCLK=1; //上升沿寫入數(shù)據(jù) delay1(1); //稍微等待,使硬件做好準備 SCLK=0; //重新拉低SCLK,形成脈沖 dat>>=1; //將dat的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位 } } void WriteSet1302(uchar Cmd,uchar dat) { RST=0; //禁止數(shù)據(jù)傳遞 SCLK=0; //確保寫數(shù)居前SCLK被拉低 RST=1; //啟動數(shù)據(jù)傳輸 delay1(1); //稍微等待,使硬件做好準備 Write1302(Cmd); //寫入命令字 Write1302(dat); //寫數(shù)據(jù) SCLK=1; //將時鐘電平置于已知狀態(tài) RST=0; //禁止數(shù)據(jù)傳遞 } uchar Read1302(void) { uchar i,dat; delay(1); //稍微等待,使硬件做好準備 for(i=0;i<8;i++) //連續(xù)讀8個二進制位數(shù)據(jù) { dat>>=1; //將dat的各數(shù)據(jù)位右移1位,因為先讀出的是字節(jié)的最低位 if(IO==1) //如果讀出的數(shù)據(jù)是1 dat|=0x80; //將1取出,寫在dat的最高位 SCLK=1; //將SCLK置于高電平,為下降沿讀出 delay1(1); //稍微等待 SCLK=0; //拉低SCLK,形成脈沖下降沿 delay1(1); //稍微等待 } return dat; //將讀出的數(shù)據(jù)返回 } uchar ReadSet1302(uchar Cmd) { uchar dat; RST=0; //拉低RST SCLK=0; //確保寫數(shù)居前SCLK被拉低 RST=1; //啟動數(shù)據(jù)傳輸 Write1302(Cmd); //寫入命令字 dat=Read1302(); //讀出數(shù)據(jù) SCLK=1; //將時鐘電平置于已知狀態(tài) RST=0; //禁止數(shù)據(jù)傳遞 return dat; //將讀出的數(shù)據(jù)返回 } void Init_DS1302(void) { WriteSet1302(0x8E,0x00); //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據(jù)寫秒寄存器命令字,寫入秒的初始值 WriteSet1302(0x82,((45/10)<<4|(45%10))); //根據(jù)寫分寄存器命令字,寫入分的初始值 WriteSet1302(0x84,((15/10)<<4|(15%10))); //根據(jù)寫小時寄存器命令字,寫入小時的初始值 WriteSet1302(0x86,((29/10)<<4|(29%10))); //根據(jù)寫日寄存器命令字,寫入日的初始值 WriteSet1302(0x88,((11/10)<<4|(11%10))); //根據(jù)寫月寄存器命令字,寫月的初始值 WriteSet1302(0x8c,((15/10)<<4|(15%10))); //.....年.....................年......... } |
本帖最后由 王朗的誘惑 于 2015-9-6 14:36 編輯 此者彼者 發(fā)表于 2015-9-6 11:47 數(shù)據(jù)不能是88吧……會不會是顯示問題。數(shù)碼管顯示調(diào)好了么?話說這面包板……好眼熟呀……你也用面包板玩…… |
王朗的誘惑 發(fā)表于 2015-8-28 23:52 恩恩,已經(jīng)可以了,真是太謝謝你啦~~~~~~ |
王朗的誘惑 發(fā)表于 2015-8-28 23:52 恩恩,可以了,真是太謝謝你啦~~~~~~ |
王朗的誘惑 發(fā)表于 2015-8-28 23:52 恩恩,搞定了,真是太謝謝你啦~~~ |
此者彼者 發(fā)表于 2015-8-28 19:43 搞定。~~不過我的電路不太一樣,但是發(fā)現(xiàn)DS1302連到P3那幾個口不好用,換到P2的就好了,估計是數(shù)碼管開關(guān)的時候引腳控制牽連到DS1302了。現(xiàn)在DS1302通信和初始化都沒問題了(接在P2的時候)。但是因為數(shù)碼管電路不太一樣,所以最后具體的還要你自己試試。要是還不行……可以再來找我。 |
30.11 KB, 下載次數(shù): 43
王朗的誘惑 發(fā)表于 2015-8-28 17:25 按照您說的,還是不行,您有時間幫我看看我的程序嗎??我使用keil4編寫的,麻煩您了,我編譯的結(jié)果是,無論初始值是什么,數(shù)碼管顯示的都是0,并且不動,麻煩您了。 |
26.35 KB, 下載次數(shù): 18
此者彼者 發(fā)表于 2015-8-28 17:13 把ACC=ACC>>1;放到前面,就是進了for以后的第一句。 |
王朗的誘惑 發(fā)表于 2015-8-28 17:00 按照您的說法改正了,但還是不行 |
ACC是累加器嗎?如果是的話在計數(shù)變量 i 自加的時候,就是 i++ 運算,會用到累加器,之前存的數(shù)據(jù)就沒了……正確的做法是for(i=8;i>0;i--) |
Powered by 單片機教程網(wǎng)