單片機(jī)實(shí)現(xiàn)的多功能智能鐘源代碼 程序清單如下: ;******************************************************************* ;寫字節(jié)子程序WMAX ;占用寄存器ACC ;******************************************************************* DIN EQU P1.6 CLK EQU P1.4 WMAX: JB E7,W7 ;判是否為1 LCALL WM0 ;不是,則調(diào)用寫“0”子程序 LJMP N7 W7: LCALL WM1 ;是,則調(diào)用寫“1”子程序 N7: JB E6, W6 LCALL WM0 LJMP N6 W6: LCALL WM1 N6: JB E5, W5 LCALL WM0 LJMP N5 W5: LCALL WM1 N5: JB E4, W4 LCALL WM0 LJMP N4 W4: LCALL WM1 N4: JB E3, W3 LCALL WM0 LJMP N3 W3: LCALL WM1 N3: JB E2, W2 LCALL WM0 LJMP N2 W2: LCALL WM1 N2: JB E1, W1 LCALL WM0 LJMP N1 W1: LCALL WM1 N1: JB E0, W0 LCALL WM0 LJMP N0 W0: LCALL WM1 N0: CLR CLK CLR DIN RET ;******************************************************************* ;寫“1”子程序 ;******************************************************************* WM1: CLR CLK SETB DIN ;送出“1” NOP SETB CLK ;產(chǎn)生 CLK的上升沿 NOP NOP CLR CLK ;產(chǎn)生 CLK的下降沿 RET ;******************************************************************* ;寫“0”子程序 ;******************************************************************* WM0: CLR CLK CLR DIN ;送出“0” NOP SETB CLK ;產(chǎn)生 CLK的上升沿 NOP NOP CLR CLK ;產(chǎn)生 CLK的下降沿 RET 。玻兀玻担埃矗档某跏蓟白x寫子程序 ;X25045引腳定義如下 SCK EQU P2.3 ;串行時(shí)鐘輸入 SI EQU P2.4 ;串行數(shù)據(jù)輸入 SO EQU P2.6 ;串行數(shù)據(jù)輸出 CS EQU P2.7 ;片選輸入 ;其中寫保護(hù)輸入WP始終接高電平 ;狀態(tài)寄存器及各命令字節(jié)定義 STATUS_REG EQU #00010000B ;上述狀態(tài)寄存器中的WD1=0,WD0=1,即看門狗周期為600ms ;另外,BL1=0,BL0=0 READ_INST EQU #00000011B WRITE_INST EQU #00000010B RDSR_INST EQU #00000101B WREN_INST EQU #00000110B WRSR_INST EQU #00000001B WRDI_INST EQU #00000100B ;******************************************************************* ;寫 1字節(jié)數(shù)據(jù)到 X25045中的子程序WRONE ;數(shù)據(jù)在 A中,地址在 DPTR中 ;占用寄存器:ACC,DPTR ;******************************************************************* WRONE: PUSH ACC ;待寫數(shù)據(jù)保護(hù) LCALL WREN ;WRITE ENABLE. CLR SCK ;X25045的 SCK置低 CLR CS ;片選 CS置低,選中 MOV A, WRITE_INST MOV B, DPH MOV C, B.0 MOV ACC.3, C ;DPH的最低位 (A8)送 ACC.3 LCALL OUTBYT ;送含地址高位的寫命令 MOV A, DPL LCALL OUTBYT ;送低 8位地址 POP ACC LCALL OUTBYT ;寫一字節(jié)數(shù)據(jù) CLR SCK ;X25045的 SCK置低 STEB CS ;片選 CS置高 ,無效 RET ;******************************************************************* ;設(shè)置寫使能鎖存器WREN子程序( 即允許寫操作) ;******************************************************************* WREN: CLR CS CLR SCK MOV A,WREN_INST LCALL OUTBYT ;送寫使能命令 WREN SETB CS CLR SCK RET ;******************************************************************* ;給 X25045寫入 1字節(jié)地址或數(shù)據(jù)子程序OUTBYT ;欲寫內(nèi)容在 A中 ;占用寄存器:ACC,B ;******************************************************************* OUTBYT: MOV B,#08H ;置循環(huán)次數(shù) 8 OUTBYT1: CLR SCK RLC A ;Acc的最高位送 Cy MOV SI, C ;Cy送 X25045的 SI SETB SCK DJNZ B,OUTBYT1 ;循環(huán) 8次,8bits CLR SI ;X25045的 SI置低 CLR SCK RET
;******************************************************************* ;功能:讀X25045狀態(tài)寄存器,等待內(nèi)部寫 ;入口條件:R6的數(shù)據(jù)是等待延時(shí)時(shí)間 ;出口信息:WIP=1,正在寫,WIP=0寫完成 ;占用資源:R6、A、B、PSW ;******************************************************************* RDS045: MOV R6,0FFH ;循環(huán)次數(shù)送入R6 RDS01: CLR SCK NOP CLR CS ;選中X25045 NOP MOV A,RDSR_INST ;05H,讀X25045狀態(tài)寄存器命令送A LCALL OUTBYT ;調(diào)用X25045寫入1個(gè)字節(jié)子程序 LCALL INBYT ;調(diào)用X25045讀出1個(gè)字節(jié)子程序 SETB CS ;不選中X25045 JNB ACC.0,DS02 ;WIP=1, 正在寫, WIP=0寫完成 DJNZ R6,DS01 RDS02: RET ;******************************************************************* ;功 能: 向X25045寫入一批數(shù)據(jù)子程序W045 ;入口條件: R0的內(nèi)容為CPU內(nèi)存的地址 ; R1的內(nèi)容是X25045的待寫地址,R3是待寫數(shù)據(jù)的長(zhǎng)度 ; R4的內(nèi)容是02H或0AH,表示寫命令的執(zhí)行區(qū)域 ;出口信息: R3的內(nèi)容為0 ;占用資源:A、B、PSW、R0、R1、R2、R3、R4 ;******************************************************************* W045: CLR SCK NOP CLR CS NOP MOV A,WREN_INST ;#06H,寫允許命令送入A LCALL OUTBYT ;調(diào)用向X25045寫入1個(gè)字節(jié)子程序 SETB CS NOP CLR CS MOV A,R4 ;命令送入A LCALL OUTBYT ;調(diào)用X25045寫入1個(gè)字節(jié)子程序 MOV A,R1 ;X25045的首地址送入A LCALL OUTBYT ;調(diào)用25045 寫入1個(gè)字節(jié)子程序 W0450: MOV A,@R0 ;待寫數(shù)據(jù)送入A LCALL OUTBYT ;調(diào)用X25045寫入1個(gè)字節(jié)子程序 INC R0 ;調(diào)整CPU內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)的位置 DJNZ R3,W0450 ;判斷這批數(shù)據(jù)是否寫完 SETB CS ;批量數(shù)據(jù)寫完,不選中X25045 RET ;******************************************************************* ;功 能: 向X25045讀出一批數(shù)據(jù)子程序 ;入口條件: R0的內(nèi)容為CPU內(nèi)存的地址 R1的內(nèi)容是X25045的待寫地址,R3是待寫數(shù)據(jù)的長(zhǎng)度 R4的內(nèi)容是03H或0BH,表示寫命令的執(zhí)行區(qū)域 ;出口信息: R3的內(nèi)容為0 ;占用資源: A、B、PSW、R0、R1、R2、R3、R4 ;******************************************************************* R045: CLR SCK NOP CLR CS NOP MOV A,R4 ;命令送入A LCALL OUTBYT ;25045寫入8個(gè)字節(jié)子程序 MOV A,R1 ;對(duì)X25045的操作首地址送入 A LCALL OUTBYT ;25045寫入8個(gè)字節(jié)子程序 R0451: LCALL INBYT ;調(diào)用讀出8位數(shù)據(jù)子程序 MOV @R0,A ;讀出的數(shù)據(jù)送入CPU內(nèi)存 INC R0 ;調(diào)整CPU內(nèi)部存放數(shù)據(jù)的位置 DJNZ R3,R0451 ;數(shù)據(jù)未讀完,跳轉(zhuǎn) SETB CS ;數(shù)據(jù)讀完,不選中X25045 RET ;******************************************************************* ;功能: 從X25045中讀出8位數(shù)據(jù)子程序 ;出口信息:A的內(nèi)容為讀出的8位數(shù)據(jù) ;占用資源:B、PSW ;******************************************************************* INBYT: MOV B,#08H INBYT: CLR SCK NOP MOV C,SO NOP SETB SCK RLC A NOP DJNZ B,INBYT CLR SCK RET
3.DS1302的初始化及讀寫子程序 ;********************************************************* T_CLK EQU P3.3 ;實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳T_IO EQU P3.4 ;實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳T_RST EQU P3.2 ;實(shí)時(shí)時(shí)鐘復(fù)位線引腳;******************************************************************* ;子程序名:Set1302 ;功 能:設(shè)置DS1302 初始時(shí)間,并啟動(dòng)計(jì)時(shí)。 ;說 明: ;調(diào) 用: RTInputByte ;入口參數(shù):初始時(shí)間在:Second,Minute,Hour,Day,Month,Week,YearL ; (地址連續(xù)) ;返 回 值:無 ;影響資源:A B R0 R1 R4 R7 ;******************************************************************* Set1302: CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL RTInputByte MOV B,#00H ;寫操作前WP=0 LCALL RTInputByte SETB T_CLK CLR T_RST MOV R0,#Second; MOV R7,#7 ;秒 分 時(shí) 日 月 星期 年 MOV R1,#80H ;秒寫地址 Set13021: CLR T_RST CLR T_CLK SETB T_RST MOV B,R1 ;寫秒 分 時(shí) 日 月 星期 年 地址 LCALL RTInputByte MOV A,@R0 ;寫秒數(shù)據(jù) MOV B,A LCALL RTInputByte INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7,Set13021 CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL RTInputByte MOV B,#80H ;控制,WP=1,寫保護(hù) LCALL RTInputByte SETB T_CLK CLR T_RST RET ;******************************************************************* ;子程序名:Get1302 ;功 能:從DS1302 讀時(shí)間 ;說 明: ;調(diào) 用:RTInputByte,RTOutputByte ;入口參數(shù):時(shí)間保存在:Second,Minute,Hour,Day,Month,Week,YearL ;返 回 值:無 ;影響資源:A B R0 R1 R4 R7 ;******************************************************************* Get1302: MOV R0, #Second MOV R7, #7 MOV R1, #81H ;秒地址 Get13021: CLR T_RST CLR T_CLK SETB T_RST MOV B, R1 ;秒 分 時(shí) 日 月 星期 年 地址 LCALL RTInputByte LCALL RTOutputByte MOV @R0, A ;秒 INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7, Get13021 RET ;******************************************************************* ;寫1302一字節(jié)子程序 ;******************************************************************* RTInputByte: MOV R4, #8 Inbit1: MOV A, B RRC A MOV B, A MOV T_IO, C SETB T_CLK CLR T_CLK DJNZ R4, Inbit1 RET ;******************************************************************* ;讀1302一字節(jié) 子程序 ;******************************************************************* RTOutputByte: MOV R4, #8 Outbit1: MOV C, T_IO RRC A SETB T_CLK CLR T_CLK DJNZ R4, Outbit1 RET
;******************************************************************* ;發(fā)送接收控制信號(hào) SFCTRL EQU P1.7 ;本通信節(jié)點(diǎn)地址定義 ADDRESS EQU 01H ;通信所需變量定義 ;******************************************************************* ;主程序串行通信的初始化 MAIN: MOV SP, #60H MOV PCON, #00H ;SMODE=0 MOV TMOD, #20H ;定時(shí)器1設(shè)為模式2(波特率發(fā)生器) CLR EA MOV TH1, #0F3H ;定時(shí)起始值,6MHz晶振時(shí)波特率1200bps MOV TL1, #0F3H MOV SCON, #0D8H ;串行口模式3,TB8=1發(fā)送地址呼叫 SETB TR1 ;啟動(dòng)定時(shí)器1 SETB EA (其他初始化) (其他處理程序) ; TX: SETB RS0 ;選擇1組工作寄存器 PUSH ACC CLR RI ;清接收標(biāo)志 CLR ES ;關(guān)閉串行口中斷 CLR SFCTRL ;使485處于接收方式 MOV A,SBUF ;接收數(shù)據(jù) MOV B,A ;數(shù)據(jù)暫存 XRL A,#0FFH ;判是否是復(fù)位命令(字節(jié)0FFH) JNZ TX_1 ;不是,則轉(zhuǎn) SETB SM2 ;是,則進(jìn)行軟復(fù)位處理 SETB ES (設(shè)置系統(tǒng)軟復(fù)位標(biāo)志以便系統(tǒng)進(jìn)行軟復(fù)位處理) POP ACC ;恢復(fù)現(xiàn)場(chǎng) CLR RS0 RETI TX_1: MOV A,B ;取出數(shù)據(jù)以判是否呼叫本機(jī) CJNE A,#ADDRESS,TX_2 SJMP TX_3 TX_2: SETB ES ;不是,則中斷返回 POP ACC ;恢復(fù)現(xiàn)場(chǎng) CLR RS0 RETI TX_3: CLR SM2 SETB SFCTRL ;使485處于發(fā)送狀態(tài) MOV A,#ADDRESS ;用本機(jī)地址作為應(yīng)答 MOV SBUF,A TX_4: JNB TI,TX_4 ;等待發(fā)送完成 CLR TI CLR SFCTRL ;使485恢復(fù)接收狀態(tài) (下面開始接收并進(jìn)行相應(yīng)處理) ... SETB ES POP ACC ;恢復(fù)現(xiàn)場(chǎng) CLR RS0 RETI
本站部分文章來自網(wǎng)絡(luò),如發(fā)現(xiàn)侵犯了您的權(quán)益,請(qǐng)聯(lián)系指出,本站及時(shí)確認(rèn)刪除 E-mail:349991040@qq.com
論文格式網(wǎng)(www.donglienglish.cn--論文格式網(wǎng)拼音首字母組合)提供其他論文畢業(yè)論文格式,論文格式范文,畢業(yè)論文范文