久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7749|回復: 11
打印 上一主題 下一主題
收起左側

單片機+TM1637顯示模塊,EC11編碼器,電風扇長定時+自然風匯編程序

  [復制鏈接]
跳轉到指定樓層
樓主
電風扇定時時間60分鐘覺得短了些,如果一直開的話,吹到天亮人也難受,能定時三四小時比較合適,手頭上有若干閑置了十余年的STC89C51RC,所以就用它來制作個長定時器,使用EC11帶開關旋轉編碼器調時間,很便宜,一塊多錢一只還包郵,也可以用按鍵代替編碼器,只是調時間的時候不如編碼器那么方便快捷,顯示用TM1637四位數碼管顯示模塊,3塊錢包郵,便宜又好用,它能顯示到99小時,所以最長定時可達99小時59分59秒,雖然實際使用不需要那么長的定時。制作好后不對電風扇作任何改動,只是把雙向可控硅的T1、T2分別與原定時器那兩根線接好就可以了,也就是與原定時器并聯,把原定時器調到OFF位置。單片機改用其他型號的話,需要改動一些地方,如EEPROM操作、扇區地址、數量、特殊功能寄存器地址、看門狗預分頻數等等.

電路原理圖如下:



單片機源程序如下:
  1. ;===================================================================================
  2. ;TM1637顯示模塊,EC11編碼器,電風扇長定時+自然風匯編程序
  3. ;楊小強,2020年6月
  4. ;單片機:STC89C51RC,晶振:11.0592MHz
  5. ;顯示:(TM1637)4位數碼管顯示模塊
  6. ;調整、設置:EC11帶開關5腳旋轉編碼器,也可以用按鍵代替
  7. ;電源:閑置5V手機充電器
  8. ;
  9. ;最長定時99小時59分59秒,簡單的采用間歇通/斷電方式模擬自然風,周期可調,用可控硅控制通斷。
  10. ;
  11. ;按編碼器開關1次:正常/自然風切換,自然風狀態時LED指示燈亮,可控硅間歇通斷電
  12. ;按編碼器開關2次:定時時間清零,風扇電機斷電,兩次按鍵動作之間不大于0.6秒
  13. ;
  14. ;長按編碼器開關5秒以上15秒以內,松開按鍵后進入設置狀態,退出設置狀態:設置完第五項后按編碼器開關、或任意一
  15. ;項中停15秒無任何操作,就自動保存并退出。根據數碼管左邊顯示的數字進行以下各項設置,通過旋轉編碼器加或減,
  16. ;按編碼器開關進入下一項設置:
  17. ;一、顯示1——設置自然風狀態時,通斷電周期時長,5~30秒,默認為10秒
  18. ;二、顯示2——設置自然風時電機通電時長,最短為2秒;最長為上一項所設的周期減3秒,比如上一項設置的周期為10秒,
  19. ;             則本項最多可以設置到7秒;
  20. ;三、顯示3——設置3小時以下定時調整時,編碼器每轉動一格的增(減)值:5、10、15、20、25、30分鐘,默認10分鐘,
  21. ;             3小時以上增(減)值30分鐘;10小時以上增(減)值1個小時;20小時以上增(減)值2個小時
  22. ;四、顯示4——設置電風扇插電就自動填入的定時時間,0~30小時,默認8小時
  23. ;五、顯示5——設置數碼管亮度,1~8級,默認為3級
  24. ;
  25. ;長按編碼器開關15秒:恢復各項默認設置,數碼管顯示88:88
  26. ;
  27. ;設置保存失敗顯示5秒E1
  28. ;
  29. ;--------------------------- 端口定義 ---------------------------
  30.         CLK        EQU P1.5   ;接顯示模塊TM1637的CLK
  31.         DIO        EQU P1.6   ;接顯示模塊TM1637的DIO
  32.         EC11A        EQU P3.2   ;接編碼器的A引腳,外部中斷INT0,也可以接一個按鍵代替
  33.         EC11B        EQU P3.3   ;接編碼器的B引腳,外部中斷INT1,也可以接一個按鍵代替
  34.         EC11K        EQU P3.4   ;接編碼器的按鍵開關引腳
  35.         RLED        EQU P0.4   ;只要發生過復位就一直保持低電平,如有需要可接上LED方便觀察
  36.         LED        EQU P0.5   ;自然風狀態LED指示燈,低電平亮
  37.         MOC        EQU P0.7   ;接MOC3022光控可控硅,低電平時風扇電機通電

  38. ;--------------------------- 位地址及RAM的使用 ---------------------------
  39. ;(20H)第0位:1=編碼器已經轉動,等待主程序處理,0=沒有轉動或主程序已處理
  40. ;(20H)第1位:1=編碼器順時針正轉;0=編碼器逆時針反轉
  41. ;(20H)第2位:1=自然風狀態;0=正常狀態
  42. ;(20H)第3位:1=禁止;0=允許。進行各項設置時使用,允許/禁止檢查剩余時間
  43. ;(20H)第4位:1=閃爍顯示;0=不閃爍。進行各項設置時用
  44. ;(20H)第5位:1=不顯示,0=顯示,數字及冒號閃爍時用,由T0中斷每0.5秒取反一次
  45. ;(20H)第6位:1=顯示3秒88:88;0=正常
  46. ;(20H)第7位:1=顯示5秒E1;0=正常

  47.         FWBZ1        EQU        022H        ;復位判斷標志1,也作EEPROM數據判斷標志
  48.         FWBZ2        EQU        023H        ;復位判斷標志2,也作EEPROM數據判斷標志
  49.         ZRFZQ        EQU        024H        ;自然風時通斷電周期時長
  50.         ZRFSJ        EQU        025H        ;自然風時電機通電時長
  51.         BMQZJ        EQU        026H          ;編碼器每轉動一小格的增(減)值
  52.         SDDS        EQU        027H        ;上電就自動設定的定時時間(小時)
  53.         SMGLD        EQU        028H          ;數碼管亮度
  54.         DSSJS        EQU        029H        ;定時時間,時
  55.         DSSJF        EQU        02AH          ;定時時間,分
  56.         DSSJM        EQU        02BH        ;定時時間,秒
  57.         ZQ        EQU        02CH        ;T0中斷使用,自然風通斷電周期時長
  58.         SJ        EQU        02DH        ;T0中斷使用,自然風時電機通電時長
  59.         SJJS        EQU        02EH          ;時間計數,每10毫秒減1,為0后定時時間減1秒,重新把HMJS處定義的計數值放入這里
  60.         MJS        EQU        02FH        ;按鍵處理時用,秒計數,每秒減1,直到為0
  61.         SSSC        EQU        030H        ;閃爍時長,每秒減1,直到為0
  62.         XSHC1        EQU        031H        ;上次顯示的內容,與當前不同就立即顯示,相同就每0.5秒顯示一次
  63.         XSHC2        EQU        032H        ;上次顯示的內容,與當前不同就立即顯示,相同就每0.5秒顯示一次
  64.         XXSZ        EQU        033H        ;下限數值,進行各項設置時用
  65.         SXSZ        EQU        034H        ;上限數值,進行各項設置時用
  66.         ZXM1        EQU        035H        ;顯示用,待發送到TM1637的字形碼1
  67.         ZXM2        EQU        036H        ;顯示用,待發送到TM1637的字形碼2
  68.         ZXM3        EQU        037H        ;顯示用,待發送到TM1637的字形碼3
  69.         ZXM4        EQU        038H        ;顯示用,待發送到TM1637的字形碼4
  70.         DSZJ        EQU        039H        ;加減定時時間使用
  71.         DISPL        EQU        03AH         ;設置要顯示的目標:
  72.                                 ;0=顯示定時時間
  73.                                 ;1=顯示1——設置自然風狀態時的通斷電周期時長
  74.                                 ;2=顯示2——設置自然風時電機通電時長
  75.                                 ;3=顯示3——設置3小時以下定時調整時,編碼器每轉動一小格的增(減)值
  76.                                 ;4=顯示4——設置上電自動填入的定時時間
  77.                                 ;5=顯示5——設置數碼管亮度

  78. ;--------------- 看門狗、EEPROM特殊功能寄存器地址 ---------------
  79.         AUXR                EQU 08EH        ;輔助寄存器
  80.         WDT_CONTR        EQU 0E1H        ;看門狗地址
  81.         IAP_DATA         EQU 0E2H        ;數據寄存器,讀出、寫入的數據放在此處
  82.         IAP_ADDRH        EQU 0E3H        ;地址寄存器高八位
  83.         IAP_ADDRL        EQU 0E4H        ;地址寄存器低八位
  84.         IAP_CMD                EQU 0E5H        ;命令寄存器,0=關閉,1=讀,2=寫,3=擦除
  85.         IAP_TRIG        EQU 0E6H        ;命令觸發寄存器,每次操作先放入46H再放入B9,命令立即被觸發起動
  86.         IAP_CONTR        EQU 0E7H        ;控制寄存器,Flash操作允許/禁止及等待時間
  87.         ENABLE_IAP        EQU 083H ;定義Flash操作等待時間及允許IAP/ISP/EEPROM操作的常數,時鐘<12MHz時為83H

  88. ;==========================================================================
  89.         ORG        0000H
  90.         LJMP        START

  91.         ORG        0003H                ;外部中斷INT0入口
  92.         LJMP        INT_0                ;外部中斷INT0入口

  93.         ORG        000BH                ;T0中斷入口
  94.         LJMP        T0INT                ;T0中斷入口

  95.         ORG        0013H                ;外部中斷INT1入口
  96.         LJMP        INT_1                ;外部中斷INT1入口

  97.         ORG        0030H                ;程序代碼始址安排在30H

  98. ;------------------------------------------------------------------------------------------------
  99. ;定義時間計數值,當定時時間實際走時誤差較大時,可調整此數值使誤差減小
  100. ;例如每分鐘快7秒,就把此數值改為112D(7秒÷60秒×100≈12,12+100=112);每分鐘慢6秒,就
  101. ;把此數值改為90D(6秒÷60秒×100=10,100-10=90)
  102. ;------------------------------------------------------------------------------------------------
  103. HMJS:        DB        100D                ;定義時間計數值,100表示100×10毫秒=1秒,后面的D表示是十進制數

  104. ;--------------- 定時器0中斷(10毫秒產生一次中斷) ---------------
  105. T0INT:        PUSH        ACC
  106.         PUSH        PSW
  107.         LCALL        TIME                ;處理各項時間
  108.         LCALL        Control                ;根據條件控制自然風LED指示燈和可控硅(或繼電器)
  109.         LCALL        DISPLAY                ;顯示
  110.         POP        PSW
  111.         POP        ACC
  112.         RETI

  113. ;--------------- 外部中斷INT0,P3.2接編碼器A引腳 ---------------
  114. INT_0:        PUSH        PSW
  115.         JB        00H,INT0_1        ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
  116.         SETB        00H                ;把位地址00H置為1,表示編碼器已轉動,等待主程序處理
  117.         SETB        01H                ;是順時針正轉,把位地址01H置為1
  118. INT0_1:        POP        PSW
  119.         RETI

  120. ;--------------- 外部中斷INT1,P3.3接編碼器B引腳 ---------------
  121. INT_1:        PUSH        PSW
  122.         JB        00H,INT1_1        ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
  123.         SETB        00H                ;把位地址00H置為1,表示編碼器已轉動,等待主程序處理
  124.         CLR        01H                ;是逆時針反轉,把位地址01H置為0
  125. INT1_1:        POP        PSW
  126.         RETI

  127. ;--------------- 設置各項默認值 ----------------
  128. SZMRZ:        MOV        ZRFZQ,#10        ;自然風狀態時,通斷電周期時長(秒)
  129.         MOV        ZRFSJ,#5        ;自然風時電機通電時長(秒)
  130.         MOV        BMQZJ,#10          ;編碼器每轉動一小格的+、-值(分鐘))
  131.         MOV        SDDS,#8                ;上電就自動設定的定時時間(小時)
  132.         MOV        SMGLD,#3          ;數碼管亮度,8級亮度最高
  133.         RET

  134. ;--------------- T0、INT0、INT1中斷設置 ----------------
  135. SETINT:        ANL        AUXR,#7FH        ;定時器時鐘12T模式
  136.         ANL        TMOD,#0F0H        ;設置定時器模式
  137.         MOV        TL0,#000H        ;設置定時初值,10毫秒產生一次中斷(晶振:11.0592MHz)
  138.         MOV        TH0,#0DCH        ;設置定時初值,10毫秒產生一次中斷(晶振:11.0592MHz)
  139.         CLR        TF0                ;清除TF0標志
  140.         SETB        ET0                ;允許定時器0中斷
  141.         SETB        TR0                ;定時器0開始計時
  142.         SETB        IT0                ;設外部中斷INT0為下降沿觸發
  143.         SETB        EX0                ;允許外部中斷INT0
  144.         SETB        IT1                ;設外部中斷INT1為下降沿觸發
  145.         SETB        EX1                ;允許外部中斷INT1
  146.         SETB        EA                ;允許全局中斷
  147.         RET

  148. ;--------------- 啟動看門狗及喂狗,11.0592MHz預分頻數=4(142.2毫秒),00111001B(39H) ----------------
  149. WG:        MOV        WDT_CONTR,#00111001B
  150.         RET

  151. ;******************************************** 主程序開始 ********************************************
  152. START:        MOV        SP,#050H        ;設置堆棧指針
  153.         MOV        A,FWBZ1                ;
  154.         CJNE        A,#0C8H,START0        ;
  155.         MOV        A,FWBZ2                ;檢查復位判斷標志,不相同說明是初次上電,從初始化開始運行
  156.         CJNE        A,#0D9H,START0        ;
  157.         LCALL        SETINT                ;中斷設置
  158.         CLR        RLED                ;RAM內容沒變,說明是被干擾等原因復位,不是初次上電,點亮復位LED指示燈
  159.         MOV        A,DISPL                ;
  160.         CJNE        A,#5,SAT1        ;不管是什么原因復位,只要RAM不被改變就跳過初始化,繼續運行
  161.         LJMP        STARTB                ;
  162. SAT1:        CJNE        A,#4,SAT2        ;
  163.         LJMP        STARTA                ;
  164. SAT2:        CJNE        A,#3,SAT3        ;根據DISPL的內容跳轉到復位前的位置
  165.         LJMP        START9                ;
  166. SAT3:        CJNE        A,#2,SAT4        ;
  167.         LJMP        START8                ;
  168. SAT4:        CJNE        A,#1,START2        ;
  169.         LJMP        START7                ;
  170. START0:        CLR        A
  171.         MOV        R0,#30H                ;
  172.         MOV        R1,#20H                ;
  173. START1:        MOV        @R1,A                ;初始化,從RAM地址20H開始清零30H個字節
  174.         INC        R1                ;
  175.         DJNZ        R0,START1        ;
  176.         LCALL        SETINT                ;初始化,中斷設置
  177.         MOV        FWBZ1,#0C8H        ;初始化,放入復位判斷標志1到RAM
  178.         MOV        FWBZ2,#0D9H        ;初始化,放入復位判斷標志2到RAM
  179.         LCALL        REEP                ;初始化,讀EEPROM保存的各項設置,如果沒有就設為默認值并保存
  180.         SETB        RLED                ;初始化,設RLED為高電平,復位LED指示燈不亮
  181. ;
  182. START2:        LCALL        WG                ;喂狗
  183.         MOV        DISPL,#0        ;設置要顯示的目標,0=顯示定時時間
  184.         CLR        06H                ;位地址06H置為0,顯示定時時間
  185.         CLR        07H                ;位地址07H置為0,顯示定時時間
  186.         JNB        00H,START3        ;如果位地址00H為0(編碼器沒有轉動)就轉移
  187.         SETB        EC11A                ;拉高編碼器A引腳電平
  188.         SETB        EC11B                ;拉高編碼器B引腳電平
  189.         JNB        EC11A,START3        ;如果仍為0(低電平)就轉移,說明還沒有旋轉到卡點位置
  190.         JNB        EC11B,START3        ;如果仍為0(低電平)就轉移,說明還沒有旋轉到卡點位置
  191.         LCALL        DSSJZJ                ;AB引腳都為高電平了,已經旋轉到卡點位置,根據方向增減定時時間
  192.         CLR        00H                ;把位地址00H置為0,表示已經響應并處理編碼器旋轉動作
  193. START3:        LCALL        SKEY                ;掃描編碼器按鍵開關
  194.         JNC        START2                ;沒有按鍵動作(C=0)就轉移
  195.         LCALL        KEY                ;有按鍵動作,調用編碼器按鍵開關處理子程序
  196.         CJNE        A,#1,START4        ;如果不是按下1次(正常/自然風切換)就轉移
  197.         CPL        02H                ;是按1次,位地址第02位取反,自然風/正常狀態切換
  198.         LJMP        START2
  199. START4:        CJNE        A,#2,START5        ;如果不是2(定時時間置為零)就轉移
  200.         LCALL        DSSJQL                ;是按2次,定時時間清零
  201.         LJMP        START2
  202. START5:        CJNE        A,#3,START7        ;如果不是3(恢復默認設置)就轉移
  203.         LCALL        SZMRZ                ;恢復各項默認設置
  204.         SETB        06H                ;把位地址06H設置為1,數碼管顯示3秒88:88
  205.         MOV        SSSC,#3                ;3秒
  206.         MOV        ZXM1,#0FFH        ;8
  207.         MOV        ZXM2,#0FFH        ;8
  208.         MOV        ZXM3,#0FFH        ;8
  209.         MOV        ZXM4,#0FFH        ;8
  210.         LCALL        DISP                ;顯示
  211. START6:        MOV        A,SSSC
  212.         LCALL        WG                ;喂狗
  213.         JNZ        START6                ;等待SSSC為0秒
  214.         LCALL        WSET                ;保存設置
  215.         LCALL        KEYEX                ;等待按鍵松開
  216.         LJMP        START2
  217. START7:        MOV        DISPL,#1        ;是4,進入各項設置,1=顯示“1——設置自然風狀態時通斷電周期時長”
  218.         LCALL        ZQSZ                ;周期時長設置
  219.         JNZ        START8                ;如果是按下編碼器按鍵開關返回,就轉移,進行下一項設置
  220.         LJMP        START2                ;是15秒無操作自動保存返回,設置結束
  221. START8:        MOV        DISPL,#2        ;2=顯示“2——設置自然風時電機通電時長”
  222.         LCALL        TDSC                ;通電時長設置
  223.         JNZ        START9                ;如果是按下編碼器按鍵開關返回,就轉移,進行下一項設置
  224.         LJMP        START2                ;是15秒無操作自動保存返回,設置結束
  225. START9:        MOV        DISPL,#3        ;3=顯示“3——設置2小時以下定時調整時,編碼器每轉動一格的增(減)值”
  226.         LCALL        BMQZJZ                ;編碼器增減值設置
  227.         JNZ        STARTA                ;如果是按下編碼器按鍵開關返回,就轉移,進行下一項設置
  228.         LJMP        START2                ;是15秒無操作自動保存返回,設置結束
  229. STARTA:        MOV        DISPL,#4        ;4=顯示“4——設置插電自動填入的定時時間”
  230.         LCALL        SDDSSJ                ;上電定時時間設置(小時)
  231.         JNZ        STARTB                ;如果是按下編碼器按鍵開關返回,就轉移,進行下一項設置
  232.         LJMP        START2                ;是15秒無操作自動保存返回,設置結束
  233. STARTB:        MOV        DISPL,#5        ;5=顯示“5——設置數碼管亮度”
  234.         LCALL        LDSZ                ;亮度設置
  235.         LJMP        START2

  236. ;--------------------------------------------------------------------------------------------------------
  237. ;子程序:根據編碼器旋轉方向加減定時時間。
  238. ;3小時及以下,按設置的值加減:5、10、15、20、25、30分鐘
  239. ;3小時以上每次增(減)30分鐘;10小時以上每次增(減)1個小時;20小時以上每次增(減)2個小時
  240. ;--------------------------------------------------------------------------------------------------------
  241. DSSJZJ:        MOV        DSSJM,#59        ;先放入59到定時時間(秒)
  242.         MOV        A,DSSJS                ;裝入定時時間(時)
  243.         CJNE        A,#20,DSZJ1        ;當前“時”是否等于或大于20
  244. DSZJ1:        JC        DSZJ2                ;小于就轉移
  245.         MOV        DSZJ,#2                ;等于或大于20,加減2個小時
  246.         LJMP        DSZJ4
  247. DSZJ2:        CJNE        A,#10,DSZJ3        ;當前“時”是否等于或大于10
  248. DSZJ3:        JC        DSZJ8                ;小于就轉移
  249.         MOV        DSZJ,#1                ;等于或大于10,加減1個小時
  250. DSZJ4:         JNB        01H,DSZJ6        ;如果位地址01H為0(逆時針反轉)就轉移
  251.         ADD        A,DSZJ                ;是正轉,加
  252.         CJNE        A,#100,DSZJ5        ;加完后是否等于或大于100
  253. DSZJ5:        JC        DSZJ7                ;如果小于就轉移,把A放回到DSSJS
  254.         MOV        DSSJS,#99        ;已經大于99了,直接設置為99:59:59
  255.         MOV        DSSJF,#59        ;已經大于99了,直接設置為99:59:59
  256.         RET
  257. DSZJ6:        SUBB        A,DSZJ                ;是反轉,減
  258. DSZJ7:        MOV        DSSJS,A                ;把計算結果放入DSSJS
  259.         RET
  260. DSZJ8:        MOV        DSZJ,BMQZJ        ;把設置的“增(減)值”放入DSZJ
  261.         CJNE        A,#3,DSZJ11        ;當前“時”不是3就轉移
  262.         JB        01H,DSZJ12         ;是3,如果位地址01H為1(正轉)就轉移,把DSZJ處的“增(減)值”改為30(分鐘)
  263.         MOV        A,DSSJF                ;是反轉,裝入定時時間(分)
  264.         JZ        DSZJ13                ;如果當前“分”為0(3:00)就轉移,按設置的增(減)值減
  265.         CJNE        A,#30,DSZJ9        ;“分”不為0,是否等于或大于30
  266. DSZJ9:        JC        DSZJ10                ;小于就轉移,把0放入定時時間(分),使時間變為3:00
  267.         SUBB        A,#30                ;等于或大于,減30分
  268.         MOV        DSSJF,A                ;把計算結果放入定時時間(分)
  269.         RET
  270. DSZJ10:        MOV        DSSJF,#0        ;小于30,把0放入定時時間(分),使時間變為3:00
  271.         RET
  272. DSZJ11:        JC        DSZJ13                 ;小于3就轉移
  273. DSZJ12:        MOV        DSZJ,#30        ;大于3:00,把DSZJ處的“增(減)值”改為30(分鐘)
  274. DSZJ13:        MOV        A,DSSJF                ;裝入定時時間(分)
  275.         JNB        01H,DSZJ16         ;如果位地址01H為0(逆時針反轉)就轉移
  276.         ADD        A,DSZJ                ;是正轉,當前“分”直接加DSZJ處的“增(減)值”
  277.         CJNE        A,#60,DSZJ14        ;加完后“分”是否等于或大于60
  278. DSZJ14:        JC        DSZJ15                ;小于60就轉移,把A放入定時時間(分)
  279.         SUBB        A,#60                ;等于或大于60,就減60,然后小時加1
  280.         MOV        DSSJF,A                ;把A放入定時時間(分)
  281.         MOV        A,DSSJS                ;裝入“時”
  282.         INC        A                ;小時加1
  283.         MOV        DSSJS,A
  284.         CJNE        A,#3,DSZJ19        ;加完后“時”不是3就轉移,退出
  285.         CLR        A                ;加完后大于3:00了,把0放入定時時間(分),使時間變為3:00
  286. DSZJ15:        MOV        DSSJF,A
  287.         RET
  288. DSZJ16:        CJNE        A,DSZJ,DSZJ17        ;是逆時針反轉,當前“分”是否等于或大于DSZJ處的“增(減)值”
  289. DSZJ17:        JC        DSZJ20                ;小于就轉移
  290.         SUBB        A,DSZJ                ;等于或大于,定時時間(分)減“增(減)值”
  291.         MOV        DSSJF,A                ;把計算結果放入定時時間(分)
  292.         JZ        DSZJ18                ;如果“分”為0就轉移
  293.         RET
  294. DSZJ18:        CJNE        A,DSSJS,DSZJ19        ;如果“時”不為0就轉移
  295.         MOV        DSSJM,A                ;“時、分”都為0,“秒”也清零
  296. DSZJ19:        RET
  297. DSZJ20:        MOV        A,DSZJ                ;“分”小于“增(減)值”,裝入DSZJ處的“增(減)值”
  298.         CLR        C                ;進位標志清0
  299.         SUBB        A,DSSJF                ;“增(減)值”減“定時時間(分)”
  300.         MOV        DSSJF,A                ;減完后的結果暫時放入DSSJF
  301.         MOV        A,#60
  302.         SUBB        A,DSSJF                ;60減上面的計算結果,得出定時時間(分),然后小時減1
  303.         MOV        DSSJF,A                ;得出的數放入定時時間(分)
  304.         MOV        A,DSSJS                ;裝入定時時間(時)
  305.         JZ        DSSJQL                ;如果“時”為0就轉移(不夠減了,把定時時間清零)
  306.         DEC        DSSJS                ;“時”不為0,減1
  307.         RET
  308. DSSJQL: CLR        A
  309.         MOV        DSSJS,A                ;定時時間清零
  310.         MOV        DSSJF,A                ;定時時間清零
  311.         MOV        DSSJM,A                ;定時時間清零
  312.         RET

  313. ;----------------------------------------------------------------------------------------
  314. ;設置自然風通斷電周期時長,5~30秒
  315. ;----------------------------------------------------------------------------------------
  316. ZQSZ:        MOV        XXSZ,#5                ;下限為5秒
  317.         MOV        SXSZ,#30        ;上限為30秒
  318.         LJMP        LDSZ1

  319. ;----------------------------------------------------------------------------------------
  320. ;設置自然風時電機通電時長,最短為2秒;最長為上一項(自然風通斷電周期)所設的周期減3秒
  321. ;----------------------------------------------------------------------------------------
  322. TDSC:        MOV        A,ZRFZQ                ;裝入“自然風通斷電周期”
  323.         SUBB        A,#3                ;減3秒
  324.         MOV        SXSZ,A                ;放入上限值
  325.         MOV        XXSZ,#2                ;下限為2秒
  326.         LJMP        LDSZ1

  327. ;----------------------------------------------------------------------------------------
  328. ;設置2小時以下定時調整時,編碼器每轉動一小格的增(減)值,5、10、15、20、25、30分鐘
  329. ;----------------------------------------------------------------------------------------
  330. BMQZJZ:        MOV        XXSZ,#5                ;下限為5
  331.         MOV        SXSZ,#30        ;上限為30
  332.         MOV        R4,#5                ;調整時的加減步長值
  333.         LJMP        SZTZ

  334. ;----------------------------------------------------------------------------------------
  335. ;設置插電就自動填入的定時時間,0~30小時
  336. ;----------------------------------------------------------------------------------------
  337. SDDSSJ:        MOV        XXSZ,#0                ;下限為0小時
  338.         MOV        SXSZ,#30        ;上限為30小時
  339.         LJMP        LDSZ1

  340. ;----------------------------------------------------------------------------------------
  341. ;設置數碼管亮度,1~8級,8級亮度最高
  342. ;----------------------------------------------------------------------------------------
  343. LDSZ:        MOV        XXSZ,#1                ;下限為1
  344.         MOV        SXSZ,#8                ;上限為8
  345. LDSZ1:        MOV        R4,#1                ;調整時的加減步長值
  346.         LJMP        SZTZ

  347. ;----------------------------------------------------------------------------------------
  348. ;子程序:根據XXSZ、SXSZ設定的上下限范圍、編碼器旋轉方向,調整DISPL指向的對象。
  349. ;無操作10秒后開始閃爍顯示,15秒自動保存并退出;有按鍵動作就保存并退出
  350. ;入口參數:下限值放入XXSZ;上限值放入SXSZ;R4=加、減步長值
  351. ;出口參數:15秒無操作自動保存退出A=0;按編碼器按鍵開關保存退出A=1
  352. ;----------------------------------------------------------------------------------------
  353. SZTZ:        MOV        MJS,#15                ;放入15秒
  354.         CLR        03H                ;位地址03H置為0,允許檢查剩余時間
  355. SZTZ1:        LCALL        SKEY                ;掃描編碼器按鍵開關
  356.         JNC        SZTZ2                ;沒有按鍵動作(C=0)就轉移
  357.         CLR        04H                ;有按鍵動作,把位地址04H置為0,不閃爍顯示
  358.         LCALL        WSET                ;保存設置
  359.         LCALL        KEYEX                ;等待按鍵松開
  360.         LCALL        SKEY1                ;延時10毫秒
  361.         LCALL        SKEY1                ;
  362.         LCALL        SKEY1                ;共延時30毫秒
  363.         MOV        A,#1                ;按編碼器按鍵開關保存退出A=1
  364.         RET
  365. SZTZ2:        JB        00H,SZTZ4        ;如果位地址00H為1(編碼器已經轉動)就轉移
  366.         MOV        A,MJS                ;沒有轉動,裝入秒計數到寄存器A
  367.         JZ        SZTZ3                ;如果秒計數為0(15秒無操作)就轉移
  368.         JB        03H,SZTZ1        ;不為0,如果位地址03H為1就轉移,不檢查剩余時間
  369.         CJNE        A,#5,SZTZ1        ;檢查剩余時間,如果不是5秒就轉移,繼續掃描編碼器
  370.         SETB        04H                ;還剩5秒,把位地址04H置為1,設置為閃爍顯示
  371.         MOV        SSSC,A                ;閃爍時長5秒放入SSSC
  372.         SETB        03H                ;位地址03H置為1,禁止檢查剩余時間
  373.         LJMP        SZTZ1
  374. SZTZ3:        CLR        04H                ;15秒時間到,把位地址04H置為0,不閃爍顯示
  375.         LCALL        WSET                ;保存設置
  376.         CLR        A                ;15秒無操作自動保存退出A=0
  377.         RET
  378. SZTZ4:        CLR        04H                ;編碼器已經轉動,把位地址04H置為0,不閃爍顯示
  379.         SETB        EC11A                ;拉高編碼器A引腳電平
  380.         SETB        EC11B                ;拉高編碼器B引腳電平
  381.         JNB        EC11A,SZTZ        ;如果仍為0(低電平)就轉移,說明還沒有旋轉到卡點位置
  382.         JNB        EC11B,SZTZ        ;如果仍為0(低電平)就轉移,說明還沒有旋轉到卡點位置
  383.         MOV        A,DISPL                ;AB引腳都為高電平,已經旋轉到卡點位置了,裝入要設置的目標項
  384.         DEC        A                ;減1
  385.         ADD        A,#ZRFZQ        ;加上各項設置的起始地址
  386.         MOV        R0,A                ;把得出的具體地址放入R0
  387.         JB        01H,SZTZ7         ;如果位地址01H為1(順時針正轉)就轉移
  388.         MOV        A,XXSZ                ;是反轉,裝入下限數值到A寄存器
  389.         ADD        A,R4                ;加步長值
  390.         MOV        MJS,A                ;把下限值+步長值的結果暫時放入MJS
  391.         MOV        A,@R0                ;裝入R0指向的RAM地址的調整對象數值
  392.         CJNE        A,MJS,SZTZ5        ;調整對象數值與“下限值+步長值”比較
  393. SZTZ5:        JC        SZTZ6                ;如果調整對象數值小于“下限值+步長值”(不夠減)就轉移
  394.         SUBB        A,R4                ;等于或大于,減步長值
  395.         MOV        @R0,A                ;把計算結果放回去
  396.         LJMP        SZTZ10
  397. SZTZ6:        MOV        @R0,XXSZ        ;不夠減了,直接放入下限值
  398.         LJMP        SZTZ10
  399. SZTZ7:        MOV        A,@R0                ;是正轉,裝入R0指向的RAM地址的調整對象數值
  400.         ADD        A,R4                ;加步長值
  401.         CJNE        A,SXSZ,SZTZ8        ;加完后與上限數值比較
  402. SZTZ8:        JC        SZTZ9                ;如果小于就轉移
  403.         MOV        @R0,SXSZ        ;等于或大于,直接放入上限值
  404.         LJMP        SZTZ10
  405. SZTZ9:        MOV        @R0,A                ;小于上限數值,把計算結果放回去
  406. SZTZ10:        CLR        00H                ;把位地址00H置為0,表示已經處理編碼器旋轉動作
  407.         LJMP        SZTZ

  408. ;----------------------------------------------------------------------------------------
  409. ;子程序:編碼器按鍵開關處理
  410. ;出口參數:A=1(按了1次);A=2(按了2次);A=3長按達到了15秒;A=4長按達到了5秒
  411. ;----------------------------------------------------------------------------------------
  412. KEY:        MOV        MJS,#15                ;放入等待時間,15秒
  413. KEY1:        MOV        A,MJS                ;裝入等待時間
  414.         JNZ        KEY2                ;如果不為0就轉移,時間未到
  415.         MOV        A,#3                ;為0,時間到了,放入3到A寄存器,長按達到了15秒
  416.         RET
  417. KEY2:        LCALL        SKEY                ;掃描按鍵
  418.         JC        KEY1                ;如果C=1(按鍵還沒松開),就繼續掃描
  419.         CJNE        A,#10,KEY3        ;按鍵松開了,剩余時間與10比較,不等于就轉移
  420.         LJMP        KEY4                ;等于10,長按時間達到了5秒(15-10=5)
  421. KEY3:        JNC        KEY5                ;大于10就轉移
  422. KEY4:        MOV        A,#4                ;等于或小于10,放入4到A寄存器,長按時間達到了5秒以上
  423.         RET
  424. KEY5:        LCALL        KEYA                ;大于10,按下的時間小于5秒,掃描按鍵600毫秒
  425.         JZ        KEY6                ;如果600毫秒內有按鍵動作就轉移
  426.         RET                        ;600毫秒內沒有按鍵動作,這時A=1(按了1次),退出
  427. KEY6:        LCALL        KEYEX                ;等待第二次按鍵松開
  428.         MOV        A,#2                ;按鍵松開了,A=2(按了2次)
  429.         RET

  430. ;------------------ 掃描按鍵開關600毫秒,有按鍵動作A=0,無按鍵動作A=1 ------------------
  431. KEYA:        PUSH        03H
  432.         MOV        03H,#60                ;等待600毫秒,10*60=600毫秒
  433. KEYB:        MOV        A,SJJS                ;裝入(10)毫秒計數
  434. KEYC:        CJNE        A,SJJS,KEYD        ;如果不相同就轉移,說明時間已經過了10毫秒
  435.         LCALL        SKEY                ;掃描按鍵
  436.         JC        KEYE                ;如果有按鍵動作(C=1)就轉移
  437.         LJMP        KEYC
  438. KEYD:        DJNZ        03H,KEYB        ;03H減1,不為0就轉移,繼續掃描
  439.         POP        03H
  440.         MOV        A,#1                ;600毫秒等待時間已到,A=1沒有按鍵動作
  441.         RET
  442. KEYE:        POP        03H
  443.         CLR        A                ;600毫秒內有按鍵動作A=0
  444.         RET

  445. ;------------------ 等待按鍵松開 ------------------
  446. KEYEX:        LCALL        SKEY                ;掃描按鍵
  447.         JC        KEYEX                ;如果C=1(按鍵還沒松開),就繼續掃描
  448.         RET

  449. ;------------------ 按鍵開關掃描,未按C=0,已按下C=1 ------------------
  450. SKEY:        SETB        EC11K                ;按鍵開關設為高電平
  451.         JNB        EC11K,SKEY1        ;為0(低電平)就轉移,表示按鍵開關已經被按下
  452. SKEY0:        CLR        C                ;為1(高電平),C置為0,沒有按鍵動作
  453.         LCALL        WG                ;喂狗
  454.         RET
  455. SKEY1:        PUSH        00H                ;按鍵已被按下,延時10毫秒
  456.         PUSH        01H                ;延時10毫秒
  457.         MOV        00H,#87                ;延時10毫秒
  458.         MOV        01H,#10                ;延時10毫秒
  459. SKEY2:        DJNZ        01H,SKEY2        ;延時10毫秒
  460.         DJNZ        00H,SKEY2        ;延時10毫秒
  461.         POP        01H                ;延時10毫秒
  462.         POP        00H                ;延時10毫秒
  463.         SETB        EC11K                ;延時結束后再次把按鍵開關設為高電平
  464.         JB        EC11K,SKEY0        ;為1就轉移,按鍵開關未被有效按下
  465.         SETB        C                ;為1,按鍵動作有效,置C為1
  466.         LCALL        WG                ;喂狗
  467.         RET

  468. ;*************************** 以下為EEPROM操作子程序 **********************************
  469. ;STC89C51RC有4K字節的EEPROM,由8個扇區組成,每個扇區512字節,地址2000H-2FFFH
  470. ;第1扇區:2000H~21FFH,第2扇區:2200H~23FFH……第8扇區:2E00H~2FFFH
  471. ;-------------------------------------------
  472. ;讀一字節,A=讀出的數據
  473. Byte_Read:
  474.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開IAP功能,設置Flash操作等待時間(83H)
  475.         MOV        IAP_CMD,#01                ;設置為IAP/ISP/EEPROM字節讀模式命令(1)
  476.         MOV        IAP_TRIG,#46H                ;先送46H
  477.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發起動
  478.         NOP
  479.         MOV        A,IAP_DATA                ;讀出的數據在IAP_DATA單元中,送入累加器A
  480.         RET
  481. ;-------------------------------------------
  482. ;字節編程,A=需寫入的數據
  483. Byte_Program:
  484.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開IAP功能,設置Flash操作等待時間(83H)
  485.         MOV        IAP_CMD,#02                ;設置為IAP/ISP/EEPROM字節編程模式命令(2)
  486.         MOV        IAP_DATA,A                ;要編程的數據先送進IAP_DATA寄存器
  487.         MOV        IAP_TRIG,#46H                ;先送46H
  488.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發起動
  489.         RET
  490. ;-------------------------------------------
  491. ;擦除扇區
  492. Sector_Erase:
  493.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開IAP功能,設置Flash操作等待時間(83H)
  494.         MOV        IAP_CMD,#03                ;設置為IAP/ISP/EEPROM扇區擦除模式命令(3)
  495.         MOV        IAP_TRIG,#46H                ;先送46H
  496.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發起動
  497.         NOP
  498.         RET

  499. ;---------- 讀EEPROM保存的各項設置,如果沒有就設置為默認值并保存 ------------
  500. REEP:        LCALL        RE00                ;讀EEPROM保存的各項設置
  501.         MOV        A,SDDS                ;裝入“上電就自動設定的定時時間(小時)”
  502.         JZ        REEP0                ;如果是0就轉移,退出
  503.         MOV        DSSJS,A                ;放入“定時時間(小時)”
  504.         MOV        DSSJM,#59        ;放入59到“定時時間(秒)”
  505. REEP0:        RET
  506. RE00:        MOV        IAP_ADDRH,#020H        ;從第一個扇區開始搜索,地址的高8位
  507. RE01:        MOV        IAP_ADDRL,#0        ;從第一個扇區開始搜索,地址的低8位
  508.         LCALL        Byte_Read        ;讀第一個字節,返回:A=讀出的數據
  509.         CJNE        A,FWBZ1,RE03        ;是否保存在當前扇區,不是就轉移到RE03
  510.         INC        IAP_ADDRL        ;EEPROM字節地址增1
  511.         LCALL        Byte_Read        ;讀第二個字節
  512.         CJNE        A,FWBZ2,RE03        ;第二個字節是否相符
  513.         MOV        R1,#ZRFZQ        ;相符,從ZRFZQ開始放置讀出的設置值
  514.         MOV        R2,#5                ;總共5個字節
  515. RE02:        INC        IAP_ADDRL        ;EEPROM字節地址增1
  516.         LCALL        Byte_Read        ;讀一個字節,返回:A=讀出的數據
  517.         MOV        @R1,A                ;放到R1指向的RAM地址
  518.         INC        R1                ;RAM地址增1
  519.         DJNZ        R2,RE02                ;未讀完就繼續
  520.         RET                        ;讀完了,退出
  521. RE03:        MOV        A,IAP_ADDRH        ;裝入扇區地址的高8位
  522.         ADD        A,#2                ;扇區增1
  523.         MOV        IAP_ADDRH,A        ;放入IAP_ADDRH
  524.         CJNE        A,#30H,RE01        ;如果未搜索完最后一個扇區+2(2EH+2=30H)就轉移,繼續搜索
  525.         LCALL        SZMRZ                ;已經搜索全部八個扇區,未找到保存的內容,設置為默認值
  526.         MOV        R0,#8                ;總扇區數量,共8個扇區
  527.         LJMP        WSET3                ;跳轉到WSET3保存設置

  528. ;------------------ 保存設置,不固定保存到某個扇區,各扇區輪流使用 ------------------
  529. WSET:        MOV        R0,#8                ;扇區總數量,共8個扇區
  530.         MOV        IAP_ADDRH,#020H        ;從第一個扇區開始搜索上次保存的設置
  531. WSET1:        MOV        IAP_ADDRL,#0        ;地址低位指向第一個字節
  532.         LCALL        Byte_Read        ;讀第一個字節,返回:A=讀出的數據
  533.         CJNE        A,FWBZ1,WSET7        ;如果與EEPROM數據判斷標志1不相同就轉移
  534.         INC        IAP_ADDRL        ;第一個字節相同,EEPROM字節地址增1
  535.         LCALL        Byte_Read        ;讀第二個字節
  536.         CJNE        A,FWBZ2,WSET7        ;如果與EEPROM數據判斷標志2不相同就轉移
  537.         MOV        IAP_ADDRL,#0        ;是在當前扇區,地址指向扇區第一個字節
  538.         LCALL        Sector_Erase        ;擦除當前扇區,另換一個扇區保存
  539. WSET2:        MOV        A,IAP_ADDRH        ;裝入扇區地址高位到寄存器A
  540.         CJNE        A,#020H,WSET3        ;當前扇區地址高位如果不是20H(第一個扇區)就轉移
  541.         MOV        IAP_ADDRH,#30H        ;是20H,把IAP_ADDRH設置為最后一個扇區+2(2EH+2=30H)
  542. WSET3:        DEC        IAP_ADDRH        ;減1
  543.         DEC        IAP_ADDRH        ;再減1,指向上一個扇區首址
  544.         MOV        IAP_ADDRL,#0        ;低8位指向扇區第一個字節
  545.         LCALL        Sector_Erase        ;擦除整個扇區
  546.         MOV        R1,#FWBZ1        ;要保存的內容始址
  547.         MOV        R2,#7                ;共7個字節
  548. WSET4:        MOV        A,@R1                ;裝入R1指向的RAM地址的內容到A
  549.         LCALL        Byte_Program        ;字節編程(寫入EEPROM)
  550.         INC        IAP_ADDRL        ;EEPROM地址加1
  551.         INC        R1                ;RAM地址增1
  552.         DJNZ        R2,WSET4        ;未保存完就繼續
  553.         MOV        IAP_ADDRL,#0        ;保存完了,扇區地址低位指向0(當前扇區首址)
  554.         LCALL        Byte_Read        ;讀出來檢查看是否寫入成功
  555.         CJNE        A,FWBZ1,WSET5        ;如果與EEPROM數據判斷標志1不相同就轉移
  556.         INC        IAP_ADDRL        ;EEPROM地址加1
  557.         LCALL        Byte_Read        ;讀第二個字節
  558.         CJNE        A,FWBZ2,WSET5        ;如果與EEPROM數據判斷標志2不相同就轉移
  559.         RET                        ;成功了,退出
  560. WSET5:        DJNZ        R0,WSET2        ;如果未試完8個扇區就轉移到WSET2繼續往前一個扇區寫
  561.         SETB        07H                ;已經試完8個扇區,都失敗了,位地址07H置為1
  562.         MOV        SSSC,#5                ;顯示E1五秒
  563.         MOV        ZXM1,#0                ;消隱碼
  564.         MOV        ZXM2,#079H        ;E
  565.         MOV        ZXM3,#006H        ;1
  566.         MOV        ZXM4,#0                ;消隱碼
  567.         LCALL        DISP                ;顯示
  568. WSET6:        MOV        A,SSSC
  569.         LCALL        WG                ;喂狗
  570.         JNZ        WSET6                ;等待SSSC為0秒
  571.         CLR        07H                ;顯示結束,位地址07H置為0
  572.         RET
  573. WSET7:        MOV        A,IAP_ADDRH        ;裝入扇區地址高位
  574.         ADD        A,#2                ;加2,指向下一個扇區首址
  575.         MOV        IAP_ADDRH,A        ;放回IAP_ADDRH
  576.         CJNE        A,#30H,WSET1        ;如果未到最后一個扇區地址高位+2(2EH+2=30H)就轉移到WSET1繼續搜索
  577.         LJMP        WSET3                ;是30H,已經搜索完所有扇區,未找到上次保存的數據,跳轉到WSET3保存當前設置
  578. ;***************************************** 以上為EEPROM操作子程序 ********************************************

  579. ;------------------------------------------------------------------------------------------
  580. ;子程序:T0中斷調用,時間計數及倒計時處理
  581. ;------------------------------------------------------------------------------------------
  582. TIME:        MOV        A,SJJS                 ;裝入(10)毫秒時間計數
  583.         JZ        TIME2                ;如果是0就轉移
  584.         DEC        SJJS                ;不是0,減1
  585.         CJNE        A,#50,TIME1        ;如果不是50就轉移退出
  586.         CPL        05H                ;位地址第05位取反,數字及冒號閃爍時用,每0.5秒取反一次
  587. TIME1:        RET
  588. TIME2:        CPL        05H                ;是0,位地址第05位取反,數字及冒號閃爍時用,每0.5秒取反一次
  589.         MOV        DPTR,#HMJS        ;把定義的時間計數值地址裝入數據指針DPTR
  590.         MOVC        A,@A+DPTR        ;從程序存儲區裝入時間計數值到A寄存器
  591.         MOV        SJJS,A                ;時間計數值放入SJJS,重新計數
  592.         MOV        A,MJS                 ;裝入秒計數
  593.         JZ        TIME20                ;如果是0就轉移
  594.         DEC        MJS                ;不是0,減1秒
  595. TIME20:        MOV        A,SSSC                 ;裝入閃爍時長秒計數
  596.         JZ        TIME3                ;如果是0就轉移
  597.         DEC        SSSC                ;不是0,減1秒
  598. TIME3:        MOV        A,SJ                ;裝入自然風時電機通電時長到寄存器A
  599.         JZ        TIME4                ;如果是0就轉移
  600.         DEC        SJ                ;不是0,減1秒
  601. TIME4:        MOV        A,ZQ                ;裝入自然風變化周期時長到寄存器A
  602.         DEC        ZQ                ;先減1
  603.         JNZ        TIME5                ;如果不是0就轉移
  604.         MOV        ZQ,ZRFZQ        ;是0,重新裝入設置值
  605.         MOV        SJ,ZRFSJ        ;是0,重新裝入設置值
  606. TIME5:        MOV        A,DSSJM                ;裝入定時時間(秒)到寄存器A
  607.         JZ        TIME7                ;如果是0就轉移
  608.         CJNE        A,#59,TIME6        ;如果不是59秒就轉移
  609.         MOV        A,DSSJF                ;是59秒,檢查“時”
  610.         JNZ        TIME6                ;不是0就轉移
  611.         MOV        A,DSSJS                ;檢查“分”
  612.         JNZ        TIME6                ;不是0就轉移
  613.         MOV        DSSJM,A                ;“時、分”都是0,把“秒”也清零
  614.         RET
  615. TIME6:        DEC        DSSJM                ;不是0,減1秒
  616.         RET
  617. TIME7:        MOV        A,DSSJF                ;裝入定時時間(分)到寄存器A
  618.         JZ        TIME8                ;如果是0就轉移
  619.         DEC        DSSJF                ;不是0,減1分
  620.         MOV        DSSJM,#59        ;把59放入定時時間(秒)
  621.         RET
  622. TIME8:        MOV        A,DSSJS                ;裝入定時時間(時)到寄存器A
  623.         JZ        TIME9                ;如果是0就轉移,退出
  624.         DEC        DSSJS                ;不是0,小時減1
  625.         MOV        DSSJM,#59        ;把59放入定時時間(秒)
  626.         MOV        DSSJF,#59        ;把59放入定時時間(分)
  627. TIME9:        RET

  628. ;---------------------------------------------------------------------------------------------
  629. ;子程序:T0中斷調用,根據條件控制自然風狀態LED指示燈和可控硅
  630. ;---------------------------------------------------------------------------------------------
  631. Control:SETB        LED                ;先熄滅自然風LED指示燈
  632.         JNB        02H,CTL00        ;如果位地址02H(正常/自然風切換)為0(正常)就轉移,保持熄滅狀態
  633.         CLR        LED                ;為1,自然風狀態,點亮LED指示燈
  634. CTL00:        MOV        A,DSSJM                ;裝入定時時間(秒)到寄存器A
  635.         JNZ        CTL02                ;如果不是0就轉移
  636.         MOV        A,DSSJF                ;裝入定時時間(分)到寄存器A
  637.         JNZ        CTL02                ;如果不是0就轉移
  638.         MOV        A,DSSJS                ;裝入定時時間(時)到寄存器A
  639.         JNZ        CTL02                ;如果不是0就轉移
  640. CTL01:        SETB        MOC                ;置MOC為高電平,斷電
  641.         RET
  642. CTL02:        JNB        02H,CTL03        ;如果位地址02H(正常/自然風切換)為0(正常)就轉移,通電
  643.         MOV        A,SJ                ;是自然風狀態,裝入自然風時電機通電時長到寄存器A
  644.         JZ        CTL01                ;如果為0(通電倒計時結束)就轉移,斷電
  645. CTL03:        CLR        MOC                ;置MOC為低電平,通電
  646.         RET

  647. ;------------------------------------------------------------------------------------------
  648. ;子程序:T0中斷調用,顯示定時時間及各項設置的內容
  649. ;------------------------------------------------------------------------------------------
  650. DISPLAY:JB        06H,DPYSZ1        ;如果位地址06H為1就轉移退出,主程序顯示88:88
  651.         JB        07H,DPYSZ1        ;如果位地址07H為1就轉移退出,主程序顯示E1
  652.         MOV        A,DISPL                ;裝入要顯示的目標
  653.         JZ        DISPL0                ;如果是0(顯示定時時間)就轉移
  654. DPYSZ:        PUSH        ACC
  655.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  656.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  657.         MOV        ZXM1,A                ;項目編號字形碼放到待發送TM1637區1
  658.         MOV        ZXM2,#40H        ;放入“-”的字形碼到待發送TM1637區2
  659.         POP        ACC
  660.         DEC        A                ;減1
  661.         PUSH        01H
  662.         MOV        R1,#ZRFZQ        ;各項設置值始址
  663.         ADD        A,R1                ;加上項目號
  664.         MOV        R1,A                ;得出設置項目的實際地址放入R1
  665.         MOV        A,@R1                ;裝入設置值
  666.         POP        01H
  667.         MOV        B,A                ;放入B寄存器
  668.         CJNE        A,XSHC1,DPYSZ3        ;當前設置值與顯示緩存1不相同就轉移,立即顯示
  669.         MOV        A,SJJS                 ;相同,裝入時間計數
  670.         JNZ        DPYSZ2                ;不是0就轉移,每半秒(遇到50或0)顯示一次
  671.         LJMP        DPYSZ3                ;是0,顯示
  672. DPYSZ1:        RET
  673. DPYSZ2:        CJNE        A,#50,DPYSZ1        ;不是50就轉移退出,每半秒(遇到50或0)顯示一次
  674. DPYSZ3:        MOV        XSHC1,B                ;當前設置值放入顯示緩存1
  675.         JNB        04H,DPYSZ4        ;如果位地址04H為0(不閃爍)就轉移
  676.         JNB        05H,DPYSZ4        ;為1,閃爍顯示,如果位地址05H為0(顯示)就轉移
  677.         CLR        A                ;為1,處于閃爍顯示中的“不顯示”狀態,放入消隱碼
  678.         MOV        ZXM1,A                ;放入消隱碼
  679.         MOV        ZXM2,A                ;放入消隱碼
  680.         MOV        ZXM3,A                ;放入消隱碼
  681.         MOV        ZXM4,A                ;放入消隱碼
  682.         LJMP        disp                ;跳轉到disp,發送4個字節數據到TM1637顯示
  683. DPYSZ4:        MOV        A,B                ;當前設置值放入A寄存器
  684.         LCALL        DISPL6                ;轉換并獲取字形碼放到待發送TM1637區3和4
  685.         LJMP        disp                ;跳轉到disp,發送4個字節數據到TM1637顯示
  686. DISPL0:        MOV        A,DSSJS                ;顯示定時時間,裝入定時時間(時)
  687.         CJNE        A,XSHC1,DISPL3        ;定時時間(時)與顯示緩存1不相同就轉移,顯示
  688.         MOV        A,DSSJF
  689.         CJNE        A,XSHC2,DISPL3        ;定時時間(分)與顯示緩存2不相同就轉移,顯示
  690.         MOV        A,SJJS                 ;時、分都相同,裝入(10)毫秒時間計數
  691.         JNZ        DISPL2                ;不是0就轉移
  692.         LJMP        DISPL3                ;是0,顯示,每半秒(遇到50或0)顯示一次
  693. DISPL1:        RET
  694. DISPL2:        CJNE        A,#50,DISPL1        ;不是50就轉移,每半秒(遇到50或0)顯示一次
  695. DISPL3:        MOV        XSHC1,DSSJS        ;當前時間放入顯示緩存1
  696.         MOV        XSHC2,DSSJF        ;當前時間放入顯示緩存2
  697.         MOV        A,DSSJM                ;
  698.         JNZ        DISPL4                ;檢查當前定時時間是否全部為0,不是就轉移
  699.         MOV        A,DSSJF                ;
  700.         JNZ        DISPL4                ;檢查當前定時時間是否全部為0,不是就轉移
  701.         MOV        A,DSSJS                ;
  702.         JNZ        DISPL4                ;檢查當前定時時間是否全部為0,不是就轉移
  703.         CLR        05H                ;定時時間為0,把位地址05H置為0,冒號不閃爍顯示
  704. DISPL4:        MOV        A,DSSJS                ;裝入“時”
  705.         MOV        B,#10                ;轉換為BCD碼
  706.         DIV        AB                ;轉換為BCD碼
  707.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  708.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  709.         MOV        ZXM1,A                ;字形碼放入待發送TM1637區1
  710.         XCH        A,B                ;A、B寄存器內容交換
  711.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  712.         JB        05H,DISPL5        ;如果05H為1就轉移,不顯示冒號
  713.         ORL        A,#10000000B        ;為0,把最高位置為1,顯示冒號(字形碼的最高位為1就顯示冒號)
  714. DISPL5:        MOV        ZXM2,A                ;放入待發送TM1637區2
  715.         MOV        A,DSSJF                ;裝入“分”
  716.         LCALL        DISPL6                ;轉換并獲取字形碼放到待發送TM1637區3和4
  717.         LJMP        disp                ;跳轉到disp,發送4個字節數據到TM1637顯示
  718. DISPL6:        MOV        B,#10                ;轉換為BCD碼
  719.         DIV        AB                ;轉換為BCD碼
  720.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  721.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  722.         MOV        ZXM3,A                ;字形碼放入待發送TM1637區3
  723.         XCH        A,B                ;A、B寄存器內容交換
  724.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  725.         MOV        ZXM4,A                ;字形碼放入待發送TM1637區4
  726.         RET

  727. ;------------------ 發送4個字節數據到TM1637顯示,地址自動加1 ------------------
  728. disp:        LCALL        Srt
  729.         MOV          A,#040H                ;數據命令設置40H:地址自動加1,寫數據到顯示寄存器
  730.         LCALL        Writebyte        ;發送一個字節
  731.         LCALL        Stop
  732.         NOP
  733.         LCALL        Srt
  734.         MOV          A,#0C0H                ;地址命令設置C0H:初始地址為00H
  735.         LCALL        Writebyte        ;發送一個字節
  736.         PUSH        01H
  737.         PUSH        06H
  738.         MOV        06H,#4                ;發送4個字節數據
  739.         MOV          R1,#ZXM1        ;等待發送的字形碼始址
  740. disp1:        MOV          A,@R1                ;裝入要發送的字形碼
  741.         LCALL        Writebyte        ;發送一個字節
  742.         INC          R1                ;地址加1
  743.         DJNZ        06H,disp1            ;如果還未發送完就繼續
  744.         POP        06H
  745.         POP        01H
  746.         LCALL        Stop
  747.         LCALL        Srt
  748.         MOV        A,SMGLD                ;裝入設置的數碼管亮度(1~8)
  749.         ADD        A,#087H                ;加上87H后即為對應的亮度控制命令88H~8FH
  750.         LCALL        Writebyte        ;按設置的亮度開顯示
  751.         LJMP         Stop

  752. ;------------------ 發送8bit(一個字節)數據到TM1637,A=要發送的數據,從低位開始 ------------------
  753. Writebyte:
  754.         PUSH        00H
  755.         MOV        00H,#8                ;發送8位數據
  756. WBY1:        CLR          CLK                ;拉低CLK
  757.         JNB          ACC.0,WBY2        ;A寄存器的低位(0位)如果為0就轉移
  758.         SETB         DIO                ;為1,拉高DIO
  759.         SJMP         WBY3
  760. WBY2:        CLR          DIO                ;為0,拉低DIO
  761. WBY3:        NOP         
  762.         NOP         
  763.         NOP         
  764.         NOP         
  765.         NOP         
  766.         SETB         CLK                ;拉高CLK
  767.         CLR          C                ;進位標志清0
  768.         RRC          A                ;A寄存器內容帶進位循環右移
  769.         DJNZ        00H,WBY1            ;如果還未發送完8bit數據就繼續
  770. WBY4:        CLR          CLK                ;8位數據發送完了
  771.         NOP
  772.         MOV        00H,#05                ;設置等待應答信號計數值,防止萬一與TM1637通訊失敗而造成死循環
  773. WBY5:        DEC        00H                ;減1,正常情況下ACK應答信號很快,第一次減1就會有應答
  774.         MOV        A,00H                ;裝入計數值到A
  775.         JZ        WBY6                ;如果為0就轉移退出,說明與TM1637通訊失敗,或TM1637不存在
  776.         JB        DIO,WBY5        ;不為0,判斷TM1637發過來的ACK應答信號,未應答(為1,高電平)就轉移
  777. WBY6:        POP        00H
  778.         NOP         
  779.         NOP         
  780.         NOP
  781.         SETB         CLK
  782.         NOP         
  783.         NOP         
  784.         NOP
  785.         RET         

  786. ;------------------ Start子程序 ------------------
  787. Srt:        SETB         DIO        ;拉高DIO
  788.         SETB         CLK        ;拉高CLK
  789.         NOP         
  790.         NOP         
  791.         NOP         
  792.         NOP         
  793.         NOP         
  794.         SETB         DIO        ;拉高DIO
  795.         NOP         
  796.         NOP         
  797.         NOP         
  798.         NOP         
  799.         NOP         
  800.         CLR          DIO        ;拉低DIO
  801.         NOP         
  802.         NOP         
  803.         NOP         
  804.         NOP         
  805.         NOP         
  806.         CLR          CLK        ;拉低CLK
  807.         RET         

  808. ;------------------ Stop子程序 ------------------
  809. Stop:        CLR          CLK
  810.         NOP         
  811.         NOP         
  812.         NOP         
  813.         NOP         
  814.         NOP         
  815.         NOP         
  816.         NOP         
  817.         NOP         
  818.         NOP         
  819.         NOP         
  820.         CLR          DIO
  821.         NOP         
  822.         NOP         
  823.         NOP         
  824.         NOP         
  825.         NOP         
  826.         NOP         
  827.         NOP         
  828.         NOP         
  829.         NOP         
  830.         NOP         
  831.         SETB         CLK
  832.         NOP         
  833.         NOP         
  834.         NOP         
  835.         NOP         
  836.         NOP         
  837.         NOP         
  838.         NOP         
  839.         NOP         
  840.         NOP         
  841.         NOP         
  842.         NOP         
  843.         NOP         
  844.         NOP         
  845.         NOP         
  846.         NOP         
  847.         SETB         DIO
  848.         NOP         
  849.         NOP         
  850.         NOP         
  851.         NOP         
  852.         NOP         
  853.         CLR          CLK
  854.         CLR          DIO
  855.         RET         

  856. ;------------------ 字形表 ------------------
  857. SEGTAB:
  858.         DB  00111111B  ;0(3FH)
  859.         DB  00000110B  ;1(06H)
  860.         DB  01011011B  ;2(5BH)
  861.         DB  01001111B  ;3(4FH)
  862.         DB  01100110B  ;4(66H)
  863.         DB  01101101B  ;5(6DH)
  864.         DB  01111101B  ;6(7DH)
  865.         DB  00000111B  ;7(07H)
  866.         DB  01111111B  ;8(7FH)
  867.         DB  01101111B  ;9(6FH)
  868.         DB  01110111B  ;A(77H)
  869.         DB  01111100B  ;B(7CH)
  870.         DB  00111001B  ;C(39H)
  871.         DB  01011110B  ;D(5EH)
  872.         DB  01111001B  ;E(79H)
  873.         DB  01110001B  ;F(71H)
  874.         DB  00000000B  ;消隱碼(00)

  875. ;------------------------------------------------------------------------------------------

  876.         END
復制代碼

以上資料51hei下載地址:
電風扇長定時器.rar (95.52 KB, 下載次數: 98)


評分

參與人數 2黑幣 +100 收起 理由
新鄉家電維修 + 10 共享資料的黑幣獎勵!
admin + 90 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:517951 發表于 2020-11-13 21:34 | 只看該作者
完全匯編,牛!
回復

使用道具 舉報

板凳
ID:756506 發表于 2020-11-14 08:24 | 只看該作者
樓主好牛,匯編玩的這么溜,膜拜!
回復

使用道具 舉報

地板
ID:8222 發表于 2020-11-15 08:51 | 只看該作者
這是個大牛!!很厲害!!
回復

使用道具 舉報

5#
ID:8222 發表于 2021-1-6 13:30 | 只看該作者
看匯編,就象看天書!!牛人才能玩這個!!
回復

使用道具 舉報

6#
ID:23844 發表于 2021-1-30 17:36 | 只看該作者
匯編玩的溜,大俠級別,如果沒有寫注釋的話,比較難看懂。樓主威武
回復

使用道具 舉報

7#
ID:87631 發表于 2021-2-2 16:37 | 只看該作者
牛人啊,這只在學校玩過,現在不玩了
回復

使用道具 舉報

8#
ID:430492 發表于 2022-4-7 13:05 | 只看該作者
樓主好牛匯編玩的這么溜,膜拜中!!!!
回復

