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