![]() |
發布時間: 2018-1-9 15:52
正文摘要:溫度控制系統都差不多設計成了,就差一個時鐘電路,想用DS1302時鐘芯片,請問一下要怎么加上去,關于原理圖和C語言編程方面要怎么改? |
我就一個C語言小白,有些不懂想問問,就是你給的這個編程,我能直接添加進去么?還是作為子文件?該怎么操作?那個溫度測試的編程我已經有了![]() |
;這是DS1302的讀寫子程序部分,已經注釋的很清楚了。 ;******************************************************** ;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 ;以下是有關DS1302的讀寫、設置程序 ;由于DS1302的寄存數據是壓縮BCD碼,為了和其他程序對接方便, ;MCU的數據仍然用16進制,所以讀出和寫入前先轉換成16進制 ;********************************************************** ZH_16_BCD: MOV A, YEAR ;為了和顯示子程序接口進行了調整 CALL ZH_16_BCD1 MOV H_YEAR, A MOV A, MONTH CALL ZH_16_BCD1 MOV H_MONTH, A ; MOV A, DATE CALL ZH_16_BCD1 MOV H_DATE, A ; MOV A, HOUR ; CALL ZH_16_BCD1 MOV H_HOUR, A MOV A, MIN_F ; CALL ZH_16_BCD1 MOV H_MIN_F, A MOV A, SEC ; CALL ZH_16_BCD1 MOV H_SEC, A RET ZH_16_BCD1: MOV B, #10 DIV AB ;16進制轉換到10進制后寫入1302 SWAP A ;"壓縮BCD碼" ADD A, B RET ;********************************************************** ZH_BCD_16: ;二—十BCD碼轉換成十六進制碼 PUSH 00H MOV @R0, #0 ;BCD碼轉換成16進制 XCHD A, @R0 ;個位轉到@R0暫存 SWAP A ;十位轉到低4位 MOV B, #0AH ;十位數乘以10(0AH) MUL AB ; ADD A, @R0 ;加上個位數 POP 00H RET ;******************************************** ;入口參數:寫入或讀出的首數據在H_SEC中,寫或讀的首地址 ;固定為秒;寫入或讀出的字節個數在R7中 ;******************************************** RW1302: MOV A, CMD1302 RW1302_11: CLR RST1302 CLR SCLK1302 ;拉高RST前,一定置SCLK低 NOP ; SETB RST1302 ;拉高RST,對1302讀寫有效 RW1302_1: ;發送指令 MOV A, CMD1302 ;取指令 MOV R6, #8 ;循環,8位指令 RW1302_2: ; CLR SCLK1302 ; RRC A ; MOV IO1302, C ; NOP ; SETB SCLK1302 ; DJNZ R6, RW1302_2 ;以上6行是寫指令 RW1302_22: MOV R6, #8 ;8位數據 MOV A, CMD1302 ;僅僅判斷程序走向 JNB ACC.0, RW1302_4 ;讀寫分別處理,ACC.0=0,轉 RW1302_3: ;ACC.0=1,是讀,轉來 CLR SCLK1302 ;以下是讀數據 NOP ; MOV C, IO1302 NOP ; SETB SCLK1302 ; RRC A ; DJNZ R6, RW1302_3 ;以上7行是寫數據 MOV @R0, A ;送緩存 SJMP RW1302_6 ;跳過“寫” RW1302_4: ; MOV A, @R0 ;如果ACC.0=0,是寫,轉來 RW1302_5: ; RRC A ; CLR SCLK1302 ; MOV IO1302, C ; NOP ; SETB SCLK1302 ; DJNZ R6, RW1302_5 ; RW1302_6: ; INC R0 ;指向下一緩存位 DJNZ R7, RW1302_22 ;字節數沒完,轉回繼續 CLR RST1302 ;讀寫完后,拉低RST,禁止讀寫1302 ; NOP ; ; CLR SCLK1302 ; RET ; ;******************************************** ;INITIALIZE DS1302, 打開寫保護 ;設置充電, 啟動時鐘 ;******************************************** INIT1302: ; CLR SCLK1302 ; CLR RST1302 ; MOV CMD1302, #8EH ;打開寫保護,允許寫入 MOV H_SEC, #0 ;讀寫的數據 MOV R7, #1 ;讀寫的字節數 MOV R0, #H_SEC ;地址送R0 CALL RW1302 ;調用讀寫子程序 MOV CMD1302, #90H ;涓流充電 MOV H_SEC, #0A5H ;數據,一個二極管,2K電阻 MOV R7, #1 ;讀寫的字節數 MOV R0, #H_SEC ; CALL RW1302 ;調用讀寫子程序 CALL ZH_16_BCD ;將時間值16進制轉換成BCD MOV H_SEC+7, #00 ;1302第8個寄存器,寫保護 MOV CMD1302, #0BEH ;連續寫時鐘數據指令 MOV R7, #8 ;讀寫的字節數,設置7,也是連續8個數據 MOV R0, #H_SEC ; CALL RW1302 ;調用讀寫子程序 MOV CMD1302, #11000000B ;寫入1302 RAM 00H單元 MOV H_SEC, #00000101B ;讀寫的數據,寫入05H,設置過標記 MOV R7, #1 ;讀寫的字節數 MOV R0, #H_SEC ;地址送R0 CALL RW1302 ;調用讀寫子程序 MOV CMD1302, #10000000B ;寫秒寄存器指令 MOV A, SEC ;H_SEC的值已被改變,重讀 CALL ZH_16_BCD1 ;寫入“秒“當前值 CLR ACC.7 ;最高位=0,啟動時鐘(冗余) MOV H_SEC, A ;讀寫的數據,最高位為0,啟動時鐘 MOV R7, #1 ;讀寫的字節數 MOV R0, #H_SEC ; CALL RW1302 ;調用讀寫子程序 MOV CMD1302, #10001110B ;設置寫保護指令 MOV H_SEC, #10000000B ;讀寫的數據,不允許寫入 MOV R7, #1 ;讀寫的字節數 MOV R0, #H_SEC ;地址送R0 CALL RW1302 ;調用讀寫子程序 RET ;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 |
求DS1302時鐘電路的匯編語言,不用很長,求大神!![]() |
就差一個DS1302時鐘電路的匯編語言啊,求大神! |