|
電風(fēng)扇定時(shí)時(shí)間60分鐘覺(jué)得短了些,如果一直開(kāi)的話(huà),吹到天亮人也難受,能定時(shí)個(gè)三四小時(shí)比較合適,手頭上有若干閑置了十余年的STC89C51RC,所以就用它來(lái)制作個(gè)長(zhǎng)定時(shí)器,使用EC11帶開(kāi)關(guān)旋轉(zhuǎn)編碼器調(diào)時(shí)間,很便宜,一塊多錢(qián)一只還包郵,也可以用按鍵代替編碼器,只是調(diào)時(shí)間的時(shí)候不如編碼器那么方便快捷,顯示用TM1637四位數(shù)碼管顯示模塊,3塊錢(qián)包郵,便宜又好用,它能顯示到99小時(shí),所以最長(zhǎng)定時(shí)可達(dá)99小時(shí)59分59秒,雖然實(shí)際使用不需要那么長(zhǎng)的定時(shí)。制作好后不對(duì)電風(fēng)扇作任何改動(dòng),只是把雙向可控硅的T1、T2分別與原定時(shí)器那兩根線(xiàn)接好就可以了,也就是與原定時(shí)器并聯(lián),把原定時(shí)器調(diào)到OFF位置。單片機(jī)改用其他型號(hào)的話(huà),需要改動(dòng)一些地方,如EEPROM操作、扇區(qū)地址、數(shù)量、特殊功能寄存器地址、看門(mén)狗預(yù)分頻數(shù)等等.
電路原理圖如下:
電路接線(xiàn)圖.JPG (89.95 KB, 下載次數(shù): 106)
下載附件
2020-7-10 23:37 上傳
單片機(jī)源程序如下:
- ;===================================================================================
- ;TM1637顯示模塊,EC11編碼器,電風(fēng)扇長(zhǎng)定時(shí)+自然風(fēng)匯編程序
- ;楊小強(qiáng),2020年6月
- ;單片機(jī):STC89C51RC,晶振:11.0592MHz
- ;顯示:(TM1637)4位數(shù)碼管顯示模塊
- ;調(diào)整、設(shè)置:EC11帶開(kāi)關(guān)5腳旋轉(zhuǎn)編碼器,也可以用按鍵代替
- ;電源:閑置5V手機(jī)充電器
- ;
- ;最長(zhǎng)定時(shí)99小時(shí)59分59秒,簡(jiǎn)單的采用間歇通/斷電方式模擬自然風(fēng),周期可調(diào),用可控硅控制通斷。
- ;
- ;按編碼器開(kāi)關(guān)1次:正常/自然風(fēng)切換,自然風(fēng)狀態(tài)時(shí)LED指示燈亮,可控硅間歇通斷電
- ;按編碼器開(kāi)關(guān)2次:定時(shí)時(shí)間清零,風(fēng)扇電機(jī)斷電,兩次按鍵動(dòng)作之間不大于0.6秒
- ;
- ;長(zhǎng)按編碼器開(kāi)關(guān)5秒以上15秒以?xún)?nèi),松開(kāi)按鍵后進(jìn)入設(shè)置狀態(tài),退出設(shè)置狀態(tài):設(shè)置完第五項(xiàng)后按編碼器開(kāi)關(guān)、或任意一
- ;項(xiàng)中停15秒無(wú)任何操作,就自動(dòng)保存并退出。根據(jù)數(shù)碼管左邊顯示的數(shù)字進(jìn)行以下各項(xiàng)設(shè)置,通過(guò)旋轉(zhuǎn)編碼器加或減,
- ;按編碼器開(kāi)關(guān)進(jìn)入下一項(xiàng)設(shè)置:
- ;一、顯示1——設(shè)置自然風(fēng)狀態(tài)時(shí),通斷電周期時(shí)長(zhǎng),5~30秒,默認(rèn)為10秒
- ;二、顯示2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng),最短為2秒;最長(zhǎng)為上一項(xiàng)所設(shè)的周期減3秒,比如上一項(xiàng)設(shè)置的周期為10秒,
- ; 則本項(xiàng)最多可以設(shè)置到7秒;
- ;三、顯示3——設(shè)置3小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一格的增(減)值:5、10、15、20、25、30分鐘,默認(rèn)10分鐘,
- ; 3小時(shí)以上增(減)值30分鐘;10小時(shí)以上增(減)值1個(gè)小時(shí);20小時(shí)以上增(減)值2個(gè)小時(shí)
- ;四、顯示4——設(shè)置電風(fēng)扇插電就自動(dòng)填入的定時(shí)時(shí)間,0~30小時(shí),默認(rèn)8小時(shí)
- ;五、顯示5——設(shè)置數(shù)碼管亮度,1~8級(jí),默認(rèn)為3級(jí)
- ;
- ;長(zhǎng)按編碼器開(kāi)關(guān)15秒:恢復(fù)各項(xiàng)默認(rèn)設(shè)置,數(shù)碼管顯示88:88
- ;
- ;設(shè)置保存失敗顯示5秒E1
- ;
- ;--------------------------- 端口定義 ---------------------------
- CLK EQU P1.5 ;接顯示模塊TM1637的CLK
- DIO EQU P1.6 ;接顯示模塊TM1637的DIO
- EC11A EQU P3.2 ;接編碼器的A引腳,外部中斷INT0,也可以接一個(gè)按鍵代替
- EC11B EQU P3.3 ;接編碼器的B引腳,外部中斷INT1,也可以接一個(gè)按鍵代替
- EC11K EQU P3.4 ;接編碼器的按鍵開(kāi)關(guān)引腳
- RLED EQU P0.4 ;只要發(fā)生過(guò)復(fù)位就一直保持低電平,如有需要可接上LED方便觀察
- LED EQU P0.5 ;自然風(fēng)狀態(tài)LED指示燈,低電平亮
- MOC EQU P0.7 ;接MOC3022光控可控硅,低電平時(shí)風(fēng)扇電機(jī)通電
- ;--------------------------- 位地址及RAM的使用 ---------------------------
- ;(20H)第0位:1=編碼器已經(jīng)轉(zhuǎn)動(dòng),等待主程序處理,0=沒(méi)有轉(zhuǎn)動(dòng)或主程序已處理
- ;(20H)第1位:1=編碼器順時(shí)針正轉(zhuǎn);0=編碼器逆時(shí)針?lè)崔D(zhuǎn)
- ;(20H)第2位:1=自然風(fēng)狀態(tài);0=正常狀態(tài)
- ;(20H)第3位:1=禁止;0=允許。進(jìn)行各項(xiàng)設(shè)置時(shí)使用,允許/禁止檢查剩余時(shí)間
- ;(20H)第4位:1=閃爍顯示;0=不閃爍。進(jìn)行各項(xiàng)設(shè)置時(shí)用
- ;(20H)第5位:1=不顯示,0=顯示,數(shù)字及冒號(hào)閃爍時(shí)用,由T0中斷每0.5秒取反一次
- ;(20H)第6位:1=顯示3秒88:88;0=正常
- ;(20H)第7位:1=顯示5秒E1;0=正常
- FWBZ1 EQU 022H ;復(fù)位判斷標(biāo)志1,也作EEPROM數(shù)據(jù)判斷標(biāo)志
- FWBZ2 EQU 023H ;復(fù)位判斷標(biāo)志2,也作EEPROM數(shù)據(jù)判斷標(biāo)志
- ZRFZQ EQU 024H ;自然風(fēng)時(shí)通斷電周期時(shí)長(zhǎng)
- ZRFSJ EQU 025H ;自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
- BMQZJ EQU 026H ;編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值
- SDDS EQU 027H ;上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))
- SMGLD EQU 028H ;數(shù)碼管亮度
- DSSJS EQU 029H ;定時(shí)時(shí)間,時(shí)
- DSSJF EQU 02AH ;定時(shí)時(shí)間,分
- DSSJM EQU 02BH ;定時(shí)時(shí)間,秒
- ZQ EQU 02CH ;T0中斷使用,自然風(fēng)通斷電周期時(shí)長(zhǎng)
- SJ EQU 02DH ;T0中斷使用,自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
- SJJS EQU 02EH ;時(shí)間計(jì)數(shù),每10毫秒減1,為0后定時(shí)時(shí)間減1秒,重新把HMJS處定義的計(jì)數(shù)值放入這里
- MJS EQU 02FH ;按鍵處理時(shí)用,秒計(jì)數(shù),每秒減1,直到為0
- SSSC EQU 030H ;閃爍時(shí)長(zhǎng),每秒減1,直到為0
- XSHC1 EQU 031H ;上次顯示的內(nèi)容,與當(dāng)前不同就立即顯示,相同就每0.5秒顯示一次
- XSHC2 EQU 032H ;上次顯示的內(nèi)容,與當(dāng)前不同就立即顯示,相同就每0.5秒顯示一次
- XXSZ EQU 033H ;下限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
- SXSZ EQU 034H ;上限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
- ZXM1 EQU 035H ;顯示用,待發(fā)送到TM1637的字形碼1
- ZXM2 EQU 036H ;顯示用,待發(fā)送到TM1637的字形碼2
- ZXM3 EQU 037H ;顯示用,待發(fā)送到TM1637的字形碼3
- ZXM4 EQU 038H ;顯示用,待發(fā)送到TM1637的字形碼4
- DSZJ EQU 039H ;加減定時(shí)時(shí)間使用
- DISPL EQU 03AH ;設(shè)置要顯示的目標(biāo):
- ;0=顯示定時(shí)時(shí)間
- ;1=顯示1——設(shè)置自然風(fēng)狀態(tài)時(shí)的通斷電周期時(shí)長(zhǎng)
- ;2=顯示2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
- ;3=顯示3——設(shè)置3小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值
- ;4=顯示4——設(shè)置上電自動(dòng)填入的定時(shí)時(shí)間
- ;5=顯示5——設(shè)置數(shù)碼管亮度
- ;--------------- 看門(mén)狗、EEPROM特殊功能寄存器地址 ---------------
- AUXR EQU 08EH ;輔助寄存器
- WDT_CONTR EQU 0E1H ;看門(mén)狗地址
- IAP_DATA EQU 0E2H ;數(shù)據(jù)寄存器,讀出、寫(xiě)入的數(shù)據(jù)放在此處
- IAP_ADDRH EQU 0E3H ;地址寄存器高八位
- IAP_ADDRL EQU 0E4H ;地址寄存器低八位
- IAP_CMD EQU 0E5H ;命令寄存器,0=關(guān)閉,1=讀,2=寫(xiě),3=擦除
- IAP_TRIG EQU 0E6H ;命令觸發(fā)寄存器,每次操作先放入46H再放入B9,命令立即被觸發(fā)起動(dòng)
- IAP_CONTR EQU 0E7H ;控制寄存器,F(xiàn)lash操作允許/禁止及等待時(shí)間
- ENABLE_IAP EQU 083H ;定義Flash操作等待時(shí)間及允許IAP/ISP/EEPROM操作的常數(shù),時(shí)鐘<12MHz時(shí)為83H
- ;==========================================================================
- ORG 0000H
- LJMP START
- ORG 0003H ;外部中斷INT0入口
- LJMP INT_0 ;外部中斷INT0入口
- ORG 000BH ;T0中斷入口
- LJMP T0INT ;T0中斷入口
- ORG 0013H ;外部中斷INT1入口
- LJMP INT_1 ;外部中斷INT1入口
- ORG 0030H ;程序代碼始址安排在30H
- ;------------------------------------------------------------------------------------------------
- ;定義時(shí)間計(jì)數(shù)值,當(dāng)定時(shí)時(shí)間實(shí)際走時(shí)誤差較大時(shí),可調(diào)整此數(shù)值使誤差減小
- ;例如每分鐘快7秒,就把此數(shù)值改為112D(7秒÷60秒×100≈12,12+100=112);每分鐘慢6秒,就
- ;把此數(shù)值改為90D(6秒÷60秒×100=10,100-10=90)
- ;------------------------------------------------------------------------------------------------
- HMJS: DB 100D ;定義時(shí)間計(jì)數(shù)值,100表示100×10毫秒=1秒,后面的D表示是十進(jìn)制數(shù)
- ;--------------- 定時(shí)器0中斷(10毫秒產(chǎn)生一次中斷) ---------------
- T0INT: PUSH ACC
- PUSH PSW
- LCALL TIME ;處理各項(xiàng)時(shí)間
- LCALL Control ;根據(jù)條件控制自然風(fēng)LED指示燈和可控硅(或繼電器)
- LCALL DISPLAY ;顯示
- POP PSW
- POP ACC
- RETI
- ;--------------- 外部中斷INT0,P3.2接編碼器A引腳 ---------------
- INT_0: PUSH PSW
- JB 00H,INT0_1 ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
- SETB 00H ;把位地址00H置為1,表示編碼器已轉(zhuǎn)動(dòng),等待主程序處理
- SETB 01H ;是順時(shí)針正轉(zhuǎn),把位地址01H置為1
- INT0_1: POP PSW
- RETI
- ;--------------- 外部中斷INT1,P3.3接編碼器B引腳 ---------------
- INT_1: PUSH PSW
- JB 00H,INT1_1 ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
- SETB 00H ;把位地址00H置為1,表示編碼器已轉(zhuǎn)動(dòng),等待主程序處理
- CLR 01H ;是逆時(shí)針?lè)崔D(zhuǎn),把位地址01H置為0
- INT1_1: POP PSW
- RETI
- ;--------------- 設(shè)置各項(xiàng)默認(rèn)值 ----------------
- SZMRZ: MOV ZRFZQ,#10 ;自然風(fēng)狀態(tài)時(shí),通斷電周期時(shí)長(zhǎng)(秒)
- MOV ZRFSJ,#5 ;自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)(秒)
- MOV BMQZJ,#10 ;編碼器每轉(zhuǎn)動(dòng)一小格的+、-值(分鐘))
- MOV SDDS,#8 ;上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))
- MOV SMGLD,#3 ;數(shù)碼管亮度,8級(jí)亮度最高
- RET
- ;--------------- T0、INT0、INT1中斷設(shè)置 ----------------
- SETINT: ANL AUXR,#7FH ;定時(shí)器時(shí)鐘12T模式
- ANL TMOD,#0F0H ;設(shè)置定時(shí)器模式
- MOV TL0,#000H ;設(shè)置定時(shí)初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
- MOV TH0,#0DCH ;設(shè)置定時(shí)初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
- CLR TF0 ;清除TF0標(biāo)志
- SETB ET0 ;允許定時(shí)器0中斷
- SETB TR0 ;定時(shí)器0開(kāi)始計(jì)時(shí)
- SETB IT0 ;設(shè)外部中斷INT0為下降沿觸發(fā)
- SETB EX0 ;允許外部中斷INT0
- SETB IT1 ;設(shè)外部中斷INT1為下降沿觸發(fā)
- SETB EX1 ;允許外部中斷INT1
- SETB EA ;允許全局中斷
- RET
- ;--------------- 啟動(dòng)看門(mén)狗及喂狗,11.0592MHz預(yù)分頻數(shù)=4(142.2毫秒),00111001B(39H) ----------------
- WG: MOV WDT_CONTR,#00111001B
- RET
- ;******************************************** 主程序開(kāi)始 ********************************************
- START: MOV SP,#050H ;設(shè)置堆棧指針
- MOV A,FWBZ1 ;
- CJNE A,#0C8H,START0 ;
- MOV A,FWBZ2 ;檢查復(fù)位判斷標(biāo)志,不相同說(shuō)明是初次上電,從初始化開(kāi)始運(yùn)行
- CJNE A,#0D9H,START0 ;
- LCALL SETINT ;中斷設(shè)置
- CLR RLED ;RAM內(nèi)容沒(méi)變,說(shuō)明是被干擾等原因復(fù)位,不是初次上電,點(diǎn)亮復(fù)位LED指示燈
- MOV A,DISPL ;
- CJNE A,#5,SAT1 ;不管是什么原因復(fù)位,只要RAM不被改變就跳過(guò)初始化,繼續(xù)運(yùn)行
- LJMP STARTB ;
- SAT1: CJNE A,#4,SAT2 ;
- LJMP STARTA ;
- SAT2: CJNE A,#3,SAT3 ;根據(jù)DISPL的內(nèi)容跳轉(zhuǎn)到復(fù)位前的位置
- LJMP START9 ;
- SAT3: CJNE A,#2,SAT4 ;
- LJMP START8 ;
- SAT4: CJNE A,#1,START2 ;
- LJMP START7 ;
- START0: CLR A
- MOV R0,#30H ;
- MOV R1,#20H ;
- START1: MOV @R1,A ;初始化,從RAM地址20H開(kāi)始清零30H個(gè)字節(jié)
- INC R1 ;
- DJNZ R0,START1 ;
- LCALL SETINT ;初始化,中斷設(shè)置
- MOV FWBZ1,#0C8H ;初始化,放入復(fù)位判斷標(biāo)志1到RAM
- MOV FWBZ2,#0D9H ;初始化,放入復(fù)位判斷標(biāo)志2到RAM
- LCALL REEP ;初始化,讀EEPROM保存的各項(xiàng)設(shè)置,如果沒(méi)有就設(shè)為默認(rèn)值并保存
- SETB RLED ;初始化,設(shè)RLED為高電平,復(fù)位LED指示燈不亮
- ;
- START2: LCALL WG ;喂狗
- MOV DISPL,#0 ;設(shè)置要顯示的目標(biāo),0=顯示定時(shí)時(shí)間
- CLR 06H ;位地址06H置為0,顯示定時(shí)時(shí)間
- CLR 07H ;位地址07H置為0,顯示定時(shí)時(shí)間
- JNB 00H,START3 ;如果位地址00H為0(編碼器沒(méi)有轉(zhuǎn)動(dòng))就轉(zhuǎn)移
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,START3 ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
- JNB EC11B,START3 ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
- LCALL DSSJZJ ;AB引腳都為高電平了,已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置,根據(jù)方向增減定時(shí)時(shí)間
- CLR 00H ;把位地址00H置為0,表示已經(jīng)響應(yīng)并處理編碼器旋轉(zhuǎn)動(dòng)作
- START3: LCALL SKEY ;掃描編碼器按鍵開(kāi)關(guān)
- JNC START2 ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
- LCALL KEY ;有按鍵動(dòng)作,調(diào)用編碼器按鍵開(kāi)關(guān)處理子程序
- CJNE A,#1,START4 ;如果不是按下1次(正常/自然風(fēng)切換)就轉(zhuǎn)移
- CPL 02H ;是按1次,位地址第02位取反,自然風(fēng)/正常狀態(tài)切換
- LJMP START2
- START4: CJNE A,#2,START5 ;如果不是2(定時(shí)時(shí)間置為零)就轉(zhuǎn)移
- LCALL DSSJQL ;是按2次,定時(shí)時(shí)間清零
- LJMP START2
- START5: CJNE A,#3,START7 ;如果不是3(恢復(fù)默認(rèn)設(shè)置)就轉(zhuǎn)移
- LCALL SZMRZ ;恢復(fù)各項(xiàng)默認(rèn)設(shè)置
- SETB 06H ;把位地址06H設(shè)置為1,數(shù)碼管顯示3秒88:88
- MOV SSSC,#3 ;3秒
- MOV ZXM1,#0FFH ;8
- MOV ZXM2,#0FFH ;8
- MOV ZXM3,#0FFH ;8
- MOV ZXM4,#0FFH ;8
- LCALL DISP ;顯示
- START6: MOV A,SSSC
- LCALL WG ;喂狗
- JNZ START6 ;等待SSSC為0秒
- LCALL WSET ;保存設(shè)置
- LCALL KEYEX ;等待按鍵松開(kāi)
- LJMP START2
- START7: MOV DISPL,#1 ;是4,進(jìn)入各項(xiàng)設(shè)置,1=顯示“1——設(shè)置自然風(fēng)狀態(tài)時(shí)通斷電周期時(shí)長(zhǎng)”
- LCALL ZQSZ ;周期時(shí)長(zhǎng)設(shè)置
- JNZ START8 ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
- LJMP START2 ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
- START8: MOV DISPL,#2 ;2=顯示“2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)”
- LCALL TDSC ;通電時(shí)長(zhǎng)設(shè)置
- JNZ START9 ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
- LJMP START2 ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
- START9: MOV DISPL,#3 ;3=顯示“3——設(shè)置2小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一格的增(減)值”
- LCALL BMQZJZ ;編碼器增減值設(shè)置
- JNZ STARTA ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
- LJMP START2 ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
- STARTA: MOV DISPL,#4 ;4=顯示“4——設(shè)置插電自動(dòng)填入的定時(shí)時(shí)間”
- LCALL SDDSSJ ;上電定時(shí)時(shí)間設(shè)置(小時(shí))
- JNZ STARTB ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
- LJMP START2 ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
- STARTB: MOV DISPL,#5 ;5=顯示“5——設(shè)置數(shù)碼管亮度”
- LCALL LDSZ ;亮度設(shè)置
- LJMP START2
- ;--------------------------------------------------------------------------------------------------------
- ;子程序:根據(jù)編碼器旋轉(zhuǎn)方向加減定時(shí)時(shí)間。
- ;3小時(shí)及以下,按設(shè)置的值加減:5、10、15、20、25、30分鐘
- ;3小時(shí)以上每次增(減)30分鐘;10小時(shí)以上每次增(減)1個(gè)小時(shí);20小時(shí)以上每次增(減)2個(gè)小時(shí)
- ;--------------------------------------------------------------------------------------------------------
- DSSJZJ: MOV DSSJM,#59 ;先放入59到定時(shí)時(shí)間(秒)
- MOV A,DSSJS ;裝入定時(shí)時(shí)間(時(shí))
- CJNE A,#20,DSZJ1 ;當(dāng)前“時(shí)”是否等于或大于20
- DSZJ1: JC DSZJ2 ;小于就轉(zhuǎn)移
- MOV DSZJ,#2 ;等于或大于20,加減2個(gè)小時(shí)
- LJMP DSZJ4
- DSZJ2: CJNE A,#10,DSZJ3 ;當(dāng)前“時(shí)”是否等于或大于10
- DSZJ3: JC DSZJ8 ;小于就轉(zhuǎn)移
- MOV DSZJ,#1 ;等于或大于10,加減1個(gè)小時(shí)
- DSZJ4: JNB 01H,DSZJ6 ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
- ADD A,DSZJ ;是正轉(zhuǎn),加
- CJNE A,#100,DSZJ5 ;加完后是否等于或大于100
- DSZJ5: JC DSZJ7 ;如果小于就轉(zhuǎn)移,把A放回到DSSJS
- MOV DSSJS,#99 ;已經(jīng)大于99了,直接設(shè)置為99:59:59
- MOV DSSJF,#59 ;已經(jīng)大于99了,直接設(shè)置為99:59:59
- RET
- DSZJ6: SUBB A,DSZJ ;是反轉(zhuǎn),減
- DSZJ7: MOV DSSJS,A ;把計(jì)算結(jié)果放入DSSJS
- RET
- DSZJ8: MOV DSZJ,BMQZJ ;把設(shè)置的“增(減)值”放入DSZJ
- CJNE A,#3,DSZJ11 ;當(dāng)前“時(shí)”不是3就轉(zhuǎn)移
- JB 01H,DSZJ12 ;是3,如果位地址01H為1(正轉(zhuǎn))就轉(zhuǎn)移,把DSZJ處的“增(減)值”改為30(分鐘)
- MOV A,DSSJF ;是反轉(zhuǎn),裝入定時(shí)時(shí)間(分)
- JZ DSZJ13 ;如果當(dāng)前“分”為0(3:00)就轉(zhuǎn)移,按設(shè)置的增(減)值減
- CJNE A,#30,DSZJ9 ;“分”不為0,是否等于或大于30
- DSZJ9: JC DSZJ10 ;小于就轉(zhuǎn)移,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
- SUBB A,#30 ;等于或大于,減30分
- MOV DSSJF,A ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
- RET
- DSZJ10: MOV DSSJF,#0 ;小于30,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
- RET
- DSZJ11: JC DSZJ13 ;小于3就轉(zhuǎn)移
- DSZJ12: MOV DSZJ,#30 ;大于3:00,把DSZJ處的“增(減)值”改為30(分鐘)
- DSZJ13: MOV A,DSSJF ;裝入定時(shí)時(shí)間(分)
- JNB 01H,DSZJ16 ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
- ADD A,DSZJ ;是正轉(zhuǎn),當(dāng)前“分”直接加DSZJ處的“增(減)值”
- CJNE A,#60,DSZJ14 ;加完后“分”是否等于或大于60
- DSZJ14: JC DSZJ15 ;小于60就轉(zhuǎn)移,把A放入定時(shí)時(shí)間(分)
- SUBB A,#60 ;等于或大于60,就減60,然后小時(shí)加1
- MOV DSSJF,A ;把A放入定時(shí)時(shí)間(分)
- MOV A,DSSJS ;裝入“時(shí)”
- INC A ;小時(shí)加1
- MOV DSSJS,A
- CJNE A,#3,DSZJ19 ;加完后“時(shí)”不是3就轉(zhuǎn)移,退出
- CLR A ;加完后大于3:00了,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
- DSZJ15: MOV DSSJF,A
- RET
- DSZJ16: CJNE A,DSZJ,DSZJ17 ;是逆時(shí)針?lè)崔D(zhuǎn),當(dāng)前“分”是否等于或大于DSZJ處的“增(減)值”
- DSZJ17: JC DSZJ20 ;小于就轉(zhuǎn)移
- SUBB A,DSZJ ;等于或大于,定時(shí)時(shí)間(分)減“增(減)值”
- MOV DSSJF,A ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
- JZ DSZJ18 ;如果“分”為0就轉(zhuǎn)移
- RET
- DSZJ18: CJNE A,DSSJS,DSZJ19 ;如果“時(shí)”不為0就轉(zhuǎn)移
- MOV DSSJM,A ;“時(shí)、分”都為0,“秒”也清零
- DSZJ19: RET
- DSZJ20: MOV A,DSZJ ;“分”小于“增(減)值”,裝入DSZJ處的“增(減)值”
- CLR C ;進(jìn)位標(biāo)志清0
- SUBB A,DSSJF ;“增(減)值”減“定時(shí)時(shí)間(分)”
- MOV DSSJF,A ;減完后的結(jié)果暫時(shí)放入DSSJF
- MOV A,#60
- SUBB A,DSSJF ;60減上面的計(jì)算結(jié)果,得出定時(shí)時(shí)間(分),然后小時(shí)減1
- MOV DSSJF,A ;得出的數(shù)放入定時(shí)時(shí)間(分)
- MOV A,DSSJS ;裝入定時(shí)時(shí)間(時(shí))
- JZ DSSJQL ;如果“時(shí)”為0就轉(zhuǎn)移(不夠減了,把定時(shí)時(shí)間清零)
- DEC DSSJS ;“時(shí)”不為0,減1
- RET
- DSSJQL: CLR A
- MOV DSSJS,A ;定時(shí)時(shí)間清零
- MOV DSSJF,A ;定時(shí)時(shí)間清零
- MOV DSSJM,A ;定時(shí)時(shí)間清零
- RET
- ;----------------------------------------------------------------------------------------
- ;設(shè)置自然風(fēng)通斷電周期時(shí)長(zhǎng),5~30秒
- ;----------------------------------------------------------------------------------------
- ZQSZ: MOV XXSZ,#5 ;下限為5秒
- MOV SXSZ,#30 ;上限為30秒
- LJMP LDSZ1
- ;----------------------------------------------------------------------------------------
- ;設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng),最短為2秒;最長(zhǎng)為上一項(xiàng)(自然風(fēng)通斷電周期)所設(shè)的周期減3秒
- ;----------------------------------------------------------------------------------------
- TDSC: MOV A,ZRFZQ ;裝入“自然風(fēng)通斷電周期”
- SUBB A,#3 ;減3秒
- MOV SXSZ,A ;放入上限值
- MOV XXSZ,#2 ;下限為2秒
- LJMP LDSZ1
- ;----------------------------------------------------------------------------------------
- ;設(shè)置2小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值,5、10、15、20、25、30分鐘
- ;----------------------------------------------------------------------------------------
- BMQZJZ: MOV XXSZ,#5 ;下限為5
- MOV SXSZ,#30 ;上限為30
- MOV R4,#5 ;調(diào)整時(shí)的加減步長(zhǎng)值
- LJMP SZTZ
- ;----------------------------------------------------------------------------------------
- ;設(shè)置插電就自動(dòng)填入的定時(shí)時(shí)間,0~30小時(shí)
- ;----------------------------------------------------------------------------------------
- SDDSSJ: MOV XXSZ,#0 ;下限為0小時(shí)
- MOV SXSZ,#30 ;上限為30小時(shí)
- LJMP LDSZ1
- ;----------------------------------------------------------------------------------------
- ;設(shè)置數(shù)碼管亮度,1~8級(jí),8級(jí)亮度最高
- ;----------------------------------------------------------------------------------------
- LDSZ: MOV XXSZ,#1 ;下限為1
- MOV SXSZ,#8 ;上限為8
- LDSZ1: MOV R4,#1 ;調(diào)整時(shí)的加減步長(zhǎng)值
- LJMP SZTZ
- ;----------------------------------------------------------------------------------------
- ;子程序:根據(jù)XXSZ、SXSZ設(shè)定的上下限范圍、編碼器旋轉(zhuǎn)方向,調(diào)整DISPL指向的對(duì)象。
- ;無(wú)操作10秒后開(kāi)始閃爍顯示,15秒自動(dòng)保存并退出;有按鍵動(dòng)作就保存并退出
- ;入口參數(shù):下限值放入XXSZ;上限值放入SXSZ;R4=加、減步長(zhǎng)值
- ;出口參數(shù):15秒無(wú)操作自動(dòng)保存退出A=0;按編碼器按鍵開(kāi)關(guān)保存退出A=1
- ;----------------------------------------------------------------------------------------
- SZTZ: MOV MJS,#15 ;放入15秒
- CLR 03H ;位地址03H置為0,允許檢查剩余時(shí)間
- SZTZ1: LCALL SKEY ;掃描編碼器按鍵開(kāi)關(guān)
- JNC SZTZ2 ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
- CLR 04H ;有按鍵動(dòng)作,把位地址04H置為0,不閃爍顯示
- LCALL WSET ;保存設(shè)置
- LCALL KEYEX ;等待按鍵松開(kāi)
- LCALL SKEY1 ;延時(shí)10毫秒
- LCALL SKEY1 ;
- LCALL SKEY1 ;共延時(shí)30毫秒
- MOV A,#1 ;按編碼器按鍵開(kāi)關(guān)保存退出A=1
- RET
- SZTZ2: JB 00H,SZTZ4 ;如果位地址00H為1(編碼器已經(jīng)轉(zhuǎn)動(dòng))就轉(zhuǎn)移
- MOV A,MJS ;沒(méi)有轉(zhuǎn)動(dòng),裝入秒計(jì)數(shù)到寄存器A
- JZ SZTZ3 ;如果秒計(jì)數(shù)為0(15秒無(wú)操作)就轉(zhuǎn)移
- JB 03H,SZTZ1 ;不為0,如果位地址03H為1就轉(zhuǎn)移,不檢查剩余時(shí)間
- CJNE A,#5,SZTZ1 ;檢查剩余時(shí)間,如果不是5秒就轉(zhuǎn)移,繼續(xù)掃描編碼器
- SETB 04H ;還剩5秒,把位地址04H置為1,設(shè)置為閃爍顯示
- MOV SSSC,A ;閃爍時(shí)長(zhǎng)5秒放入SSSC
- SETB 03H ;位地址03H置為1,禁止檢查剩余時(shí)間
- LJMP SZTZ1
- SZTZ3: CLR 04H ;15秒時(shí)間到,把位地址04H置為0,不閃爍顯示
- LCALL WSET ;保存設(shè)置
- CLR A ;15秒無(wú)操作自動(dòng)保存退出A=0
- RET
- SZTZ4: CLR 04H ;編碼器已經(jīng)轉(zhuǎn)動(dòng),把位地址04H置為0,不閃爍顯示
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,SZTZ ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
- JNB EC11B,SZTZ ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
- MOV A,DISPL ;AB引腳都為高電平,已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置了,裝入要設(shè)置的目標(biāo)項(xiàng)
- DEC A ;減1
- ADD A,#ZRFZQ ;加上各項(xiàng)設(shè)置的起始地址
- MOV R0,A ;把得出的具體地址放入R0
- JB 01H,SZTZ7 ;如果位地址01H為1(順時(shí)針正轉(zhuǎn))就轉(zhuǎn)移
- MOV A,XXSZ ;是反轉(zhuǎn),裝入下限數(shù)值到A寄存器
- ADD A,R4 ;加步長(zhǎng)值
- MOV MJS,A ;把下限值+步長(zhǎng)值的結(jié)果暫時(shí)放入MJS
- MOV A,@R0 ;裝入R0指向的RAM地址的調(diào)整對(duì)象數(shù)值
- CJNE A,MJS,SZTZ5 ;調(diào)整對(duì)象數(shù)值與“下限值+步長(zhǎng)值”比較
- SZTZ5: JC SZTZ6 ;如果調(diào)整對(duì)象數(shù)值小于“下限值+步長(zhǎng)值”(不夠減)就轉(zhuǎn)移
- SUBB A,R4 ;等于或大于,減步長(zhǎng)值
- MOV @R0,A ;把計(jì)算結(jié)果放回去
- LJMP SZTZ10
- SZTZ6: MOV @R0,XXSZ ;不夠減了,直接放入下限值
- LJMP SZTZ10
- SZTZ7: MOV A,@R0 ;是正轉(zhuǎn),裝入R0指向的RAM地址的調(diào)整對(duì)象數(shù)值
- ADD A,R4 ;加步長(zhǎng)值
- CJNE A,SXSZ,SZTZ8 ;加完后與上限數(shù)值比較
- SZTZ8: JC SZTZ9 ;如果小于就轉(zhuǎn)移
- MOV @R0,SXSZ ;等于或大于,直接放入上限值
- LJMP SZTZ10
- SZTZ9: MOV @R0,A ;小于上限數(shù)值,把計(jì)算結(jié)果放回去
- SZTZ10: CLR 00H ;把位地址00H置為0,表示已經(jīng)處理編碼器旋轉(zhuǎn)動(dòng)作
- LJMP SZTZ
- ;----------------------------------------------------------------------------------------
- ;子程序:編碼器按鍵開(kāi)關(guān)處理
- ;出口參數(shù):A=1(按了1次);A=2(按了2次);A=3長(zhǎng)按達(dá)到了15秒;A=4長(zhǎng)按達(dá)到了5秒
- ;----------------------------------------------------------------------------------------
- KEY: MOV MJS,#15 ;放入等待時(shí)間,15秒
- KEY1: MOV A,MJS ;裝入等待時(shí)間
- JNZ KEY2 ;如果不為0就轉(zhuǎn)移,時(shí)間未到
- MOV A,#3 ;為0,時(shí)間到了,放入3到A寄存器,長(zhǎng)按達(dá)到了15秒
- RET
- KEY2: LCALL SKEY ;掃描按鍵
- JC KEY1 ;如果C=1(按鍵還沒(méi)松開(kāi)),就繼續(xù)掃描
- CJNE A,#10,KEY3 ;按鍵松開(kāi)了,剩余時(shí)間與10比較,不等于就轉(zhuǎn)移
- LJMP KEY4 ;等于10,長(zhǎng)按時(shí)間達(dá)到了5秒(15-10=5)
- KEY3: JNC KEY5 ;大于10就轉(zhuǎn)移
- KEY4: MOV A,#4 ;等于或小于10,放入4到A寄存器,長(zhǎng)按時(shí)間達(dá)到了5秒以上
- RET
- KEY5: LCALL KEYA ;大于10,按下的時(shí)間小于5秒,掃描按鍵600毫秒
- JZ KEY6 ;如果600毫秒內(nèi)有按鍵動(dòng)作就轉(zhuǎn)移
- RET ;600毫秒內(nèi)沒(méi)有按鍵動(dòng)作,這時(shí)A=1(按了1次),退出
- KEY6: LCALL KEYEX ;等待第二次按鍵松開(kāi)
- MOV A,#2 ;按鍵松開(kāi)了,A=2(按了2次)
- RET
- ;------------------ 掃描按鍵開(kāi)關(guān)600毫秒,有按鍵動(dòng)作A=0,無(wú)按鍵動(dòng)作A=1 ------------------
- KEYA: PUSH 03H
- MOV 03H,#60 ;等待600毫秒,10*60=600毫秒
- KEYB: MOV A,SJJS ;裝入(10)毫秒計(jì)數(shù)
- KEYC: CJNE A,SJJS,KEYD ;如果不相同就轉(zhuǎn)移,說(shuō)明時(shí)間已經(jīng)過(guò)了10毫秒
- LCALL SKEY ;掃描按鍵
- JC KEYE ;如果有按鍵動(dòng)作(C=1)就轉(zhuǎn)移
- LJMP KEYC
- KEYD: DJNZ 03H,KEYB ;03H減1,不為0就轉(zhuǎn)移,繼續(xù)掃描
- POP 03H
- MOV A,#1 ;600毫秒等待時(shí)間已到,A=1沒(méi)有按鍵動(dòng)作
- RET
- KEYE: POP 03H
- CLR A ;600毫秒內(nèi)有按鍵動(dòng)作A=0
- RET
- ;------------------ 等待按鍵松開(kāi) ------------------
- KEYEX: LCALL SKEY ;掃描按鍵
- JC KEYEX ;如果C=1(按鍵還沒(méi)松開(kāi)),就繼續(xù)掃描
- RET
- ;------------------ 按鍵開(kāi)關(guān)掃描,未按C=0,已按下C=1 ------------------
- SKEY: SETB EC11K ;按鍵開(kāi)關(guān)設(shè)為高電平
- JNB EC11K,SKEY1 ;為0(低電平)就轉(zhuǎn)移,表示按鍵開(kāi)關(guān)已經(jīng)被按下
- SKEY0: CLR C ;為1(高電平),C置為0,沒(méi)有按鍵動(dòng)作
- LCALL WG ;喂狗
- RET
- SKEY1: PUSH 00H ;按鍵已被按下,延時(shí)10毫秒
- PUSH 01H ;延時(shí)10毫秒
- MOV 00H,#87 ;延時(shí)10毫秒
- MOV 01H,#10 ;延時(shí)10毫秒
- SKEY2: DJNZ 01H,SKEY2 ;延時(shí)10毫秒
- DJNZ 00H,SKEY2 ;延時(shí)10毫秒
- POP 01H ;延時(shí)10毫秒
- POP 00H ;延時(shí)10毫秒
- SETB EC11K ;延時(shí)結(jié)束后再次把按鍵開(kāi)關(guān)設(shè)為高電平
- JB EC11K,SKEY0 ;為1就轉(zhuǎn)移,按鍵開(kāi)關(guān)未被有效按下
- SETB C ;為1,按鍵動(dòng)作有效,置C為1
- LCALL WG ;喂狗
- RET
- ;*************************** 以下為EEPROM操作子程序 **********************************
- ;STC89C51RC有4K字節(jié)的EEPROM,由8個(gè)扇區(qū)組成,每個(gè)扇區(qū)512字節(jié),地址2000H-2FFFH
- ;第1扇區(qū):2000H~21FFH,第2扇區(qū):2200H~23FFH……第8扇區(qū):2E00H~2FFFH
- ;-------------------------------------------
- ;讀一字節(jié),A=讀出的數(shù)據(jù)
- Byte_Read:
- MOV IAP_CONTR,#ENABLE_IAP ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
- MOV IAP_CMD,#01 ;設(shè)置為IAP/ISP/EEPROM字節(jié)讀模式命令(1)
- MOV IAP_TRIG,#46H ;先送46H
- MOV IAP_TRIG,#0B9H ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
- NOP
- MOV A,IAP_DATA ;讀出的數(shù)據(jù)在IAP_DATA單元中,送入累加器A
- RET
- ;-------------------------------------------
- ;字節(jié)編程,A=需寫(xiě)入的數(shù)據(jù)
- Byte_Program:
- MOV IAP_CONTR,#ENABLE_IAP ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
- MOV IAP_CMD,#02 ;設(shè)置為IAP/ISP/EEPROM字節(jié)編程模式命令(2)
- MOV IAP_DATA,A ;要編程的數(shù)據(jù)先送進(jìn)IAP_DATA寄存器
- MOV IAP_TRIG,#46H ;先送46H
- MOV IAP_TRIG,#0B9H ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
- RET
- ;-------------------------------------------
- ;擦除扇區(qū)
- Sector_Erase:
- MOV IAP_CONTR,#ENABLE_IAP ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
- MOV IAP_CMD,#03 ;設(shè)置為IAP/ISP/EEPROM扇區(qū)擦除模式命令(3)
- MOV IAP_TRIG,#46H ;先送46H
- MOV IAP_TRIG,#0B9H ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
- NOP
- RET
- ;---------- 讀EEPROM保存的各項(xiàng)設(shè)置,如果沒(méi)有就設(shè)置為默認(rèn)值并保存 ------------
- REEP: LCALL RE00 ;讀EEPROM保存的各項(xiàng)設(shè)置
- MOV A,SDDS ;裝入“上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))”
- JZ REEP0 ;如果是0就轉(zhuǎn)移,退出
- MOV DSSJS,A ;放入“定時(shí)時(shí)間(小時(shí))”
- MOV DSSJM,#59 ;放入59到“定時(shí)時(shí)間(秒)”
- REEP0: RET
- RE00: MOV IAP_ADDRH,#020H ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的高8位
- RE01: MOV IAP_ADDRL,#0 ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的低8位
- LCALL Byte_Read ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
- CJNE A,FWBZ1,RE03 ;是否保存在當(dāng)前扇區(qū),不是就轉(zhuǎn)移到RE03
- INC IAP_ADDRL ;EEPROM字節(jié)地址增1
- LCALL Byte_Read ;讀第二個(gè)字節(jié)
- CJNE A,FWBZ2,RE03 ;第二個(gè)字節(jié)是否相符
- MOV R1,#ZRFZQ ;相符,從ZRFZQ開(kāi)始放置讀出的設(shè)置值
- MOV R2,#5 ;總共5個(gè)字節(jié)
- RE02: INC IAP_ADDRL ;EEPROM字節(jié)地址增1
- LCALL Byte_Read ;讀一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
- MOV @R1,A ;放到R1指向的RAM地址
- INC R1 ;RAM地址增1
- DJNZ R2,RE02 ;未讀完就繼續(xù)
- RET ;讀完了,退出
- RE03: MOV A,IAP_ADDRH ;裝入扇區(qū)地址的高8位
- ADD A,#2 ;扇區(qū)增1
- MOV IAP_ADDRH,A ;放入IAP_ADDRH
- CJNE A,#30H,RE01 ;如果未搜索完最后一個(gè)扇區(qū)+2(2EH+2=30H)就轉(zhuǎn)移,繼續(xù)搜索
- LCALL SZMRZ ;已經(jīng)搜索全部八個(gè)扇區(qū),未找到保存的內(nèi)容,設(shè)置為默認(rèn)值
- MOV R0,#8 ;總扇區(qū)數(shù)量,共8個(gè)扇區(qū)
- LJMP WSET3 ;跳轉(zhuǎn)到WSET3保存設(shè)置
- ;------------------ 保存設(shè)置,不固定保存到某個(gè)扇區(qū),各扇區(qū)輪流使用 ------------------
- WSET: MOV R0,#8 ;扇區(qū)總數(shù)量,共8個(gè)扇區(qū)
- MOV IAP_ADDRH,#020H ;從第一個(gè)扇區(qū)開(kāi)始搜索上次保存的設(shè)置
- WSET1: MOV IAP_ADDRL,#0 ;地址低位指向第一個(gè)字節(jié)
- LCALL Byte_Read ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
- CJNE A,FWBZ1,WSET7 ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
- INC IAP_ADDRL ;第一個(gè)字節(jié)相同,EEPROM字節(jié)地址增1
- LCALL Byte_Read ;讀第二個(gè)字節(jié)
- CJNE A,FWBZ2,WSET7 ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
- MOV IAP_ADDRL,#0 ;是在當(dāng)前扇區(qū),地址指向扇區(qū)第一個(gè)字節(jié)
- LCALL Sector_Erase ;擦除當(dāng)前扇區(qū),另?yè)Q一個(gè)扇區(qū)保存
- WSET2: MOV A,IAP_ADDRH ;裝入扇區(qū)地址高位到寄存器A
- CJNE A,#020H,WSET3 ;當(dāng)前扇區(qū)地址高位如果不是20H(第一個(gè)扇區(qū))就轉(zhuǎn)移
- MOV IAP_ADDRH,#30H ;是20H,把IAP_ADDRH設(shè)置為最后一個(gè)扇區(qū)+2(2EH+2=30H)
- WSET3: DEC IAP_ADDRH ;減1
- DEC IAP_ADDRH ;再減1,指向上一個(gè)扇區(qū)首址
- MOV IAP_ADDRL,#0 ;低8位指向扇區(qū)第一個(gè)字節(jié)
- LCALL Sector_Erase ;擦除整個(gè)扇區(qū)
- MOV R1,#FWBZ1 ;要保存的內(nèi)容始址
- MOV R2,#7 ;共7個(gè)字節(jié)
- WSET4: MOV A,@R1 ;裝入R1指向的RAM地址的內(nèi)容到A
- LCALL Byte_Program ;字節(jié)編程(寫(xiě)入EEPROM)
- INC IAP_ADDRL ;EEPROM地址加1
- INC R1 ;RAM地址增1
- DJNZ R2,WSET4 ;未保存完就繼續(xù)
- MOV IAP_ADDRL,#0 ;保存完了,扇區(qū)地址低位指向0(當(dāng)前扇區(qū)首址)
- LCALL Byte_Read ;讀出來(lái)檢查看是否寫(xiě)入成功
- CJNE A,FWBZ1,WSET5 ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
- INC IAP_ADDRL ;EEPROM地址加1
- LCALL Byte_Read ;讀第二個(gè)字節(jié)
- CJNE A,FWBZ2,WSET5 ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
- RET ;成功了,退出
- WSET5: DJNZ R0,WSET2 ;如果未試完8個(gè)扇區(qū)就轉(zhuǎn)移到WSET2繼續(xù)往前一個(gè)扇區(qū)寫(xiě)
- SETB 07H ;已經(jīng)試完8個(gè)扇區(qū),都失敗了,位地址07H置為1
- MOV SSSC,#5 ;顯示E1五秒
- MOV ZXM1,#0 ;消隱碼
- MOV ZXM2,#079H ;E
- MOV ZXM3,#006H ;1
- MOV ZXM4,#0 ;消隱碼
- LCALL DISP ;顯示
- WSET6: MOV A,SSSC
- LCALL WG ;喂狗
- JNZ WSET6 ;等待SSSC為0秒
- CLR 07H ;顯示結(jié)束,位地址07H置為0
- RET
- WSET7: MOV A,IAP_ADDRH ;裝入扇區(qū)地址高位
- ADD A,#2 ;加2,指向下一個(gè)扇區(qū)首址
- MOV IAP_ADDRH,A ;放回IAP_ADDRH
- CJNE A,#30H,WSET1 ;如果未到最后一個(gè)扇區(qū)地址高位+2(2EH+2=30H)就轉(zhuǎn)移到WSET1繼續(xù)搜索
- LJMP WSET3 ;是30H,已經(jīng)搜索完所有扇區(qū),未找到上次保存的數(shù)據(jù),跳轉(zhuǎn)到WSET3保存當(dāng)前設(shè)置
- ;***************************************** 以上為EEPROM操作子程序 ********************************************
- ;------------------------------------------------------------------------------------------
- ;子程序:T0中斷調(diào)用,時(shí)間計(jì)數(shù)及倒計(jì)時(shí)處理
- ;------------------------------------------------------------------------------------------
- TIME: MOV A,SJJS ;裝入(10)毫秒時(shí)間計(jì)數(shù)
- JZ TIME2 ;如果是0就轉(zhuǎn)移
- DEC SJJS ;不是0,減1
- CJNE A,#50,TIME1 ;如果不是50就轉(zhuǎn)移退出
- CPL 05H ;位地址第05位取反,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒取反一次
- TIME1: RET
- TIME2: CPL 05H ;是0,位地址第05位取反,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒取反一次
- MOV DPTR,#HMJS ;把定義的時(shí)間計(jì)數(shù)值地址裝入數(shù)據(jù)指針DPTR
- MOVC A,@A+DPTR ;從程序存儲(chǔ)區(qū)裝入時(shí)間計(jì)數(shù)值到A寄存器
- MOV SJJS,A ;時(shí)間計(jì)數(shù)值放入SJJS,重新計(jì)數(shù)
- MOV A,MJS ;裝入秒計(jì)數(shù)
- JZ TIME20 ;如果是0就轉(zhuǎn)移
- DEC MJS ;不是0,減1秒
- TIME20: MOV A,SSSC ;裝入閃爍時(shí)長(zhǎng)秒計(jì)數(shù)
- JZ TIME3 ;如果是0就轉(zhuǎn)移
- DEC SSSC ;不是0,減1秒
- TIME3: MOV A,SJ ;裝入自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)到寄存器A
- JZ TIME4 ;如果是0就轉(zhuǎn)移
- DEC SJ ;不是0,減1秒
- TIME4: MOV A,ZQ ;裝入自然風(fēng)變化周期時(shí)長(zhǎng)到寄存器A
- DEC ZQ ;先減1
- JNZ TIME5 ;如果不是0就轉(zhuǎn)移
- MOV ZQ,ZRFZQ ;是0,重新裝入設(shè)置值
- MOV SJ,ZRFSJ ;是0,重新裝入設(shè)置值
- TIME5: MOV A,DSSJM ;裝入定時(shí)時(shí)間(秒)到寄存器A
- JZ TIME7 ;如果是0就轉(zhuǎn)移
- CJNE A,#59,TIME6 ;如果不是59秒就轉(zhuǎn)移
- MOV A,DSSJF ;是59秒,檢查“時(shí)”
- JNZ TIME6 ;不是0就轉(zhuǎn)移
- MOV A,DSSJS ;檢查“分”
- JNZ TIME6 ;不是0就轉(zhuǎn)移
- MOV DSSJM,A ;“時(shí)、分”都是0,把“秒”也清零
- RET
- TIME6: DEC DSSJM ;不是0,減1秒
- RET
- TIME7: MOV A,DSSJF ;裝入定時(shí)時(shí)間(分)到寄存器A
- JZ TIME8 ;如果是0就轉(zhuǎn)移
- DEC DSSJF ;不是0,減1分
- MOV DSSJM,#59 ;把59放入定時(shí)時(shí)間(秒)
- RET
- TIME8: MOV A,DSSJS ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
- JZ TIME9 ;如果是0就轉(zhuǎn)移,退出
- DEC DSSJS ;不是0,小時(shí)減1
- MOV DSSJM,#59 ;把59放入定時(shí)時(shí)間(秒)
- MOV DSSJF,#59 ;把59放入定時(shí)時(shí)間(分)
- TIME9: RET
- ;---------------------------------------------------------------------------------------------
- ;子程序:T0中斷調(diào)用,根據(jù)條件控制自然風(fēng)狀態(tài)LED指示燈和可控硅
- ;---------------------------------------------------------------------------------------------
- Control:SETB LED ;先熄滅自然風(fēng)LED指示燈
- JNB 02H,CTL00 ;如果位地址02H(正常/自然風(fēng)切換)為0(正常)就轉(zhuǎn)移,保持熄滅狀態(tài)
- CLR LED ;為1,自然風(fēng)狀態(tài),點(diǎn)亮LED指示燈
- CTL00: MOV A,DSSJM ;裝入定時(shí)時(shí)間(秒)到寄存器A
- JNZ CTL02 ;如果不是0就轉(zhuǎn)移
- MOV A,DSSJF ;裝入定時(shí)時(shí)間(分)到寄存器A
- JNZ CTL02 ;如果不是0就轉(zhuǎn)移
- MOV A,DSSJS ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
- JNZ CTL02 ;如果不是0就轉(zhuǎn)移
- CTL01: SETB MOC ;置MOC為高電平,斷電
- RET
- CTL02: JNB 02H,CTL03 ;如果位地址02H(正常/自然風(fēng)切換)為0(正常)就轉(zhuǎn)移,通電
- MOV A,SJ ;是自然風(fēng)狀態(tài),裝入自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)到寄存器A
- JZ CTL01 ;如果為0(通電倒計(jì)時(shí)結(jié)束)就轉(zhuǎn)移,斷電
- CTL03: CLR MOC ;置MOC為低電平,通電
- RET
- ;------------------------------------------------------------------------------------------
- ;子程序:T0中斷調(diào)用,顯示定時(shí)時(shí)間及各項(xiàng)設(shè)置的內(nèi)容
- ;------------------------------------------------------------------------------------------
- DISPLAY:JB 06H,DPYSZ1 ;如果位地址06H為1就轉(zhuǎn)移退出,主程序顯示88:88
- JB 07H,DPYSZ1 ;如果位地址07H為1就轉(zhuǎn)移退出,主程序顯示E1
- MOV A,DISPL ;裝入要顯示的目標(biāo)
- JZ DISPL0 ;如果是0(顯示定時(shí)時(shí)間)就轉(zhuǎn)移
- DPYSZ: PUSH ACC
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM1,A ;項(xiàng)目編號(hào)字形碼放到待發(fā)送TM1637區(qū)1
- MOV ZXM2,#40H ;放入“-”的字形碼到待發(fā)送TM1637區(qū)2
- POP ACC
- DEC A ;減1
- PUSH 01H
- MOV R1,#ZRFZQ ;各項(xiàng)設(shè)置值始址
- ADD A,R1 ;加上項(xiàng)目號(hào)
- MOV R1,A ;得出設(shè)置項(xiàng)目的實(shí)際地址放入R1
- MOV A,@R1 ;裝入設(shè)置值
- POP 01H
- MOV B,A ;放入B寄存器
- CJNE A,XSHC1,DPYSZ3 ;當(dāng)前設(shè)置值與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
- MOV A,SJJS ;相同,裝入時(shí)間計(jì)數(shù)
- JNZ DPYSZ2 ;不是0就轉(zhuǎn)移,每半秒(遇到50或0)顯示一次
- LJMP DPYSZ3 ;是0,顯示
- DPYSZ1: RET
- DPYSZ2: CJNE A,#50,DPYSZ1 ;不是50就轉(zhuǎn)移退出,每半秒(遇到50或0)顯示一次
- DPYSZ3: MOV XSHC1,B ;當(dāng)前設(shè)置值放入顯示緩存1
- JNB 04H,DPYSZ4 ;如果位地址04H為0(不閃爍)就轉(zhuǎn)移
- JNB 05H,DPYSZ4 ;為1,閃爍顯示,如果位地址05H為0(顯示)就轉(zhuǎn)移
- CLR A ;為1,處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼
- MOV ZXM1,A ;放入消隱碼
- MOV ZXM2,A ;放入消隱碼
- MOV ZXM3,A ;放入消隱碼
- MOV ZXM4,A ;放入消隱碼
- LJMP disp ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
- DPYSZ4: MOV A,B ;當(dāng)前設(shè)置值放入A寄存器
- LCALL DISPL6 ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3和4
- LJMP disp ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
- DISPL0: MOV A,DSSJS ;顯示定時(shí)時(shí)間,裝入定時(shí)時(shí)間(時(shí))
- CJNE A,XSHC1,DISPL3 ;定時(shí)時(shí)間(時(shí))與顯示緩存1不相同就轉(zhuǎn)移,顯示
- MOV A,DSSJF
- CJNE A,XSHC2,DISPL3 ;定時(shí)時(shí)間(分)與顯示緩存2不相同就轉(zhuǎn)移,顯示
- MOV A,SJJS ;時(shí)、分都相同,裝入(10)毫秒時(shí)間計(jì)數(shù)
- JNZ DISPL2 ;不是0就轉(zhuǎn)移
- LJMP DISPL3 ;是0,顯示,每半秒(遇到50或0)顯示一次
- DISPL1: RET
- DISPL2: CJNE A,#50,DISPL1 ;不是50就轉(zhuǎn)移,每半秒(遇到50或0)顯示一次
- DISPL3: MOV XSHC1,DSSJS ;當(dāng)前時(shí)間放入顯示緩存1
- MOV XSHC2,DSSJF ;當(dāng)前時(shí)間放入顯示緩存2
- MOV A,DSSJM ;
- JNZ DISPL4 ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
- MOV A,DSSJF ;
- JNZ DISPL4 ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
- MOV A,DSSJS ;
- JNZ DISPL4 ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
- CLR 05H ;定時(shí)時(shí)間為0,把位地址05H置為0,冒號(hào)不閃爍顯示
- DISPL4: MOV A,DSSJS ;裝入“時(shí)”
- MOV B,#10 ;轉(zhuǎn)換為BCD碼
- DIV AB ;轉(zhuǎn)換為BCD碼
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM1,A ;字形碼放入待發(fā)送TM1637區(qū)1
- XCH A,B ;A、B寄存器內(nèi)容交換
- MOVC A,@A+DPTR ;查表獲取字形碼
- JB 05H,DISPL5 ;如果05H為1就轉(zhuǎn)移,不顯示冒號(hào)
- ORL A,#10000000B ;為0,把最高位置為1,顯示冒號(hào)(字形碼的最高位為1就顯示冒號(hào))
- DISPL5: MOV ZXM2,A ;放入待發(fā)送TM1637區(qū)2
- MOV A,DSSJF ;裝入“分”
- LCALL DISPL6 ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3和4
- LJMP disp ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
- DISPL6: MOV B,#10 ;轉(zhuǎn)換為BCD碼
- DIV AB ;轉(zhuǎn)換為BCD碼
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM3,A ;字形碼放入待發(fā)送TM1637區(qū)3
- XCH A,B ;A、B寄存器內(nèi)容交換
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM4,A ;字形碼放入待發(fā)送TM1637區(qū)4
- RET
- ;------------------ 發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示,地址自動(dòng)加1 ------------------
- disp: LCALL Srt
- MOV A,#040H ;數(shù)據(jù)命令設(shè)置40H:地址自動(dòng)加1,寫(xiě)數(shù)據(jù)到顯示寄存器
- LCALL Writebyte ;發(fā)送一個(gè)字節(jié)
- LCALL Stop
- NOP
- LCALL Srt
- MOV A,#0C0H ;地址命令設(shè)置C0H:初始地址為00H
- LCALL Writebyte ;發(fā)送一個(gè)字節(jié)
- PUSH 01H
- PUSH 06H
- MOV 06H,#4 ;發(fā)送4個(gè)字節(jié)數(shù)據(jù)
- MOV R1,#ZXM1 ;等待發(fā)送的字形碼始址
- disp1: MOV A,@R1 ;裝入要發(fā)送的字形碼
- LCALL Writebyte ;發(fā)送一個(gè)字節(jié)
- INC R1 ;地址加1
- DJNZ 06H,disp1 ;如果還未發(fā)送完就繼續(xù)
- POP 06H
- POP 01H
- LCALL Stop
- LCALL Srt
- MOV A,SMGLD ;裝入設(shè)置的數(shù)碼管亮度(1~8)
- ADD A,#087H ;加上87H后即為對(duì)應(yīng)的亮度控制命令88H~8FH
- LCALL Writebyte ;按設(shè)置的亮度開(kāi)顯示
- LJMP Stop
- ;------------------ 發(fā)送8bit(一個(gè)字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開(kāi)始 ------------------
- Writebyte:
- PUSH 00H
- MOV 00H,#8 ;發(fā)送8位數(shù)據(jù)
- WBY1: CLR CLK ;拉低CLK
- JNB ACC.0,WBY2 ;A寄存器的低位(0位)如果為0就轉(zhuǎn)移
- SETB DIO ;為1,拉高DIO
- SJMP WBY3
- WBY2: CLR DIO ;為0,拉低DIO
- WBY3: NOP
- NOP
- NOP
- NOP
- NOP
- SETB CLK ;拉高CLK
- CLR C ;進(jìn)位標(biāo)志清0
- RRC A ;A寄存器內(nèi)容帶進(jìn)位循環(huán)右移
- DJNZ 00H,WBY1 ;如果還未發(fā)送完8bit數(shù)據(jù)就繼續(xù)
- WBY4: CLR CLK ;8位數(shù)據(jù)發(fā)送完了
- NOP
- MOV 00H,#05 ;設(shè)置等待應(yīng)答信號(hào)計(jì)數(shù)值,防止萬(wàn)一與TM1637通訊失敗而造成死循環(huán)
- WBY5: DEC 00H ;減1,正常情況下ACK應(yīng)答信號(hào)很快,第一次減1就會(huì)有應(yīng)答
- MOV A,00H ;裝入計(jì)數(shù)值到A
- JZ WBY6 ;如果為0就轉(zhuǎn)移退出,說(shuō)明與TM1637通訊失敗,或TM1637不存在
- JB DIO,WBY5 ;不為0,判斷TM1637發(fā)過(guò)來(lái)的ACK應(yīng)答信號(hào),未應(yīng)答(為1,高電平)就轉(zhuǎn)移
- WBY6: POP 00H
- NOP
- NOP
- NOP
- SETB CLK
- NOP
- NOP
- NOP
- RET
- ;------------------ Start子程序 ------------------
- Srt: SETB DIO ;拉高DIO
- SETB CLK ;拉高CLK
- NOP
- NOP
- NOP
- NOP
- NOP
- SETB DIO ;拉高DIO
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR DIO ;拉低DIO
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR CLK ;拉低CLK
- RET
- ;------------------ Stop子程序 ------------------
- Stop: CLR CLK
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR DIO
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- SETB CLK
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- SETB DIO
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR CLK
- CLR DIO
- RET
- ;------------------ 字形表 ------------------
- SEGTAB:
- DB 00111111B ;0(3FH)
- DB 00000110B ;1(06H)
- DB 01011011B ;2(5BH)
- DB 01001111B ;3(4FH)
- DB 01100110B ;4(66H)
- DB 01101101B ;5(6DH)
- DB 01111101B ;6(7DH)
- DB 00000111B ;7(07H)
- DB 01111111B ;8(7FH)
- DB 01101111B ;9(6FH)
- DB 01110111B ;A(77H)
- DB 01111100B ;B(7CH)
- DB 00111001B ;C(39H)
- DB 01011110B ;D(5EH)
- DB 01111001B ;E(79H)
- DB 01110001B ;F(71H)
- DB 00000000B ;消隱碼(00)
- ;------------------------------------------------------------------------------------------
- END
-
復(fù)制代碼
51hei.png (3.61 KB, 下載次數(shù): 121)
下載附件
2020-7-11 02:23 上傳
以上資料51hei下載地址:
電風(fēng)扇長(zhǎng)定時(shí)器.rar
(95.52 KB, 下載次數(shù): 98)
2020-7-10 23:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|