|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
ds1302讀數遇到的問題 |
| 作者:fifascut 欄目:單片機 |
能寫芯片也能讀,但是讀出來的數據不準確。雙數全部顯示為0,單數1,5,9都顯示為1。3和5能顯示。是不是我轉化程序有問題啊,就是先把BCD碼轉換為十進制數再顯示。程序如下 Get1302(readtime); ACC=readtime[0]; ACC=ACC>>4; a=ACC&0x0f; position(1,4); write_data(buff[a]); ACC=readtime[0]; b=ACC&0x0f; position(1,5); write_data(buff[b]); |
| 2樓: | >>參與討論 |
| 作者: zgl7903 于 2006/10/26 22:18:00 發(fā)布:
建議建立一個臨時變量,直接使用ACC有危險哦 軟調一下,先保證功能和時序上正確,然后再看時間是否合適 |
|
| 3樓: | >>參與討論 |
| 作者: fifascut 于 2006/10/26 22:35:00 發(fā)布:
請問 直接用ACC為什么會有危險啊 |
|
| 4樓: | >>參與討論 |
| 作者: stycx 于 2006/10/26 22:49:00 發(fā)布:
acc不是私有的,隨時有可能被別的指令改寫 |
|
| 5樓: | >>參與討論 |
| 作者: fifascut 于 2006/10/26 23:06:00 發(fā)布:
改了程序后,還是不行啊 Get1302(readtime); tamp=readtime[0]; tamp=tamp>>4; a=tamp&0x0f; position(1,4); write_data(buff[a]); tamp=readtime[0]; b=tamp&0x0f; position(1,5); write_data(buff[b]); 讀了秒存儲單元,讀數也會每秒改變一次,但就是不符合要求 |
|
| 6樓: | >>參與討論 |
| 作者: zgl7903 于 2006/10/26 23:27:00 發(fā)布:
一步步調試啊,要達到什么目的,LZ應該最清楚了 問題出在哪塊,一步步調試,看中間變量到哪塊不對,這個不是什么難題吧 |
|
| 7樓: | >>參與討論 |
| 作者: stycx 于 2006/10/26 23:39:00 發(fā)布:
最好貼完整代碼 肯定是轉換的問題 |
|
| 8樓: | >>參與討論 |
| 作者: stycx 于 2006/10/26 23:44:00 發(fā)布:
DS1302.lib /* CodeVisionAVR C Compiler (C) 1998-2004 Pavel Haiduc, HP InfoTech S.R.L. DALLAS Semiconductors DS1302 Real Time Clock functions */ #include <bcd.h> void rtc_init(unsigned CHAR tc_on,unsigned CHAR diodes,unsigned CHAR res) { res&=3; if (tc_on) res|=0xa0; if (diodes==1) res|=4; else if (diodes==2) res|=8; else res=0; ds1302_write(0x8e,0); ds1302_write(0x90,res); ds1302_write(0x8e,0x80); } void rtc_get_time(unsigned CHAR *hour,unsigned CHAR *min,unsigned CHAR *sec) { *hour=bcd2bin(ds1302_read(0x85)); *min=bcd2bin(ds1302_read(0x83)); *sec=bcd2bin(ds1302_read(0x81)); } void rtc_set_time(unsigned CHAR hour,unsigned CHAR min,unsigned CHAR sec) { ds1302_write(0x8e,0); ds1302_write(0x84,bin2bcd(hour)); ds1302_write(0x82,bin2bcd(min)); ds1302_write(0x80,bin2bcd(sec)); ds1302_write(0x8e,0x80); } void rtc_get_date(unsigned CHAR *date,unsigned CHAR *month,unsigned CHAR *year) { *date=bcd2bin(ds1302_read(0x87)); *month=bcd2bin(ds1302_read(0x89)); *year=bcd2bin(ds1302_read(0x8d)); } void rtc_set_date(unsigned CHAR date,unsigned CHAR month,unsigned CHAR year) { ds1302_write(0x8e,0); ds1302_write(0x86,bin2bcd(date)); ds1302_write(0x88,bin2bcd(month)); ds1302_write(0x8c,bin2bcd(year)); ds1302_write(0x8e,0x80); } |
|
| 9樓: | >>參與討論 |
| 作者: fifascut 于 2006/10/27 10:11:00 發(fā)布:
我用的是51單片機 下面是對1302的讀寫程序 void RTInputByte(uchar ucData) { uchar i; ACC = ucData; for(i=8; i>0; i--) { T_IO = ACC0; _nop_(); _nop_(); T_CLK = 1; _nop_(); _nop_(); T_CLK = 0; ACC = ACC >> 1; } } uchar RTOutputByte(void) { uchar i; for(i=8; i>0; i--) { ACC = ACC >>1; T_CLK = 0; _nop_(); ACC7 = T_IO; _nop_(); T_CLK = 1; _nop_(); _nop_(); } return(ACC); } |
|
| 10樓: | >>參與討論 |
| 作者: fifascut 于 2006/10/27 10:17:00 發(fā)布:
uchar RTOutputByte(void) 程序有誤,應該是 uchar RTOutputByte(void) { uchar i; T_IO=1; for(i=8; i>0; i--) { ACC = ACC >>1; ACC7 = T_IO; _nop_(); T_CLK = 1; _nop_(); _nop_(); T_CLK = 0; _nop_(); } return(ACC); } |
|
| 11樓: | >>參與討論 |
| 作者: stycx 于 2006/10/27 13:31:00 發(fā)布:
不是說好不用acc了嗎,怎么還用? |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |