|
代碼功能:持續從DS1302讀出“秒”數據并在數碼管上面顯示出來,單片機是89c52。
現象:數碼管亂碼,(看起來能正常讀出,但是數碼管不該亮的段也亮了)
數碼管相關函數單獨測試,顯示沒問題。看了下別人的程序,讀取完后會特意將數據線(ds1302 6腳)拉低,我這么改后,數碼管顯示就正常讀秒了。數據手冊上并沒有看到讀完后需要將數據線置0的操作。平時寫這種時序都是照著數據手冊來的,出了這種問題很難查出原因來,這次還好有別人的程序作參考。 另外我嘗試給數據線加上拉電阻,電阻的一端接上DS1302 6腳,另一端什么還什么都沒接時,顯示就正常了,這是什么原理?嘗試拿一根導線一端碰ds1302 6腳,另一端懸空,也正常顯示了 。
問題1:造成亂碼的原因,是否是代碼寫的有哪不對?為什么讀取完后將數據線(ds1302 6腳連到P3.4口上)拉低能解決亂碼
問題2:僅僅是拿導體觸碰一下DS1302 6腳,也能解決亂碼,是啥原理?
問題3:別人設計的電路ds1302 5,6,7腳會加上拉電阻,也用的89C52的P3口,P3口內部自帶上拉,外加上拉的意義?通訊的數據線上加上拉電阻有啥作用?
還請各位不吝賜教。
1.PNG (28.98 KB, 下載次數: 26)
下載附件
ds1302接線
2023-9-8 17:05 上傳
2.PNG (45.43 KB, 下載次數: 30)
下載附件
讀寫時序
2023-9-8 17:05 上傳
- unsigned char Ds1302Read(unsigned char command) /*從總線上讀取數據,低位在前*/
- {
- unsigned char i;
- unsigned char result=0x00;
- command |= 0x01; /*只宏定義了寫的操作字,最低位寫為1變為讀操作字*/
- CE=1;
- for(i=0;i<8;i++)
- {
- IO = command & (0x01 << i); /*從最低位依次取數據并放到數據線上*/
- SCLK=0;
- SCLK=1;
- }
-
- for (i = 0; i<8; i++) /*從數據線上讀取*/
- {
- result>>=1;
- SCLK=1;
- SCLK=0;
- if(IO)
- {
- result|=0x80;
- }
- }
- CE=0;
- // IO=0; //?? 問題所在,不加這一句亂碼
- return result;
- }
復制代碼
|
-
-
ds1302.rar
2023-9-8 17:14 上傳
點擊文件名下載附件
17.27 KB, 下載次數: 2
keil工程
|