使用道具 舉報

9#
ID:76044 發表于 2022-8-25 11:20 | 只看該作者
樓主 能否辛苦下把TM1637顯示這部分的匯編代碼發一下,如讓數碼管顯示1.2.3.4.5.6,辛苦一下,很期待
回復

使用道具 舉報

10#
ID:53978 發表于 2022-9-1 17:05 | 只看該作者
可以用TM1650嗎?
回復

使用道具 舉報

11#
ID:748535 發表于 2022-11-8 16:10 | 只看該作者
不錯不錯  , 可以移植
回復

使用道具 舉報

12#
ID:1088110 發表于 2023-7-11 16:52 | 只看該作者
這匯編666
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人久久av免费高清密臂 | 啪啪免费网 | www操操| 国产精品美女久久久久久免费 | 欧美日一区二区 | 日韩久久中文字幕 | 日韩免费一区二区 | 在线欧美视频 | 日本爱爱视频 | 欧美日韩亚洲三区 | 亚洲视频免费 | 日韩在线小视频 | 国产高清视频在线 | 国产视频导航 | 日韩精品视频在线 | 在线观看中文字幕dvd播放 | 激情av| 91精品国产91久久久久久吃药 | 午夜精品一区二区三区在线观看 | 美女黄视频网站 | 久久最新 | 中文字幕一区二区三区日韩精品 | 久草在线| 日韩精品一区二区三区在线观看 | 国产视频三区 | 在线播放一区二区三区 | 欧美成人h版在线观看 | 韩国电影久久 | 精产嫩模国品一二三区 | 亚洲免费在线 | 日韩av一区二区在线观看 | 人人干在线视频 | 国产视频h | 久草电影网 | 婷婷国产一区 | 久久久女女女女999久久 | 91麻豆精品国产91久久久资源速度 | 激情久久网 | 国产精品视频一二三区 | 久久久久久国产精品久久 | 亚洲欧美日韩精品久久亚洲区 |