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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7750|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

五旬老漢學(xué)編程:紅外遙控電容調(diào)速風(fēng)扇控制器制作 附單片機程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:396309 發(fā)表于 2022-8-16 04:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
制作這個風(fēng)扇控制器主要是有時需要非常小的微風(fēng),特別是睡覺的時候,其次是年紀大了不容易睡著,想要定時久點,至少2小時以上。兩年前制作過一個風(fēng)扇控制器,不是特別好用,現(xiàn)在用電容做調(diào)速,效果不錯運行很靜沒有噪音。原打算用可控硅控制,無奈試了幾種電路形式都會不定期損壞可控硅,甚至有過幾次一插電就擊穿,只好放棄,改用繼電器控制,繼電器的缺點是吸合/斷開有噠噠響的聲音,所以先全功率驅(qū)動繼電器,延時一定時間后使用PWM方式驅(qū)動保持吸合狀態(tài),降低功耗減少發(fā)熱量,這樣就可以用隔音材料把它包起來,減小噠噠響的聲音。PWM頻率過低會聽到繼電器線圈產(chǎn)生的噪音,所以定為人耳可聽范圍的上限20KHz,占空比50%,實測驅(qū)動電流為30%左右,能保持吸合狀態(tài),在繼電器線圈并聯(lián)一只104電容后驅(qū)動電流為50%左右,為了穩(wěn)定可靠,保留繼電器線圈并聯(lián)的104電容,經(jīng)測試未感覺到繼電器有明顯升溫。遙控可使用家里閑置的遙控器,只要能解碼都可以使用,或花幾塊錢網(wǎng)購一個風(fēng)扇遙控器。














程序源代碼:
電風(fēng)扇-電容調(diào)速.rar (90.28 KB, 下載次數(shù): 54)

  1. ;========================================================================
  2. ;紅外遙控電容調(diào)速風(fēng)扇控制器
  3. ;STC8G1K08(DIP16或SOP16)+TM1637顯示模塊+EC11編碼器+CBB電容
  4. ;楊小強,2022年8月
  5. ;內(nèi)部R/C時鐘,頻率選擇:11.0592MHz
  6. ;顯示:(TM1637)4位數(shù)碼管顯示模塊
  7. ;調(diào)整定時、檔位:EC11帶按鍵5腳旋轉(zhuǎn)編碼器。也可以用3只按鍵代替EC11編碼器
  8. ;
  9. ;工作時先全功率驅(qū)動繼電器,延時一定時間后轉(zhuǎn)為PWM方式驅(qū)動,以降低功耗減少發(fā)熱量,
  10. ;PWM周期25微秒*2=50微秒,頻率20KHz占空比50%,繼電器線圈并聯(lián)一只104電容,驅(qū)動電流降低到50%左右
  11. ;保持吸合狀態(tài)。
  12. ;如果使用可控硅控制就取消主程序中初始化部分的“SETB PWM”指令,或改為“CLR PWM”(禁止PWM驅(qū)動)
  13. ;
  14. ;EC11編碼器按鍵、旋轉(zhuǎn)動作:
  15. ; 1.旋轉(zhuǎn)編碼器:對當(dāng)前顯示的“定時時間”或“檔位”作增(減)調(diào)整
  16. ; 2.短按1次:正常風(fēng)與自然風(fēng)(睡眠風(fēng))切換。自然風(fēng)狀態(tài)時LED指示燈亮,只顯示定時時間。
  17. ; 3.短按2次:設(shè)置自然風(fēng)(睡眠風(fēng))漸慢/漸快變化的上下限檔位范圍、各檔位變化的間隔時間(秒)
  18. ; 4.長按10秒:顯示“----”,紅外遙控信號解碼,遙控器按鍵功能定義。定義好后須長按10秒才保存
  19. ;
  20. ;短按編碼器按鍵2次設(shè)置自然風(fēng)(睡眠風(fēng))漸慢/漸快變化的上下限檔位范圍、檔位變化的間隔時間(秒):
  21. ; 1.顯示:L-最低檔位下限,旋轉(zhuǎn)編碼器加/減,上、下限檔位之間最少間隔3檔。
  22. ; 2.顯示:H-最高檔位上限,旋轉(zhuǎn)編碼器加/減,上、下限檔位之間最少間隔3檔。
  23. ; 3.顯示:E-檔位漸慢/漸快變化時的間隔時間(1~5秒),旋轉(zhuǎn)編碼器加/減
  24. ;設(shè)置好一項,短按編碼器按鍵或者閃爍5秒無操作,自動跳到下一項。
  25. ;短按2次編碼器按鍵保存并退出,或在第3項時無操作閃爍5秒自動保存并退出。
  26. ;
  27. ;長按10秒顯示“----”進入紅外遙控器的按鍵定義:
  28. ;定義1“關(guān)”、2“開/風(fēng)速”、3“定時”、4“自然風(fēng)”、5“+”、6“-”六個功能鍵。
  29. ;    交替顯示功能編號+遙控器客戶碼(不顯示反碼)和原來保存的按鍵值,按鍵值為數(shù)據(jù)碼+數(shù)據(jù)碼反碼
  30. ;共4個十六進制數(shù),按下遙控器按鍵收到信號解碼成功并顯示,即為新的按鍵值,遙控器客戶碼與原來保
  31. ;存的不相同時,自動刪除舊的數(shù)據(jù)(保存才會生效),短按跳到下一個功能編號,也可以旋轉(zhuǎn)EC11編碼器
  32. ;向前/后跳到任意編號,全部或部分定義好后,長按10秒編碼器按鍵顯示“----”保存并退出才生效,
  33. ;短按兩次退出或60秒無操作自動退出,不保存,仍然還是原來的數(shù)據(jù)。
  34. ;
  35. ;1“關(guān)”鍵:定時時間清零,關(guān)風(fēng)扇
  36. ;2“開/風(fēng)速”鍵:當(dāng)定時時間為零時,置上電默認定時時間,開風(fēng)扇;定時時間不為零時,檔位
  37. ;                加1,到最高檔后又從1檔開始循環(huán),支持長按連續(xù)加;自然風(fēng)(睡眠風(fēng))狀態(tài)時
  38. ;                不能調(diào)整檔位。
  39. ;3“定時”鍵:增加定時時間。風(fēng)扇在關(guān)的狀態(tài)時,增加定時時間立即開風(fēng)扇。
  40. ;4“自然風(fēng)”鍵:正常風(fēng)與自然風(fēng)(睡眠風(fēng))切換,自然風(fēng)(睡眠風(fēng))狀態(tài)時LED指示燈亮,只顯示定時時間。
  41. ;5“+”鍵:對當(dāng)前顯示的“定時時間”或“檔位”作增加調(diào)整,支持長按連續(xù)加。
  42. ;6“-”鍵:對當(dāng)前顯示的“定時時間”或“檔位”作減少調(diào)整,支持長按連續(xù)減。
  43. ;
  44. ;保存失敗顯示5秒E1
  45. ;
  46. ;P3口接6只繼電器(5只CBB電容,耐壓400V或630V)、LED指示燈、紅外接收頭:
  47. ;P3.0----9腳,繼電器,1uF
  48. ;P3.1----10腳,繼電器,2.2uF
  49. ;P3.2----11腳,繼電器,3.3uF
  50. ;P3.3----12腳,繼電器,4.7uF
  51. ;P3.4----13腳,繼電器,4.7uF
  52. ;P3.5----14腳,繼電器,直通
  53. ;P3.6----15腳,自然風(fēng)LED指示燈,低電平亮
  54. ;P3.7----16腳,紅外接收頭
  55. ;
  56. ;各檔檔位控制碼及對應(yīng)的電容容量:
  57. ;01檔:控制碼FEH,P3.0控制的繼電器導(dǎo)通,電容容量1uF
  58. ;02檔:控制碼FDH,P3.1控制的繼電器導(dǎo)通,電容容量2.2uF
  59. ;03檔:控制碼FBH,P3.2控制的繼電器導(dǎo)通,電容容量3.3uF
  60. ;04檔:控制碼FAH,P3.0、P3.2控制的繼電器導(dǎo)通,電容容量1uF+3.3uF=4.3uF
  61. ;05檔:控制碼F9H,P3.1、P3.2控制的繼電器導(dǎo)通,電容容量2.2uF+3.3uF=5.5uF
  62. ;06檔:控制碼F8H,P3.0、P3.1、P3.2控制的繼電器導(dǎo)通,電容容量1uF+2.2uF+3.3uF=6.5uF
  63. ;07檔:控制碼F4H,P3.0、P3.1、P3.3控制的繼電器導(dǎo)通,電容容量1uF+2.2uF+4.7uF=7.9uF
  64. ;08檔:控制碼F2H,P3.0、P3.2、P3.3控制的繼電器導(dǎo)通,電容容量1uF+3.3uF+4.7uF=9uF
  65. ;09檔:控制碼F1H,P3.1、P3.2、P3.3控制的繼電器導(dǎo)通,電容容量2.2uF+3.3uF+4.7uF=10.2uF
  66. ;10檔:控制碼F0H,P3.0、P3.1、P3.2、P3.3控制的繼電器導(dǎo)通,電容容量1uF+2.2uF+3.3uF+4.7uF=11.2uF
  67. ;11檔:控制碼E4H,P3.0、P3.1、P3.3、P3.4控制的繼電器導(dǎo)通,電容容量1uF+2.2uF+4.7uF+4.7uF=12.6uF
  68. ;12檔:控制碼E2H,P3.0、P3.2、P3.3、P3.4控制的繼電器導(dǎo)通,電容容量1uF+3.3uF+4.7uF+4.7uF=13.7uF
  69. ;13檔:控制碼E1H,P3.1、P3.2、P3.3、P3.4控制的繼電器導(dǎo)通,電容容量2.2uF+3.3uF+4.7uF+4.7uF=14.9uF
  70. ;14檔:控制碼E0H,P3.0、P3.1、P3.2、P3.3、P3.4控制的繼電器導(dǎo)通,電容容量1uF+2.2uF+3.3uF+4.7uF+4.7uF=15.9uF
  71. ;15檔:控制碼DFH,P3.5控制的繼電器導(dǎo)通,直通。
  72. ;
  73. ;----------------------------- 端口定義 ------------------------------------
  74.         P5        DATA        0C8H        ;P5口定義
  75.         P1M1        DATA        091H        ;P1口配置寄存器1
  76.         P1M0        DATA        092H        ;P1口配置寄存器0
  77.         P3M1        DATA        0B1H        ;P3口配置寄存器1
  78.         P3M0        DATA        0B2H        ;P3口配置寄存器0
  79.         P5M1        DATA        0C9H        ;P5口配置寄存器1
  80.         P5M0        DATA        0CAH        ;P5口配置寄存器0

  81.         CLK        EQU        P1.0        ;1腳,接顯示模塊TM1637的CLK
  82.         DIO        EQU        P1.1        ;2腳,接顯示模塊TM1637的DIO
  83.         EC11A        EQU        P1.6        ;3腳,接編碼器的A引腳(+)
  84.         EC11B        EQU        P1.7        ;4腳,接編碼器的B引腳(-)
  85.         EC11K        EQU        P5.4        ;5腳,接編碼器的按鍵KEY
  86.         LED        EQU        P3.6        ;15腳,自然風(fēng)狀態(tài)LED指示燈,低電平亮
  87.         IR        EQU        P3.7        ;16腳,紅外接收頭
  88.         BUZZER        EQU        P5.5        ;7腳,無源蜂鳴器

  89. ;---------------------------- 位地址及RAM的使用 ----------------------------
  90. BMQDZ        BIT        20H.0        ;編碼器動作,1=編碼器有旋轉(zhuǎn)動作;0=沒有旋轉(zhuǎn)動作
  91. XZFX        BIT        20H.1        ;旋轉(zhuǎn)方向,1=編碼器順時針正轉(zhuǎn);0=編碼器逆時針反轉(zhuǎn)
  92. FLQH        BIT        20H.2        ;風(fēng)類切換,1=自然風(fēng)(睡眠風(fēng));0=正常風(fēng)
  93. TSFX        BIT        20H.3        ;調(diào)速方向,1=漸快;0=漸慢。自然風(fēng)漸變控制時的調(diào)速方向。
  94. YSBC        BIT        20H.4        ;延時保存,1=在MJS倒計時結(jié)束時保存檔位。
  95. SSBZ        BIT        20H.5        ;閃爍標志,1=不顯示,0=顯示,數(shù)字及冒號閃爍時用,每0.5秒變化一次。
  96. XSNRXZ        BIT        20H.6        ;顯示內(nèi)容選擇,1=顯示檔位;0=顯示定時時間。
  97. XSKG        BIT        20H.7        ;顯示開關(guān),1=關(guān)閉T1中斷的顯示功能,0=允許顯示定時和檔位等內(nèi)容
  98. XSQHY        BIT        21H.0        ;顯示切換1,1=顯示自然風(fēng)檔位變化范圍或紅外解碼顯示;0=顯示檔位或定時。
  99. XSQHE        BIT        21H.1        ;顯示切換2,1=顯示自然風(fēng)檔位變化范圍;0=紅外遙控信號解碼顯示。設(shè)置時用
  100. BMXSQH        BIT        21H.2        ;編碼顯示切換,1=顯示數(shù)據(jù)碼+反碼;0=顯示功能編號+系統(tǒng)碼。設(shè)置時用
  101. PWM        BIT        21H.3        ;1=使用PWM方式驅(qū)動;0=禁止PWM驅(qū)動
  102. PWMBZ        BIT        21H.4        ;PWM的電平狀態(tài)標志,1=高電平,0=低電平。PWM周期25微秒*2=50微秒,20KHz占空比50%
  103. EEPBC        BIT        21H.5        ;EEPROM操作子程序調(diào)用標志,1=EEPROM操作子程序正在調(diào)用繼電器控制程序

  104. FWBZ0         EQU        022H          ;閃爍顯示時長(秒)。受干擾等原因?qū)е聫?fù)位時閃爍10秒
  105. DSSJS         EQU        023H          ;定時時間,時
  106. DSSJF         EQU        024H          ;定時時間,分
  107. DSSJM         EQU        025H          ;定時時間,秒
  108. SMGLD         EQU        026H          ;數(shù)碼管亮度,1~8級
  109. DSDWJG         EQU        027H          ;上電設(shè)置的定時與檔位交替顯示的間隔時間(秒)
  110. DSDW         EQU        028H          ;運行時使用,定時與檔位交替顯示的間隔時間(秒)
  111. SMFJG2         EQU        029H          ;運行時使用,自然風(fēng)(睡眠風(fēng))檔位變化的間隔時間(秒)
  112. DANGW         EQU        02AH          ;運行時使用,自然風(fēng)(睡眠風(fēng))變化時的實時檔位
  113. XMBH         EQU        02BH          ;項目編號,設(shè)置時使用
  114. HM           EQU        02CH          ;毫秒,每毫秒減1,為0后重新放入計數(shù)值。定時器1使用,時間、顯示處理
  115. SHMJS         EQU        02DH          ;(10)毫秒倒計時,每10毫秒減1,直到為0
  116. HMJS         EQU        02EH          ;(10)毫秒計數(shù),為0后重新放入99(1秒)
  117. MJS           EQU        02FH          ;秒計數(shù),每秒減1,直到為0,主程序使用
  118. XSHC1         EQU        030H          ;顯示緩存1,與上次不同就立即顯示,否則0.5秒顯示一次
  119. XSHC2         EQU        031H          ;顯示緩存2,與上次不同就立即顯示,否則0.5秒顯示一次
  120. ZXM1          EQU        032H          ;顯示用,待發(fā)送到TM1637的字形碼1
  121. ZXM2          EQU        033H          ;顯示用,待發(fā)送到TM1637的字形碼2
  122. ZXM3          EQU        034H          ;顯示用,待發(fā)送到TM1637的字形碼3
  123. ZXM4          EQU        035H          ;顯示用,待發(fā)送到TM1637的字形碼4
  124. MA1          EQU        036H          ;接收到的紅外遙控系統(tǒng)碼(客戶碼)
  125. MA2          EQU        037H          ;接收到的紅外遙控系統(tǒng)碼(客戶碼)反碼
  126. MA3          EQU        038H          ;接收到的紅外遙控數(shù)據(jù)碼
  127. MA4          EQU        039H          ;接收到的紅外遙控數(shù)據(jù)碼反碼
  128. HWJS         EQU        03AH          ;每10毫秒減1,直到為0,為0時清除“接收到的紅外遙控數(shù)據(jù)碼”,防止接收到別的連續(xù)碼產(chǎn)生誤動作。
  129. ZRFJG         EQU        03BH          ;1:自然風(fēng)變化時的檔位下限;2=檔位上限;3=檔位變化的間隔時間。設(shè)置時用
  130. FENGMQ        EQU        03CH          ;蜂鳴器鳴響時長(*10毫秒),每10毫秒減1直到為0,0=蜂鳴器不響
  131. ZDJS         EQU        03DH          ;中斷計數(shù),蜂鳴器處理用
  132. YSPWM        EQU        03EH          ;延時PWM驅(qū)動(*10毫秒),先全功率驅(qū)動繼電器,每10毫秒減1,為0時轉(zhuǎn)為PWM方式驅(qū)動

  133. FWBZ1         EQU        03FH          ;復(fù)位判斷標志1,也作EEPROM數(shù)據(jù)判斷標志
  134. FWBZ2         EQU        040H          ;復(fù)位判斷標志2,也作EEPROM數(shù)據(jù)判斷標志
  135. DANG_G         EQU        041H          ;自然風(fēng)(睡眠風(fēng))變化時的檔位上限
  136. DANG_D         EQU        042H          ;自然風(fēng)(睡眠風(fēng))變化時的檔位下限
  137. SMFJG         EQU        043H          ;自然風(fēng)(睡眠風(fēng))檔位變化的間隔時間(秒)
  138. DANG         EQU        044H          ;正常風(fēng)檔位
  139. ANJZ         EQU        045H          ;紅外遙控編碼首地址,系統(tǒng)碼(客戶碼),6個鍵的數(shù)據(jù)碼+數(shù)據(jù)碼反碼使用此地址后面12個字節(jié)


  140. ;--------------- 輔助寄存器、EEPROM寄存器地址 ---------------
  141. AUXR              EQU 08EH          ;輔助寄存器
  142. IAP_DATA          EQU 0C2H          ;數(shù)據(jù)寄存器,讀出、寫入的數(shù)據(jù)放在此處
  143. IAP_ADDRH         EQU 0C3H          ;地址寄存器高八位
  144. IAP_ADDRL         EQU 0C4H          ;地址寄存器低八位
  145. IAP_CMD           EQU 0C5H          ;命令寄存器,0=關(guān)閉,1=讀,2=寫,3=擦除
  146. IAP_TRIG          EQU 0C6H          ;命令觸發(fā)寄存器
  147. IAP_CONTR         EQU 0C7H          ;控制寄存器
  148. IAP_TPS         EQU 0F5H          ;等待時間控制寄存器

  149. ;======================= 程序代碼開始 =======================
  150.         ORG         0000H
  151.         LJMP        START

  152.         ORG         000BH                ;定時器0中斷
  153.         LJMP        INTT0                ;定時器0中斷

  154.         ORG     001BH                ;定時器1中斷
  155.         LJMP    INTT1                ;定時器1中斷

  156.         ORG         0100H                ;程序代碼從0100H開始

  157. ;--------------- 定時器0,25微秒產(chǎn)生一次中斷,控制繼電器、LED指示燈、蜂鳴器 ---------------
  158. INTT0:
  159.         PUSH         ACC
  160.         PUSH         PSW
  161.         LCALL        Control                ;控制繼電器
  162.         JNB        FLQH,INTT01         ;如果“風(fēng)類切換”是0(正常風(fēng))就轉(zhuǎn)移
  163.         CLR        LED                ;是自然風(fēng)狀態(tài),點亮LED指示燈
  164. INTT01:
  165.         CPL        PWMBZ                ;“PWM電平狀態(tài)標志”取反。PWM周期25微秒*2=50微秒,20KHz占空比50%
  166.         MOV        A,ZDJS                ;中斷計數(shù)
  167.         JZ        INTT02                ;為0就轉(zhuǎn)移,每5次(25微秒*5=125微秒)執(zhí)行一次蜂鳴器處理。
  168.         DEC        ZDJS                ;減1
  169.         LJMP        INTT04                ;
  170. INTT02:
  171.         MOV        ZDJS,#4                ;重新放入計數(shù)(5次)
  172.         MOV        A,FENGMQ        ;蜂鳴器鳴響時長
  173.         JZ        INTT03                ;如果是0(不響)就轉(zhuǎn)移
  174.         CPL        BUZZER                ;取反,驅(qū)動無源蜂鳴器發(fā)聲。周期125微秒*2=250微秒,4KHz占空比50%
  175.         LJMP        INTT04
  176. INTT03:
  177.         SETB        BUZZER                ;置蜂鳴器控制端口為高電平(不響)
  178. INTT04:
  179.         POP          PSW
  180.         POP          ACC
  181.         RETI

  182. ;--------------- 定時器1,1毫秒產(chǎn)生一次中斷,時間、顯示處理 ---------------
  183. INTT1:
  184.         PUSH         ACC
  185.         PUSH        B
  186.         PUSH         PSW
  187.         SETB         RS1                    ;RS1、RS0組合為11,選擇03組工作寄存器(R0~R7地址為18H~1FH),退
  188.         SETB         RS0                ;出中斷時會自動恢復(fù)原默認的第0組工作寄存器(R0~R7地址為00H~07H)
  189.         MOV        A,HM                ;毫秒計數(shù)
  190.         JZ        INTT10                ;如果是0就轉(zhuǎn)移,每10毫秒執(zhí)行一次顯示、時間處理子程序
  191.         DEC        HM                ;減1
  192.         LJMP        INTT11
  193. INTT10:
  194.         MOV        HM,#9                ;重新放入計數(shù)值(10毫秒)
  195.         LCALL        TIME                ;時間處理
  196.         LCALL        DISPLAY                ;顯示處理
  197. INTT11:
  198.         POP          PSW
  199.         POP        B
  200.         POP          ACC
  201.         RETI

  202. ;--------------- 定時器T0、T1設(shè)置 ----------------
  203. SETINT:        
  204.         ORL        AUXR,#0C0H        ;定時器T0、T1時鐘1T模式
  205.         ANL        TMOD,#00H        ;設(shè)置定時器T0、T1模式為16位自動重載
  206.         MOV        TL0,#0ECH        ;設(shè)置定時0初始值(25微秒)
  207.         MOV        TH0,#0FEH        ;設(shè)置定時0初始值(25微秒)
  208.         MOV        TL1,#0CDH        ;設(shè)置定時1初始值(1毫秒)
  209.         MOV        TH1,#0D4H        ;設(shè)置定時1初始值(1毫秒)
  210.         CLR        TF1                ;清除TF1標志
  211.         SETB        TR1                ;定時器1開始計時
  212.         SETB        ET1               ;允許定時器1中斷
  213.         CLR        TF0                ;清除TF0標志
  214.         SETB        TR0                ;定時器0開始計時
  215.         SETB        ET0               ;允許定時器0中斷
  216.         SETB        PT0                ;設(shè)置定時器0中斷為最高優(yōu)先級
  217.         SETB        EA                ;允許全局中斷
  218.         RET

  219. ;*********************************** 主程序開始 ***********************************
  220. START:
  221.         MOV     P1M0,#00H              ;設(shè)置P1為雙向口模式
  222.         MOV     P1M1,#00H              ;
  223.         MOV     P3M0,#00H              ;設(shè)置P3為雙向口模式
  224.         MOV     P3M1,#00H              ;
  225.         MOV     P5M0,#00H              ;設(shè)置P5為雙向口模式
  226.         MOV     P5M1,#00H              ;
  227.         MOV          SP,#0C0H              ;設(shè)置堆棧指針
  228.         MOV          A,FWBZ1               ;檢查復(fù)位判斷標志,RAM數(shù)據(jù)不變就跳過初始化繼續(xù)運行
  229.         CJNE         A,#0C8H,START1        ;檢查復(fù)位判斷標志,RAM數(shù)據(jù)不變就跳過初始化繼續(xù)運行
  230.         MOV          A,FWBZ2               ;檢查復(fù)位判斷標志,RAM數(shù)據(jù)不變就跳過初始化繼續(xù)運行
  231.         CJNE         A,#0D9H,START1        ;檢查復(fù)位判斷標志,RAM數(shù)據(jù)不變就跳過初始化繼續(xù)運行
  232.         MOV        FWBZ0,#10        ;放入復(fù)位提示,閃爍顯示時長(秒)
  233.         LCALL        SETINT                ;定時器設(shè)置
  234.         LJMP         START3                ;跳過初始化繼續(xù)運行
  235. START1:
  236.         CLR          A                     ;初始化,RAM從20H開始清零50H個字節(jié)
  237.         MOV          R0,#50H               ;初始化,RAM從20H開始清零50H個字節(jié)
  238.         MOV          R1,#20H               ;初始化,RAM從20H開始清零50H個字節(jié)
  239. START2:
  240.         MOV          @R1,A                 ;初始化,RAM從20H開始清零50H個字節(jié)
  241.         INC          R1                    ;初始化,RAM從20H開始清零50H個字節(jié)
  242.         DJNZ         R0,START2             ;
  243.         SETB        PWM                   ;PWM標志置為1,使用PWM方式驅(qū)動,如果用可控硅控制就取消這條指令或改為“CLR PWM”(禁止PWM驅(qū)動)
  244.         MOV          FWBZ1,#0C8H           ;初始化,放入復(fù)位及EEPROM判斷標志1到RAM
  245.         MOV          FWBZ2,#0D9H           ;初始化,放入復(fù)位及EEPROM判斷標志2到RAM
  246.         MOV        FENGMQ,#12         ;上電蜂鳴器響一聲,鳴響時長12*10毫秒=120毫秒
  247.         LCALL        SDMRDS                ;置上電默認定時時間
  248.         MOV        SMGLD,#3          ;置數(shù)碼管亮度為3級(8級亮度最高)
  249.         MOV        DSDWJG,#3        ;定時與檔位交替顯示的間隔時間(秒)
  250.         MOV        SMFJG,#2        ;睡眠風(fēng)(自然風(fēng))漸慢/漸快檔位變化的間隔時間(秒),如果EEPROM保存有設(shè)置值,將替換此默認設(shè)置
  251.         MOV        DANG,#15        ;正常風(fēng)檔位(1~15),如果EEPROM保存有設(shè)置值,將替換此默認設(shè)置
  252.         MOV        DANG_G,#5        ;自然風(fēng)變化時最高檔位上限(4~15),如果EEPROM保存有設(shè)置值,將替換此默認設(shè)置
  253.         MOV        DANG_D,#1        ;自然風(fēng)變化時最低檔位下限(1~12),如果EEPROM保存有設(shè)置值,將替換此默認設(shè)置
  254.         LCALL        SETINT                ;初始化,定時器設(shè)置
  255.         LCALL        REEP                ;讀EEPROM保存的各項設(shè)置,沒有就保存當(dāng)前的設(shè)置值
  256. START3:
  257.         CLR        XSKG                ;“顯示開關(guān)”置為0,允許T1中斷的顯示功能
  258.         CLR        XSQHY                ;“顯示切換1”置為0,顯示檔位、定時時間
  259.         LCALL        HWYKCL                ;調(diào)用紅外遙控處理子程序
  260.         LCALL        SKEY                  ;掃描編碼器按鍵
  261.         JC           START4                ;有按鍵動作(C=1)就轉(zhuǎn)移
  262.         LCALL        Scan1               ;掃描編碼器
  263.         JNB        BMQDZ,START5        ;編碼器沒有動作(BMQDZ=0)就轉(zhuǎn)移
  264.         LCALL        BMQCL                 ;調(diào)用編碼器旋轉(zhuǎn)動作處理子程序
  265.         LJMP         START3
  266. START4:
  267.         LCALL        AJDZCL                ;調(diào)用按鍵動作處理子程序
  268.         LJMP         START3
  269. START5:
  270.         JNB        YSBC,START3        ;如果“延時保存”為0(不需保存當(dāng)前檔位值)就轉(zhuǎn)移
  271.         MOV        A,MJS                ;裝入倒計時
  272.         JNZ        START3                ;不是0就轉(zhuǎn)移
  273.         CLR        YSBC                ;時間到,“延時保存”置為0
  274.         LCALL        WEEP                ;保存當(dāng)前檔位值
  275.         LJMP         START3

  276. ;*********************************** 主程序結(jié)束 ***********************************
  277. ;
  278. ;--------------- 設(shè)置上電默認定時 ---------------
  279. SDMRDS:
  280.         MOV        DSSJS,#8        ;小時
  281.         RET

  282. ;--------------- 設(shè)置“延時PWM驅(qū)動”時間 ---------------
  283. ;先全功率驅(qū)動繼電器,延時結(jié)束后轉(zhuǎn)為PWM方式驅(qū)動,降低功耗減少繼電器發(fā)熱量。
  284. ;繼電器吸合速度正常為幾毫秒至幾十毫秒。PWM方式驅(qū)動改為禁止后,“延時PWM驅(qū)動”無意義
  285. SETPWM:
  286.         MOV        YSPWM,#10          ;延時時間(*10毫秒),10*10=100毫秒
  287.         RET

  288. ;-------------------------------------------------------------------------------
  289. ;紅外遙控處理子程序
  290. ;1“關(guān)”鍵:定時時間清零,關(guān)風(fēng)扇
  291. ;2“開/風(fēng)速”鍵:定時時間為零時,置上電默認定時時間,開風(fēng)扇;定時時間不為零時,檔位
  292. ;                加1,到最高檔后又從1檔開始循環(huán),支持長按連續(xù)加;
  293. ;                自然風(fēng)(睡眠風(fēng))狀態(tài)時不能調(diào)整檔位。
  294. ;3“定時”鍵:增加定時時間。在關(guān)的狀態(tài)時,增加定時時間立即開風(fēng)扇。支持長按連續(xù)加。
  295. ;4“睡眠”鍵:正常風(fēng)與自然風(fēng)(睡眠風(fēng))切換,自然風(fēng)狀態(tài)時LED指示燈亮,只顯示定時時間。
  296. ;5“+”鍵:對當(dāng)前顯示的“定時時間”或“檔位”作增加調(diào)整,支持長按連續(xù)加。
  297. ;6“-”鍵:對當(dāng)前顯示的“定時時間”或“檔位”作減少調(diào)整,支持長按連續(xù)減。
  298. ;-------------------------------------------------------------------------------
  299. HWYKCL:
  300.         LCALL        JIEMA                ;調(diào)用紅外遙控解碼子程序
  301.         JC        YKCL1                ;解碼成功(C=1)就轉(zhuǎn)移
  302. YKCL0:
  303.         RET
  304. YKCL1:
  305.         MOV        R5,A                ;解碼子程序返回的參數(shù)暫時放到R5
  306.         MOV        A,MA1                ;裝入當(dāng)前接收到的系統(tǒng)碼到A
  307.         MOV        B,ANJZ                ;裝入原來保存的系統(tǒng)碼到B
  308.         CJNE        A,B,YKCL0        ;不同就轉(zhuǎn)移退出
  309.         MOV        R0,#ANJZ        ;按鍵值首地址
  310.         INC        R0                ;地址加1
  311.         MOV        R3,#6                ;共搜索6個按鍵值
  312.         MOV        R7,#1                ;功能編號
  313. YKCL2:
  314.         MOV        A,MA3                ;裝入數(shù)據(jù)碼
  315.         MOV        B,@R0                ;裝入原來的數(shù)據(jù)碼
  316.         CJNE        A,B,YKCL3        ;不同就轉(zhuǎn)移,檢查下一個
  317.         INC        R0                ;相同,地址加1,檢查反碼是否相同
  318.         MOV        A,MA4                ;裝入數(shù)據(jù)碼反碼
  319.         MOV        B,@R0                ;裝入數(shù)據(jù)碼反碼
  320.         DEC        R0                ;地址減1
  321.         CJNE        A,B,YKCL3        ;不同就轉(zhuǎn)移,檢查下一個
  322.         LJMP        YKCL4                ;搜索到了
  323. YKCL3:
  324.         INC        R0                ;地址加1
  325.         INC        R0                ;地址加1
  326.         INC        R7                ;功能編號加1
  327.         DJNZ        R3,YKCL2        ;如果未檢查完就轉(zhuǎn)移繼續(xù)
  328.         RET                        ;未搜索到,退出
  329. YKCL4:
  330.         LCALL        SETPWM          ;設(shè)置“延時PWM驅(qū)動”時間
  331.         MOV        A,R5                ;解碼子程序返回的參數(shù)
  332.         JNZ        YKCL41                ;如果是連續(xù)碼(1)就轉(zhuǎn)移
  333.         MOV        FENGMQ,#12         ;蜂鳴器響一聲,12*10毫秒=120毫秒
  334. YKCL41:
  335.         MOV        A,R7                ;功能編號放入A
  336.         CJNE        A,#1,YKCL5        ;不是1(關(guān))就轉(zhuǎn)移
  337.         LCALL        DSSJQL                ;定時時間清零,關(guān)風(fēng)扇
  338.         CLR        XSNRXZ                ;“顯示內(nèi)容選擇”置為0,顯示定時時間
  339.         RET
  340. YKCL5:
  341.         CJNE        A,#2,YKCL8        ;不是2(開/風(fēng)速)就轉(zhuǎn)移
  342.         MOV        A,DSSJS                ;檢查定時時間是否為0
  343.         JNZ        YKCL6                ;不為0就轉(zhuǎn)移
  344.         MOV        A,DSSJF                ;檢查定時時間是否為0
  345.         JNZ        YKCL6                ;不為0就轉(zhuǎn)移
  346.         MOV        A,DSSJM                ;檢查定時時間是否為0
  347.         JNZ        YKCL6                ;不為0就轉(zhuǎn)移
  348.         LCALL        SDMRDS                ;是0,放入上電默認定時時間,開風(fēng)扇
  349.         MOV        SHMJS,#150        ;設(shè)置持續(xù)按下“開/風(fēng)速”等待1.5秒才響應(yīng)連續(xù)碼
  350.         RET
  351. YKCL6:
  352.         JB          FLQH,YKCL12        ;如果“風(fēng)類切換”為1睡眠風(fēng)(自然風(fēng))就轉(zhuǎn)移退出
  353.         MOV        A,SHMJS
  354.         JNZ        YKCL12                ;如果時間未到就轉(zhuǎn)移退出,不響應(yīng)
  355.         MOV        SHMJS,#30        ;設(shè)置響應(yīng)連續(xù)碼間隔時間(×10毫秒)
  356.         SETB        XSNRXZ                ;“顯示內(nèi)容選擇”置為1,顯示檔位
  357.         MOV        A,DANG                ;裝入當(dāng)前檔位值
  358.         CJNE        A,#15,YKCL7        ;不是最高檔(15)就轉(zhuǎn)移
  359.         MOV        DANG,#0                ;是,改為0
  360. YKCL7:
  361.         SETB        XZFX                ;“旋轉(zhuǎn)方向”置為1(+)
  362.         LCALL        BMQCL                ;加
  363.         RET
  364. YKCL8:
  365.         CJNE        A,#3,YKCL9        ;不是3(定時)就轉(zhuǎn)移
  366.         MOV        A,SHMJS
  367.         JNZ        YKCL12                ;如果時間未到就轉(zhuǎn)移退出,不響應(yīng)
  368.         MOV        SHMJS,#30        ;設(shè)置響應(yīng)連續(xù)碼的間隔時間(×10毫秒)
  369.         CLR        XSNRXZ                ;“顯示內(nèi)容選擇”置為0,顯示定時時間
  370.         LJMP        YKCL7
  371. YKCL9:
  372.         CJNE        A,#4,YKCL10        ;不是4睡眠風(fēng)(自然風(fēng))就轉(zhuǎn)移
  373.         MOV        A,SHMJS
  374.         JNZ        YKCL12                ;如果時間未到就轉(zhuǎn)移退出,不響應(yīng)
  375.         MOV        SHMJS,#100        ;設(shè)置響應(yīng)連續(xù)碼的間隔時間,1秒
  376.         CPL        FLQH                ;“風(fēng)類切換”取反,正常風(fēng)/自然風(fēng)切換
  377.         RET
  378. YKCL10:
  379.         CJNE        A,#5,YKCL11        ;不是5(加+)就轉(zhuǎn)移
  380.         MOV        A,SHMJS
  381.         JNZ        YKCL12                ;如果時間未到就轉(zhuǎn)移退出,不響應(yīng)
  382.         MOV        SHMJS,#20        ;設(shè)置響應(yīng)連續(xù)碼的間隔時間(×10毫秒)
  383.         SETB        XZFX                ;“旋轉(zhuǎn)方向”置為1(+)
  384.         LCALL        BMQCL                ;加
  385.         RET
  386. YKCL11:
  387.         MOV        A,SHMJS                ;
  388.         JNZ        YKCL12                ;如果時間未到就轉(zhuǎn)移退出,不響應(yīng)
  389.         MOV        SHMJS,#20        ;設(shè)置響應(yīng)連續(xù)碼的間隔時間(×10毫秒)
  390.         CLR        XZFX                ;“旋轉(zhuǎn)方向”置為0(-)
  391.         LCALL        BMQCL                ;減
  392. YKCL12:
  393.         RET

  394. ;--------------------------------------------------------------------------------------------
  395. ;子程序:紅外遙控解碼
  396. ;出口參數(shù):
  397. ;C=1、A=0:解碼成功。
  398. ;C=1、A=1:連續(xù)碼。
  399. ;系統(tǒng)碼(客戶碼)放在MA1,系統(tǒng)碼(客戶碼)反碼放在MA2
  400. ;數(shù)據(jù)碼(按鍵值)放在MA3,數(shù)據(jù)碼(按鍵值)反碼放在MA4
  401. ;
  402. ;紅外接收頭實際輸出的NEC編碼格式:
  403. ;引導(dǎo)碼:9ms低電平+4.5ms高電平
  404. ;碼0:0.56ms低電平+0.56ms高電平
  405. ;碼1:0.56ms低電平+1.68ms高電平
  406. ;結(jié)束位:0.56ms低電平
  407. ;單鍵碼:引導(dǎo)碼+8位系統(tǒng)碼+8位系統(tǒng)碼反碼+8位數(shù)據(jù)碼+8位數(shù)據(jù)碼反碼+結(jié)束位
  408. ;連續(xù)碼:引導(dǎo)碼9ms低電平+2.25ms高電平+結(jié)束位0.56ms低電平
  409. ;
  410. ;有個別紅外遙控器并不是8位系統(tǒng)碼+8位系統(tǒng)碼反碼+8位數(shù)據(jù)碼+8位數(shù)據(jù)碼反碼的數(shù)據(jù)格式,
  411. ;而是這兩種情況:
  412. ;一、16位固定的系統(tǒng)碼(客戶碼)+8位數(shù)據(jù)碼+8位數(shù)據(jù)碼反碼
  413. ;二、24位固定的系統(tǒng)碼(客戶碼)+8位數(shù)據(jù)碼
  414. ;所以對解碼結(jié)果不作反碼檢驗
  415. ;
  416. ;43微秒延時子程序的數(shù)值是156,因T0中斷頻率高占用資源,使延時變長,修改為127才能正確解碼,
  417. ;如果移植到別的程序,沒有過高頻率的中斷,數(shù)值要改回156
  418. ;--------------------------------------------------------------------------------------------
  419. JIEMA:
  420.         JB        IR,JMerr        ;IR為1(高電平)就轉(zhuǎn)移退出,無信號
  421.         MOV        R7,#200                ;檢測200次×43微秒=8600微秒(8.6毫秒)
  422. JIEMA1:
  423.         LCALL        DELAY43US        ;延時43微秒
  424.         JB        IR,JMerr        ;如果出現(xiàn)高電平(IR為1)就轉(zhuǎn)移退出,不是有效信號
  425.         DJNZ        R7,JIEMA1        ;重復(fù)200次
  426.         MOV        R7,#20                ;未出現(xiàn)高電平,視為有效9毫秒引導(dǎo)碼,再檢測20次
  427. JIEMA2:
  428.         LCALL        DELAY43US        ;延時43微秒
  429.         JB        IR,JIEMA3        ;如果出現(xiàn)高電平(IR=1)就轉(zhuǎn)移
  430.         DJNZ        R7,JIEMA2        ;重復(fù)20次×43微秒=860微秒(0.86毫秒)
  431.         LJMP        JMerr                ;超時,退出,不是有效信號
  432. JIEMA3:
  433.         MOV        HWJS,#50        ;500毫秒計數(shù),為0時清除“接收到的紅外遙控數(shù)據(jù)碼”,防止接收到別的連續(xù)碼產(chǎn)生誤動作。
  434.         MOV        R7,#70                ;已變?yōu)楦唠娖剑?毫秒引導(dǎo)碼結(jié)束,檢測70次共3010微秒
  435. JIEMA4:
  436.         LCALL        DELAY43US        ;延時43微秒
  437.         JNB        IR,LXM                ;出現(xiàn)低電平(IR=0)就視為是2.25毫秒連續(xù)碼
  438.         DJNZ        R7,JIEMA4
  439.         MOV        R7,#50                ;3.01毫秒內(nèi)未出現(xiàn)低電平,不是連續(xù)碼,再檢測50次
  440. JIEMA5:
  441.         LCALL        DELAY43US        ;延時43微秒
  442.         JNB        IR,JIEMA6        ;出現(xiàn)低電平(IR=0)就轉(zhuǎn)移,4.5毫秒引導(dǎo)碼高電平結(jié)束
  443.         DJNZ        R7,JIEMA5        ;重復(fù)50次共2150微秒
  444.         LJMP        JMerr                ;超時,退出,不是有效信號
  445. LXM:
  446.         SETB        C                ;是連續(xù)碼,把C置為1
  447.         MOV        A,#1                ;是連續(xù)碼,把1放入A
  448.         RET
  449. JIEMA6:
  450. ;--- 引導(dǎo)碼9ms低電平+4.5ms高電平結(jié)束 ---
  451.         MOV        R1,#MA1         ;存放編碼的首地址放入R1
  452.         MOV        R5,#4                 ;共4個字節(jié)數(shù)據(jù)
  453. JIEMA7:
  454.          MOV        R6,#8                ;每個字節(jié)為8位
  455. JIEMA8:
  456.         MOV        R7,#20                ;檢測20次×43微秒=860微秒(0.86毫秒),要大于0.56毫秒
  457. JIEMA9:
  458.         LCALL        DELAY43US        ;延時43微秒
  459.         JB        IR,JIEMA10        ;如果IR是1(高電平)就轉(zhuǎn)移
  460.         DJNZ        R7,JIEMA9        ;時間未到就繼續(xù)檢測,等待低電平信號結(jié)束
  461.         LJMP        JMerr                ;超時,退出
  462. JIEMA10:
  463.         MOV        R7,#20                ;變?yōu)楦唠娖搅,延時20次共860微秒(0.86毫秒)
  464. JIEMA11:
  465.         LCALL        DELAY43US
  466.         DJNZ        R7,JIEMA11        ;延時0.86毫秒
  467.         MOV        C,IR                ;延時結(jié)束IR的電平就是數(shù)據(jù)信號(0或1),移入C中
  468.         JNB        IR,JIEMA13        ;如果IR是0(低電平)就轉(zhuǎn)移
  469.         MOV        R7,#50                ;是高電平,檢測50次×43微秒=2150微秒(2.15毫秒)
  470. JIEMA12:
  471.         LCALL        DELAY43US        ;
  472.         JNB        IR,JIEMA13        ;如果IR是0(低電平)就轉(zhuǎn)移,
  473.         DJNZ        R7,JIEMA12        ;時間未到就繼續(xù)檢測,等待高電平信號結(jié)束
  474.         LJMP        JMerr                ;超時,退出
  475. JIEMA13:
  476.         MOV        A,@R1                ;裝入R1指向的RAM地址的數(shù)據(jù)到A寄存器
  477.         RRC        A                ;將C中的值(0或1)移入A中的最低位
  478.         MOV        @R1,A                ;把A中的數(shù)據(jù)放回R1指向的RAM
  479.         DJNZ        R6,JIEMA8        ;如果未接收完8位就轉(zhuǎn)移繼續(xù)
  480.         INC        R1                ;接收完8位了,地址加1
  481.         DJNZ        R5,JIEMA7        ;如果4個字節(jié)數(shù)據(jù)未接收完就轉(zhuǎn)移繼續(xù)
  482. JMok:
  483.         SETB        C                ;把C置為1,解碼成功
  484.         CLR        A                ;把A置為0,解碼成功
  485.         RET
  486. JMerr:
  487.         CLR        C                ;把C置為0,解碼不成功
  488.         RET

  489. ;------------ 延時43微秒 ------------
  490. DELAY43US:                           ;@11.0592MHz
  491.         PUSH        12H
  492.         MOV        12H,#127        ;延時43微秒的數(shù)值是156,因T0中斷頻率高占用資源,使延時變長,修改為此數(shù)
  493. NEXT43:                                ;值才能正確解碼,如果移植到別的程序,沒有過高頻率的中斷,此數(shù)值要改回156
  494.         DJNZ        12H,NEXT43
  495.         POP        12H
  496.         RET

  497. ;------------------------------------------------------------------------------------------------
  498. ;子程序:EC11編碼器按鍵動作處理
  499. ; 1.短按1次:正常風(fēng)與睡眠風(fēng)(自然風(fēng))切換。睡眠風(fēng)狀態(tài)時LED指示燈亮,只顯示定時時間。
  500. ; 2.短按2次:設(shè)置睡眠風(fēng)(自然風(fēng))漸慢/漸快變化的上下限檔位范圍、檔位變化時的間隔時間(秒)
  501. ; 3.長按10秒:顯示“----”,紅外線遙控信號解碼,遙控器按鍵的功能定義,定義好后須長按10秒才保存
  502. ;
  503. ;紅外遙控器的按鍵定義:
  504. ;定義1“關(guān)”、2“開/風(fēng)速”、3“定時”、4“睡眠”、5“+”、6“-”六個功能鍵。
  505. ;    交替顯示功能編號+遙控器客戶碼和原來保存的按鍵值,按鍵值為數(shù)據(jù)碼+數(shù)據(jù)碼反碼4個十
  506. ;六進制數(shù),按下遙控器按鍵收到信號解碼成功并顯示,即為新的按鍵值,遙控器客戶碼與原來保
  507. ;存的不相同時,自動刪除舊的數(shù)據(jù)(保存才會生效),短按跳到下一個功能編號,也可以旋轉(zhuǎn)EC11
  508. ;編碼器向前/后跳到任意功能編號,全部或部分定義好后,長按10秒顯示“----”保存并退出才生
  509. ;效,短按兩次退出或60秒無操作自動退出,不保存,仍然還是原來的數(shù)據(jù)。
  510. ;-------------------------------------------------------------------------------------------------
  511. AJDZCL:
  512.         LCALL        KEY                ;調(diào)用編碼器按鍵開關(guān)處理子程序
  513.         CJNE        A,#1,AJDZ2        ;如果不是按下1次就轉(zhuǎn)移
  514.         CPL        FLQH                ;“風(fēng)類切換”取反,正常風(fēng)/自然風(fēng)切換
  515.         RET
  516. AJDZ2:
  517.         CJNE        A,#2,AJDZ3        ;如果不是按下2次就轉(zhuǎn)移
  518.         LCALL        ZRFFW                ;調(diào)用自然風(fēng)變化檔位上下限范圍、檔位變化間隔時間設(shè)置子程序
  519.         RET
  520. AJDZ3:
  521.         SETB        XSQHY                ;是長按10秒,“顯示切換1”置為1,顯示紅外解碼或自然風(fēng)檔位變化范圍
  522.         CLR        XSQHE                ;“顯示切換2”置為0,紅外遙控信號解碼顯示
  523.         MOV        XMBH,#1                ;先放入項目編號1(關(guān))
  524.         LCALL        HENGX                ;關(guān)閉T0中斷的顯示功能,顯示“----”
  525.         LCALL        KEYEX                ;等待按鍵釋放
  526.         CLR        XSKG                ;“顯示開關(guān)”置為0,恢復(fù)T1中斷的顯示功能
  527. AJDZ4:
  528.         CLR        BMXSQH                ;“編碼顯示切換”置為0,先顯示功能編號+系統(tǒng)碼
  529. AJDZ5:
  530.         MOV        MJS,#60                ;設(shè)置無信號等待時間(秒)
  531.         MOV        DSDW,#2                ;設(shè)置系統(tǒng)碼和數(shù)據(jù)碼交替顯示間隔時間(秒)
  532. AJDZ6:
  533.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不閃爍顯示
  534. AJDZ7:
  535.         LCALL        JIEMA                ;調(diào)用紅外遙控解碼子程序
  536.         JC        LXMPD                ;解碼成功(C=1)就轉(zhuǎn)移
  537.         LCALL        SKEY                ;掃描編碼器按鍵
  538.         JNC        AJDZ11                ;沒有按鍵動作(C=0)就轉(zhuǎn)移
  539.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不閃爍顯示
  540.         LCALL        KEY                ;有按鍵動作,調(diào)用編碼器按鍵處理子程序
  541.         CJNE        A,#3,AJDZ9        ;如果不是3(長按10秒)就轉(zhuǎn)移
  542. AJDZ8:
  543.         LCALL        WEEP                ;保存當(dāng)前設(shè)置
  544.         LCALL        HENGX                ;關(guān)閉T0中斷的顯示功能,顯示“----”
  545.         LCALL        KEYEX                ;等待按鍵釋放
  546.         CLR        XSKG                ;“顯示開關(guān)”置為0,恢復(fù)T1中斷的顯示功能
  547.         RET
  548. LXMPD:
  549.         JZ        AJDZ17                ;如果A=0(不是連續(xù)碼)就轉(zhuǎn)移
  550.         LJMP        AJDZ5
  551. AJDZ9:
  552.         CJNE        A,#1,AJDZ_Q        ;如果不是1(短按1次)就轉(zhuǎn)移退出,不保存
  553. AJDZ90:
  554.         MOV        A,XMBH                ;裝入項目編號
  555.         CJNE        A,#6,AJDZ10        ;如果不是最后一項就轉(zhuǎn)移
  556.         MOV        XMBH,#0
  557. AJDZ10:
  558.         INC        XMBH                ;加1,跳到下一個功能編號
  559.         LJMP        AJDZ4
  560. AJDZ11:
  561.         LCALL        Scan1               ;掃描編碼器(有方向標志)
  562.         JB        BMQDZ,AJDZ15        ;編碼器有動作(1)就轉(zhuǎn)移
  563.         MOV        A,DSDW                ;沒有轉(zhuǎn)動,裝入交替顯示間隔時間(秒)到寄存器A
  564.         JNZ        AJDZ12                ;不為0就轉(zhuǎn)移
  565.         CPL        BMXSQH                ;為0,“編碼顯示切換”取反,顯示另一項
  566.         MOV        DSDW,#1                ;設(shè)置系統(tǒng)碼和數(shù)據(jù)碼交替顯示間隔時間(秒)
  567. AJDZ12:
  568.         MOV        A,MJS                ;裝入無信號等待時間到寄存器A
  569.         JNZ        AJDZ13                ;不為0就轉(zhuǎn)移
  570. AJDZ_Q:
  571.         LCALL        RE00                ;讀EEPROM保存的數(shù)據(jù)
  572.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不閃爍顯示,退出,不保存
  573.         RET
  574. AJDZ13:
  575.         CJNE        A,#6,AJDZ14        ;檢查剩余時間
  576. AJDZ14:
  577.         JNC        AJDZ6                ;等于或大于就轉(zhuǎn)移,不閃爍顯示
  578.         MOV        FWBZ0,A                ;剩余時間放到FWBZ0,閃爍顯示
  579.         LJMP        AJDZ7
  580. AJDZ15:
  581.         LCALL        Scan2             ;掃描編碼器(無方向標志)
  582.         JB           BMQDZ,AJDZ15        ;旋轉(zhuǎn)動作未結(jié)束(1)就轉(zhuǎn)移繼續(xù)等待
  583.         JB        XZFX,AJDZ90         ;順時針正轉(zhuǎn)(1)就轉(zhuǎn)移
  584.         MOV        A,XMBH                ;反轉(zhuǎn),裝入項目編號
  585.         DEC        A                ;減1
  586.         JNZ        AJDZ16                ;不為0就轉(zhuǎn)移
  587.         MOV        A,#6                ;跳到第6項
  588. AJDZ16:
  589.         MOV        XMBH,A
  590.         LJMP        AJDZ4
  591. ;
  592. AJDZ17:
  593.         SETB        BMXSQH                ;“編碼顯示切換”置為1(顯示數(shù)據(jù)碼+反碼)
  594.         MOV        A,MA1                ;裝入當(dāng)前接收到的系統(tǒng)碼到A
  595.         MOV        B,ANJZ                ;裝入原來保存的系統(tǒng)碼到B
  596.         CJNE        A,B,AJDZ20        ;不同就轉(zhuǎn)移
  597.         MOV        R0,#ANJZ        ;遙控編碼首地址
  598.         INC        R0                ;地址加1
  599.         MOV        R3,#6                ;檢查6個按鍵值,發(fā)現(xiàn)有相同的就刪除(清零)
  600. AJDZ18:
  601.         MOV        A,MA3                ;裝入數(shù)據(jù)碼
  602.         MOV        B,@R0                ;裝入原來的數(shù)據(jù)碼
  603.         CJNE        A,B,AJDZ19        ;不同就轉(zhuǎn)移,檢查下一個
  604.         INC        R0                ;相同,地址加1,檢查反碼看是否也相同
  605.         MOV        A,MA4                ;裝入數(shù)據(jù)碼反碼
  606.         MOV        B,@R0                ;裝入數(shù)據(jù)碼反碼
  607.         DEC        R0                ;地址減1
  608.         CJNE        A,B,AJDZ19        ;不同就轉(zhuǎn)移,檢查下一個
  609.         MOV        @R0,#0                ;也相同,數(shù)據(jù)碼位置放入0
  610.         INC        R0                ;地址加1
  611.         MOV        @R0,#0                ;反碼位置放入0
  612.         DEC        R0                ;地址減1
  613. AJDZ19:
  614.         INC        R0                ;地址加1
  615.         INC        R0                ;地址加1
  616.         DJNZ        R3,AJDZ18        ;如果未檢查完就轉(zhuǎn)移繼續(xù)
  617.         LJMP        AJDZ22
  618. AJDZ20:
  619.         MOV        ANJZ,MA1           ;移入新的系統(tǒng)碼
  620.         MOV        R0,#ANJZ           ;原來的數(shù)據(jù)全部清零
  621.         MOV        R3,#12           ;原來的數(shù)據(jù)全部清零
  622. AJDZ21:
  623.         INC        R0                   ;原來的數(shù)據(jù)全部清零
  624.         MOV        @R0,#0           ;原來的數(shù)據(jù)全部清零
  625.         DJNZ        R3,AJDZ21           ;原來的數(shù)據(jù)全部清零
  626. AJDZ22:
  627.         MOV        A,XMBH           ;裝入項目編號
  628.         MOV         B,#2               ;項目編號乘2
  629.         MUL         AB                ;項目編號乘2
  630.         DEC         A                 ;計算結(jié)果減1
  631.         ADD         A,#ANJZ           ;加遙控編碼首地址
  632.         MOV         R0,A             ;得出數(shù)據(jù)碼的實際地址
  633.         MOV        @R0,MA3             ;把接收到的數(shù)據(jù)移到對應(yīng)的按鍵值RAM地址
  634.         INC        R0                     ;把接收到的數(shù)據(jù)移到對應(yīng)的按鍵值RAM地址
  635.         MOV        @R0,MA4             ;把接收到的數(shù)據(jù)移到對應(yīng)的按鍵值RAM地址
  636.         LJMP        AJDZ5

  637. ;---------------------------------------------------------------------------------
  638. ;子程序:設(shè)置調(diào)整睡眠風(fēng)(自然風(fēng))變化的檔位上下限范圍、變化時的間隔時間(秒)
  639. ; 1.顯示:L-最低檔位下限
  640. ; 2.顯示:H-最高檔位上限
  641. ; 3.顯示:E-檔位變化時的間隔時間(秒)
  642. ;短按編碼器按鍵,跳到另一項;短按2次編碼器按鍵保存并退出;無操作5秒后開始閃爍顯示,
  643. ;閃爍顯示5秒跳到下一項,如果在第3項,閃爍顯示5秒無操作則保存并退出。
  644. ;上、下限檔位之間最少間隔3檔。自然風(fēng)檔位變化的間隔時間為1~5秒
  645. ;---------------------------------------------------------------------------------
  646. ZRFFW:
  647.         SETB        XSQHY                ;“顯示切換1”置為1,顯示紅外解碼或自然風(fēng)檔位變化范圍
  648.         SETB        XSQHE                ;“顯示切換2”置為1,顯示自然風(fēng)檔位變化范圍
  649.         MOV        ZRFJG,#1        ;先設(shè)為第一項,檔位下限
  650. ZRFFW1:
  651.         MOV        A,ZRFJG                ;裝入項目號
  652.         DEC        A                ;減1
  653.         JNZ        ZRFFW2                ;不為0就轉(zhuǎn)移
  654.         LCALL        ZRFXX                ;是1,設(shè)置下限檔位調(diào)整時的最大和最小值、調(diào)整對象的地址
  655.         LJMP        SZTZ
  656. ZRFFW2:
  657.         DEC        A                ;減1
  658.         JNZ        ZRFFW3                ;不為0就轉(zhuǎn)移
  659.         LCALL        ZRFSX                ;是2,設(shè)置上限檔位調(diào)整時的最大和最小值、調(diào)整對象的地址
  660.         LJMP        SZTZ
  661. ZRFFW3:
  662.         MOV        R5,#1                ;是3,檔位變化的間隔時間(秒),調(diào)整時的最小值
  663.         MOV        R6,#5                ;是3,檔位變化的間隔時間(秒),調(diào)整時的最大值
  664.         MOV        R0,#SMFJG        ;檔位變化的間隔時間(秒)地址
  665. SZTZ:
  666.         MOV        MJS,#10                ;無操作等待時間10秒
  667. SZTZ1:
  668.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不閃爍顯示
  669. SZTZ2:
  670.         LCALL        SKEY                ;掃描編碼器按鍵開關(guān)
  671.         JNC        SZTZ5                ;沒有按鍵動作(C=0)就轉(zhuǎn)移
  672.         LCALL        KEY                ;有按鍵動作,調(diào)用編碼器按鍵處理子程序
  673.         CJNE        A,#2,SZTZ3
  674. SZTZ3:
  675.         JNC        SZTZ4                ;如果是按下2次及以上就轉(zhuǎn)移
  676. SZTZ30:
  677.         INC        ZRFJG                ;是按下1次,項目號加1(跳到下一項)
  678.         MOV        A,ZRFJG                ;裝入項目號
  679.         CJNE        A,#4,SZTZ31        ;是否小于4
  680. SZTZ31:        JC        ZRFFW1                ;小于就轉(zhuǎn)移
  681.         LJMP        ZRFFW                ;等于或大于,轉(zhuǎn)移,設(shè)為第一項
  682. SZTZ4:
  683.         LCALL        WEEP                ;保存
  684.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不閃爍顯示
  685.         LCALL        KEYEX                ;等待按鍵釋放
  686.         RET
  687. SZTZ5:
  688.         LCALL        Scan1               ;掃描編碼器(有方向標志)
  689.         JB        BMQDZ,SZTZ8        ;編碼器已經(jīng)轉(zhuǎn)動(1)就轉(zhuǎn)移
  690.         MOV        A,MJS                ;沒有轉(zhuǎn)動,裝入秒計數(shù)到寄存器A
  691.         JZ        SZTZ7                ;如果秒計數(shù)為0(10秒無操作)就轉(zhuǎn)移
  692.         CJNE        A,#6,SZTZ6        ;檢查剩余時間
  693. SZTZ6:
  694.         JNC        SZTZ1                ;等于或大于就轉(zhuǎn)移,不閃爍顯示
  695.         MOV        FWBZ0,A                ;剩余時間放到FWBZ0,閃爍顯示
  696.         LJMP        SZTZ2
  697. SZTZ7:
  698.         MOV        A,ZRFJG                ;時間到,裝入項目號
  699.         CJNE        A,#3,SZTZ30        ;不是最后一項就轉(zhuǎn)移,跳到下一項
  700.         LJMP        SZTZ4                ;轉(zhuǎn)移,保存并退出
  701. SZTZ8:
  702.         LCALL        Scan2             ;掃描編碼器(無方向標志)
  703.         JB           BMQDZ,SZTZ8        ;旋轉(zhuǎn)動作未結(jié)束(1)就轉(zhuǎn)移繼續(xù)等待
  704.         JB        XZFX,SZTZ11         ;是順時針正轉(zhuǎn)(1)就轉(zhuǎn)移
  705.         MOV        B,R5                ;是反轉(zhuǎn),裝入最小值到B寄存器
  706.         MOV        A,@R0                ;裝入R0指向的RAM地址的調(diào)整對象數(shù)值
  707.         DEC        A                ;減1
  708.         CJNE        A,B,SZTZ9        ;與最小比較
  709. SZTZ9:
  710.         JC        SZTZ10                ;如果小于就轉(zhuǎn)移
  711.         MOV        @R0,A                ;等于或大于,把減1后的結(jié)果放回去
  712.         LJMP        SZTZ
  713. SZTZ10:
  714.         MOV        @R0,B                ;直接放入最小值
  715.         LJMP        SZTZ
  716. SZTZ11:
  717.         MOV        B,R6                ;裝入最大值到B寄存器
  718.         MOV        A,@R0                ;裝入R0指向的RAM地址的調(diào)整對象數(shù)值
  719.         INC        A                ;加1
  720.         CJNE        A,B,SZTZ12        ;加完后與最大值比較
  721. SZTZ12:
  722.         JC        SZTZ13                ;如果小于就轉(zhuǎn)移
  723.         MOV        @R0,B                ;等于或大于,直接放入最大值
  724.         LJMP        SZTZ
  725. SZTZ13:
  726.         MOV        @R0,A                ;小于最大值,把加1后的結(jié)果放回去
  727.         LJMP        SZTZ

  728. ;---------------------------------------------------------------------------
  729. ;設(shè)置睡眠風(fēng)(自然風(fēng))變化范圍的上限檔位,最大為15檔,最小為下限檔位加3檔
  730. ;---------------------------------------------------------------------------
  731. ZRFSX:        
  732.         MOV        B,#15                ;調(diào)整時的最大值
  733.         MOV        A,DANG_D        ;裝入當(dāng)前檔位下限
  734.         ADD        A,#3                ;加3檔
  735.         CJNE        A,B,ZRFSX1        ;是否等于或大于上限
  736. ZRFSX1:
  737.         JC        ZRFSX2                ;小于就轉(zhuǎn)移
  738.         MOV        A,B
  739.         PUSH        ACC
  740.         SUBB        A,#3                ;等于或大于,把檔位下限改為最大值減3檔
  741.         MOV        DANG_D,A        ;等于或大于,把檔位下限改為最大值減3檔
  742.         POP        ACC
  743. ZRFSX2:
  744.         MOV        R5,A                ;調(diào)整時的最小值
  745.         MOV        R6,B                ;調(diào)整時的最大值
  746.         MOV        R0,#DANG_G        ;自然風(fēng)檔位上限地址
  747.         RET
  748. ;---------------------------------------------------------------------------
  749. ;設(shè)置睡眠風(fēng)(自然風(fēng))變化范圍的下限檔位,最小為1檔,最大為上限檔位減3檔
  750. ;---------------------------------------------------------------------------
  751. ZRFXX:
  752.         MOV        B,#4                ;調(diào)整時的最小值1加3檔
  753.         MOV        A,DANG_G        ;裝入當(dāng)前自然風(fēng)檔位上限
  754.         CJNE        A,B,ZRFXX1
  755. ZRFXX1:
  756.         JC        ZRFXX2                ;小于就轉(zhuǎn)移
  757.         SUBB        A,#3                ;等于或大于,檔位上限減3檔即為調(diào)整時的最大值
  758.         MOV        B,A                ;等于或大于,檔位上限減3檔即為調(diào)整時的最大值
  759.         LJMP        ZRFXX3
  760. ZRFXX2:
  761.         MOV        DANG_G,B        ;小于最小值+3檔,把上限檔位改為最小值加3檔
  762.         MOV        B,#1
  763. ZRFXX3:
  764.         MOV        R5,#1                ;調(diào)整時的最小值
  765.         MOV        R6,B                ;調(diào)整時的最大值
  766.         MOV        R0,#DANG_D        ;自然風(fēng)檔位下限地址
  767.         RET
復(fù)制代碼
未完,下面還有

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

使用道具 舉報

沙發(fā)
ID:396309 發(fā)表于 2022-8-16 04:39 | 只看該作者
本帖最后由 楊小強 于 2022-8-16 04:42 編輯
  1. ;------------------------------------------------------------------------------------
  2. ;子程序:編碼器按鍵開關(guān)處理,間隔時間不超過0.6秒的2次短按,為有效按鍵動作
  3. ;出口參數(shù):A=1(按了1次);A=2(按了2次);A=3(長按達到了10秒)
  4. ;------------------------------------------------------------------------------------
  5. KEY:
  6.         MOV        MJS,#10                ;放入等待時間(秒)
  7.         MOV        FENGMQ,#12         ;蜂鳴器響一聲,12*10毫秒=120毫秒
  8. KEY1:
  9.         MOV        A,MJS                ;裝入等待時間
  10.         JNZ        KEY2                ;如果不為0就轉(zhuǎn)移,時間未到
  11.         MOV        A,#3                ;時間到了
  12.         RET
  13. KEY2:
  14.         LCALL        SKEY                ;掃描按鍵
  15.         JC        KEY1                ;如果C=1(按鍵還沒松開),就繼續(xù)掃描
  16.         LCALL        KEYA                ;掃描按鍵600毫秒
  17.         JZ        KEY3                ;如果600毫秒內(nèi)有按鍵動作就轉(zhuǎn)移
  18.         MOV        A,#1                ;600毫秒內(nèi)沒有按鍵動作,置A=1(按了1次)
  19.         RET
  20. KEY3:
  21.         MOV        FENGMQ,#12         ;蜂鳴器響一聲,12*10毫秒=120毫秒
  22.         LCALL        KEYEX                ;等待第二次按鍵松開
  23.         MOV        A,#2                ;置A=2(按了2次)
  24.         RET

  25. ;----------- 掃描按鍵600毫秒,有按鍵動作A=0,無按鍵動作A=1 -----------
  26. KEYA:
  27.         MOV          SHMJS,#60        ;等待600毫秒
  28. KEYB:
  29.         MOV          A,SHMJS          ;裝入(10)毫秒計數(shù)
  30.         JZ           KEYC             ;為0(時間到)就轉(zhuǎn)移
  31.         LCALL        SKEY            ;掃描按鍵
  32.         JNC          KEYB             ;沒有按鍵動作(C=0)就轉(zhuǎn)移
  33.         CLR          A                ;有按鍵動作A=0
  34.         RET
  35. KEYC:
  36.         MOV          A,#1                 ;等待時間已到,A=1沒有按鍵動作
  37.         RET

  38. ;-------------- 按鍵開關(guān)掃描,未按C=0,已按下C=1 --------------
  39. SKEY:
  40.         SETB         EC11K                ;按鍵端口置為高電平
  41.         JNB          EC11K,SKEY1        ;為0(低電平)就轉(zhuǎn)移
  42.         CLR          C                ;C置為0,沒有按鍵動作
  43.         RET
  44. SKEY1:
  45.         LCALL        DELAY20          ;延時20毫秒
  46.         SETB        EC11K              ;延時結(jié)束后再次把按鍵端口置為高電平
  47.         JNB          EC11K,SKEY2        ;為0(低電平)就轉(zhuǎn)移
  48.         CLR          C                ;C置為0,沒有按鍵動作
  49.         RET                        ;按鍵未被有效按下,退出
  50. SKEY2:
  51.         SETB         C                ;C置為1,按鍵已有效按下
  52.         LCALL        SETPWM          ;有按鍵動作就重新放置“延時PWM驅(qū)動”時間
  53.         RET


  54. ;------------------ 等待按鍵釋放 ------------------
  55. KEYEX:
  56.         LCALL        SKEY                   ;掃描按鍵
  57.         JC           KEYEX           ;如果C=1(按鍵還沒釋放)就繼續(xù)掃描
  58.         RET

  59. ;------------------ 延時20毫秒 ------------------
  60. DELAY20:                        ;@11.0592MHz
  61.         PUSH         15H
  62.         PUSH         16H
  63.         PUSH         17H
  64.         MOV          15H,#2
  65.         MOV          16H,#32
  66.         MOV          17H,#58
  67. NEXT20:
  68.         DJNZ         17H,NEXT20
  69.         DJNZ         16H,NEXT20
  70.         DJNZ         15H,NEXT20
  71.         POP          17H
  72.         POP          16H
  73.         POP          15H
  74.         RET

  75. ;---------------------------------------------------------------------------------------------
  76. ;子程序:編碼器旋轉(zhuǎn)動作處理,根據(jù)旋轉(zhuǎn)方向增(減)定時時間、檔位
  77. ;10小時以下每次增(減)30分鐘;10小時及以上每次增(減)1個小時;20小時以上每次增(減)2個小時
  78. ;---------------------------------------------------------------------------------------------
  79. BMQCL:
  80.         LCALL        Scan2             ;掃描編碼器(無方向標志)
  81.         MOV        DSDW,DSDWJG        ;置交替顯示間隔時間
  82.         JB           BMQDZ,BMQCL        ;“編碼器動作”為1(動作未結(jié)束)就轉(zhuǎn)移繼續(xù)等待
  83. BMQCL0:
  84.         JNB           XSNRXZ,BMQCL5        ;“顯示內(nèi)容選擇”為0(顯示定時時間)就轉(zhuǎn)移
  85.         SETB        YSBC                ;“延時保存”置為1
  86.         MOV        MJS,#10                ;“延時保存”時長(秒)。延時結(jié)束后才保存,避免頻繁的EEPROM操作
  87.         MOV        A,DANG                ;裝入當(dāng)前檔位值
  88.         JB        XZFX,BMQCL2         ;“旋轉(zhuǎn)方向”為1(順時針正轉(zhuǎn))就轉(zhuǎn)移
  89.         DEC        A                ;是反轉(zhuǎn),減1檔
  90.         JNZ        BMQCL1                ;減1后不為0就轉(zhuǎn)移
  91.         RET       
  92. BMQCL1:
  93.         MOV        DANG,A
  94.         RET
  95. BMQCL2:
  96.         CJNE        A,#15,BMQCL3        ;是否已到最高15檔
  97. BMQCL3:
  98.         JC        BMQCL4                ;小于就轉(zhuǎn)移
  99.         MOV        DANG,#15        ;等于或大于,放入最高檔位15
  100.         RET
  101. BMQCL4:
  102.         INC        DANG                ;還未到上限,增1檔
  103.         RET
  104. BMQCL5:
  105.         CLR         SSBZ                ;“閃爍標志”置為0(數(shù)字及冒號狀態(tài)為“顯示”)
  106.         MOV         A,DSSJS                  ;裝入定時時間(時)
  107.         CJNE        A,#20,BMQCL6        ;當(dāng)前“時”是否等于或大于20
  108. BMQCL6:
  109.         JC          BMQCL7                ;小于就轉(zhuǎn)移
  110.         MOV         R5,#2                ;等于或大于20,加減2個小時
  111.         LJMP        BMQCL9
  112. BMQCL7:
  113.         CJNE        A,#10,BMQCL8        ;當(dāng)前“時”是否等于或大于10
  114. BMQCL8:
  115.         JC          BMQCL13                ;小于就轉(zhuǎn)移
  116.         MOV         R5,#1                ;等于或大于10,加減1個小時
  117. BMQCL9:
  118.         JNB         XZFX,BMQCL11        ;“旋轉(zhuǎn)方向”為0(逆時針反轉(zhuǎn))就轉(zhuǎn)移
  119.         ADD         A,R5                 ;是正轉(zhuǎn),加
  120.         CJNE        A,#100,BMQCL10        ;加完后是否等于或大于100
  121. BMQCL10:
  122.         JC          BMQCL12                 ;如果小于就轉(zhuǎn)移,把A放回到DSSJS
  123.         MOV         DSSJS,#99        ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
  124.         MOV         DSSJF,#59        ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
  125.         MOV         DSSJM,#59        ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
  126.         RET
  127. BMQCL11:
  128.         SUBB        A,R5                ;是反轉(zhuǎn),減
  129. BMQCL12:
  130.         MOV         DSSJS,A                ;把計算結(jié)果放入DSSJS
  131.         RET
  132. BMQCL13:
  133.         MOV         A,DSSJF             ;小于10小時,裝入定時時間(分)
  134.         JNB         XZFX,BMQCL16          ;“旋轉(zhuǎn)方向”為0(逆時針反轉(zhuǎn))就轉(zhuǎn)移
  135.         ADD         A,#30              ;是正轉(zhuǎn),當(dāng)前“分”加30
  136.         CJNE        A,#60,BMQCL14        ;加完后“分”是否等于或大于60
  137. BMQCL14:
  138.         JC          BMQCL15             ;小于60就轉(zhuǎn)移,把A放入定時時間(分)
  139.         SUBB        A,#60              ;等于或大于60,就減60,然后小時加1
  140.         INC         DSSJS                  ;小時加1
  141. BMQCL15:
  142.         MOV         DSSJF,A            ;把A放入定時時間(分)
  143.         RET
  144. BMQCL16:
  145.         CJNE        A,#30,BMQCL17        ;是逆時針反轉(zhuǎn),當(dāng)前“分”是否等于或大于30
  146. BMQCL17:
  147.         JC          BMQCL18          ;小于就轉(zhuǎn)移
  148.         SUBB        A,#30                  ;定時時間(分)減30
  149.         MOV         DSSJF,A         ;把計算結(jié)果放入定時時間(分)
  150.         RET
  151. BMQCL18:
  152.         MOV         A,#30                  ;“分”小于30,把30放入寄存器A
  153.         CLR         C               ;進位標志清0
  154.         SUBB        A,DSSJF         ;減“定時時間(分)”
  155.         MOV         DSSJF,A         ;減完后的結(jié)果暫時放入DSSJF
  156.         MOV         A,#60
  157.         SUBB        A,DSSJF         ;60減上面的計算結(jié)果,得出定時時間(分),然后小時減1
  158.         MOV         DSSJF,A         ;得出的數(shù)放入定時時間(分)
  159.         MOV         A,DSSJS         ;裝入定時時間(時)
  160.         JZ        DSSJQL                ;如果“時”為0就轉(zhuǎn)移(不夠減了,把定時時間清零)
  161.         DEC        DSSJS                ;“時”不為0,減1
  162.         RET
  163. DSSJQL:
  164.         MOV        DSSJS,#0        ;定時時間清零
  165.         MOV        DSSJF,#0        ;定時時間清零
  166.         MOV        DSSJM,#0        ;定時時間清零
  167.         RET

  168. ;----------------------------------------------------------------------------------------------
  169. ;子程序:掃描編碼器是否有旋轉(zhuǎn)動作并設(shè)置好方向標志
  170. ;出口參數(shù):“編碼器動作”=1已經(jīng)轉(zhuǎn)動,=0沒有轉(zhuǎn)動;“旋轉(zhuǎn)方向”=1順時針正轉(zhuǎn),=0逆時針反轉(zhuǎn)
  171. ;----------------------------------------------------------------------------------------------
  172. Scan1:
  173.         SETB         EC11A               ;拉高編碼器A引腳電平
  174.         SETB         EC11B               ;拉高編碼器B引腳電平
  175.         JNB          EC11A,Scan11        ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作,順時針正轉(zhuǎn)
  176.         JNB          EC11B,Scan12        ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作,逆時針反轉(zhuǎn)
  177.         CLR          BMQDZ                 ;沒有旋轉(zhuǎn)動作,把“編碼器動作”置為0
  178.         RET
  179. Scan11:
  180.         SETB         XZFX                ;順時針正轉(zhuǎn),把“旋轉(zhuǎn)方向”置為1
  181.         SETB         BMQDZ                ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
  182.         LCALL        SETPWM          ;有動作就重新放置“延時PWM驅(qū)動”時間
  183.         RET  
  184. Scan12:
  185.         CLR          XZFX                ;逆時針反轉(zhuǎn),把“旋轉(zhuǎn)方向”置為0
  186.         SETB         BMQDZ                ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
  187.         LCALL        SETPWM          ;有動作就重新放置“延時PWM驅(qū)動”時間
  188.         RET

  189. ;-------------------------------------------------------------
  190. ;子程序:掃描編碼器是否有旋轉(zhuǎn)動作,不設(shè)置方向標志
  191. ;出口參數(shù):“編碼器動作”BMQDZ=1已經(jīng)轉(zhuǎn)動,=0沒有轉(zhuǎn)動
  192. ;-------------------------------------------------------------
  193. Scan2:
  194.         SETB         EC11A               ;拉高編碼器A引腳電平
  195.         SETB         EC11B               ;拉高編碼器B引腳電平
  196.         JNB          EC11A,Scan21        ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作
  197.         JNB          EC11B,Scan21        ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作
  198.         CLR          BMQDZ                 ;沒有旋轉(zhuǎn)動作,把“編碼器動作”置為0
  199.         RET
  200. Scan21:
  201.         SETB         BMQDZ                ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
  202.         LCALL        SETPWM          ;有動作就重新放置“延時PWM驅(qū)動”時間
  203.         RET

  204. ;--------------------------------------------------------------
  205. ;子程序:繼電器控制,T0中斷、EEPROM操作子程序調(diào)用
  206. ;--------------------------------------------------------------
  207. Control:
  208.         JNB        EEPBC,CTL00        ;EEPBC標志為0就轉(zhuǎn)移。為1表示EEPROM操作子程序正在調(diào)用下面的繼電器控制程序
  209.         RET
  210. CTL00:
  211.         MOV        A,DSSJM                ;裝入定時時間(秒)到寄存器A
  212.         JNZ        CTL02                ;不是0就轉(zhuǎn)移
  213.         MOV        A,DSSJF                ;裝入定時時間(分)到寄存器A
  214.         JNZ        CTL02                ;不是0就轉(zhuǎn)移
  215.         MOV        A,DSSJS                ;裝入定時時間(時)到寄存器A
  216.         JNZ        CTL02                ;不是0就轉(zhuǎn)移
  217. CTL01:
  218.         MOV        P3,#0FFH        ;置P3端口為高電平,斷電
  219.         RET
  220. CTL02:
  221.         JNB        PWM,CTL03        ;PWM標志為0就轉(zhuǎn)移。0=禁止PWM驅(qū)動,1=使用PWM方式驅(qū)動
  222.         MOV        A,YSPWM          ;裝入“延時PWM驅(qū)動”,為0時使用PWM驅(qū)動方式
  223.         JNZ           CTL03                ;不是0就轉(zhuǎn)移
  224.         JB        PWMBZ,CTL01        ;“PWM電平狀態(tài)標志”為1(高電平)就轉(zhuǎn)移。PWM周期25微秒*2=50微秒,20KHz占空比50%
  225. CTL03:
  226.         JB        FLQH,CTL05         ;“風(fēng)類切換”為1自然風(fēng)(睡眠風(fēng))就轉(zhuǎn)移
  227.         MOV         A,DANG           ;裝入檔位值
  228. CTL04:
  229.         PUSH        DPL
  230.         PUSH        DPH
  231.         MOV          DPTR,#DAB1        ;檔位控制碼地址
  232.         DEC        A                ;檔位值減1后為正確地址
  233.         MOVC         A,@A+DPTR        ;裝入檔位控制碼
  234.         MOV          P3,A            ;置P3口控制繼電器
  235.         POP        DPH
  236.         POP        DPL
  237.         RET
  238. CTL05:
  239.         MOV        A,SMFJG2         ;裝入自然風(fēng)(睡眠風(fēng))檔位變化時的間隔時間(秒)
  240.         JZ        CTL06                ;是0就轉(zhuǎn)移
  241.         MOV        A,DANGW                ;裝入自然風(fēng)當(dāng)前檔位
  242.         LJMP        CTL04
  243. CTL06:
  244.         MOV        SMFJG2,SMFJG        ;重新放入設(shè)置的檔位變化間隔時間
  245.         LCALL        SETPWM          ;設(shè)置“延時PWM驅(qū)動”時間
  246.         MOV        A,DANGW           ;裝入當(dāng)前檔位值
  247.         JNB        TSFX,CTL09         ;如果“調(diào)速方向”為0(漸慢降檔)就轉(zhuǎn)移
  248.         CJNE        A,DANG_G,CTL07        ;當(dāng)前檔位值是否等于或大于設(shè)置的最高上限
  249. CTL07:
  250.         JC        CTL08                ;小于就轉(zhuǎn)移
  251.         MOV        A,DANG_G        ;等于或大于,裝入最高上限
  252.         CLR        TSFX                ;“調(diào)速方向”改為0(漸慢降檔)
  253.         LJMP        CTL09
  254. CTL08:
  255.         INC        A                ;增1檔
  256.         MOV        DANGW,A
  257.         LJMP        CTL04
  258. CTL09:
  259.         CJNE        A,DANG_D,CTL10        ;當(dāng)前檔位值不是設(shè)置的最低下限就轉(zhuǎn)移
  260.         SETB        TSFX                ;是,“調(diào)速方向”改為1(漸快增檔)
  261.         LJMP        CTL04
  262. CTL10:
  263.         JC        CTL13                ;小于就轉(zhuǎn)移
  264.         CJNE        A,DANG_G,CTL11        ;是否大于設(shè)置的最高上限
  265. CTL11:
  266.         JC        CTL12                ;小于就轉(zhuǎn)移
  267.         MOV        A,DANG_G        ;等于或大于,裝入最高上限
  268. CTL12:
  269.         DEC        A                ;減1檔
  270.         MOV        DANGW,A
  271.         LJMP        CTL04
  272. CTL13:
  273.         MOV        A,DANG_D        ;小于最低下限,裝入最低下限
  274.         MOV        DANGW,A
  275.         LJMP        CTL04

  276. ;--------------------------------------------------------------
  277. ;子程序:T1中斷調(diào)用,時間計數(shù)及倒計時處理。10毫秒執(zhí)行一次
  278. ;--------------------------------------------------------------
  279. TIME:
  280.         MOV        A,YSPWM           ;延時PWM驅(qū)動
  281.         JZ        TIME0
  282.         DEC        YSPWM             ;每10毫秒減1,直到為0
  283. TIME0:
  284.         MOV        A,FENGMQ        ;蜂鳴器鳴響時長
  285.         JZ        TIME1
  286.         DEC        FENGMQ          ;每10毫秒減1,直到為0
  287. TIME1:
  288.         MOV          A,SHMJS         ;裝入(10)毫秒計數(shù)
  289.         JZ           TIME2           ;如果是0就轉(zhuǎn)移
  290.         DEC          SHMJS           ;每10毫秒減1,直到為0
  291. TIME2:
  292.         MOV        A,HWJS          ;每10毫秒減1,為0時清除“接收到的紅外遙控數(shù)據(jù)碼”
  293.         JZ           TIME3           ;是0就轉(zhuǎn)移
  294.         DEC        HWJS                   ;減1
  295.         LJMP        TIME4
  296. TIME3:
  297.         MOV          MA1,FWBZ1          ;用“復(fù)位及EEPROM判斷標志”填充“接收到的紅外遙控數(shù)據(jù)碼”
  298.         MOV          MA2,FWBZ2          ;用“復(fù)位及EEPROM判斷標志”填充“接收到的紅外遙控數(shù)據(jù)碼”
  299. TIME4:
  300.         MOV          A,HMJS             ;裝入(10)毫秒計數(shù)2
  301.         JZ           TIME6              ;如果是0就轉(zhuǎn)移
  302.         DEC          HMJS               ;不是0,減1
  303.         CJNE         A,#50,TIME5        ;如果不是50就轉(zhuǎn)移退出
  304.         SETB         SSBZ                ;“閃爍標志”置為1,數(shù)字及冒號閃爍時用,每0.5秒變化一次
  305. TIME5:
  306.         RET
  307. TIME6:
  308.         CLR          SSBZ             ;“閃爍標志”置為0,數(shù)字及冒號閃爍時用,每0.5秒變化一次
  309.         MOV          HMJS,#99        ;重新放入計數(shù)值(1秒)
  310.         MOV          A,SMFJG2           ;裝入運行時使用的“睡眠風(fēng)(自然風(fēng))檔位變化時的間隔時間(秒)”
  311.         JZ           TIME7                  ;如果是0就轉(zhuǎn)移
  312.         DEC          SMFJG2             ;每秒減1,直到為0
  313. TIME7:
  314.         MOV          A,MJS           ;秒計數(shù)
  315.         JZ           TIME8                  ;如果是0就轉(zhuǎn)移
  316.         DEC          MJS             ;每秒減1,直到為0
  317. TIME8:
  318.         MOV          A,FWBZ0           ;裝入復(fù)位提示(閃爍顯示)秒計數(shù)
  319.         JZ           TIME9                  ;如果是0就轉(zhuǎn)移
  320.         DEC          FWBZ0             ;每秒減1,直到為0
  321. TIME9:
  322.         MOV          A,DSDW           ;裝入定時與檔位交替顯示的間隔時間(秒)
  323.         JNZ           TIME10                  ;如果不是0就轉(zhuǎn)移
  324.         MOV        DSDW,DSDWJG        ;重新放入設(shè)置值
  325.         CPL        XSNRXZ                ;“顯示內(nèi)容選擇”取反,交替顯示
  326. TIME10:
  327.         DEC          DSDW             ;每秒減1,直到為0
  328.         MOV          A,DSSJM           ;裝入定時時間(秒)到寄存器A
  329.         JZ           TIME11             ;如果是0就轉(zhuǎn)移
  330.         DEC          DSSJM             ;減1秒
  331.         RET
  332. TIME11:
  333.         MOV          A,DSSJF           ;裝入定時時間(分)到寄存器A
  334.         JZ           TIME12             ;如果是0就轉(zhuǎn)移
  335.         DEC          DSSJF             ;不是0,減1分
  336.         MOV          DSSJM,#59         ;把59放入定時時間(秒)
  337.         RET
  338. TIME12:
  339.         MOV          A,DSSJS         ;裝入定時時間(時)到寄存器A
  340.         JNZ          TIME13           ;不是0就轉(zhuǎn)移
  341.         CLR        XSNRXZ                ;定時結(jié)束,“顯示內(nèi)容選擇”置為0,不顯示檔位
  342.         RET
  343. TIME13:
  344.         DEC          DSSJS             ;不是0,小時減1
  345.         MOV          DSSJM,#59         ;把59放入定時時間(秒)
  346.         MOV          DSSJF,#59         ;把59放入定時時間(分)
  347.         RET

  348. ;---------------------------------------------------------------------------
  349. ;子程序:T1中斷調(diào)用,顯示定時時間及檔位、紅外遙控解碼等。10毫秒執(zhí)行一次
  350. ;---------------------------------------------------------------------------
  351. DISPLAY:
  352.         JB          XSKG,DPYSZ1        ;如果“顯示開關(guān)”為1(禁止T1顯示功能)就轉(zhuǎn)移,退出
  353.         JNB          XSQHY,DPYSZ0        ;如果“顯示切換1”為0(顯示定時或檔位)就轉(zhuǎn)移
  354.         LJMP        DSZ
  355. DPYSZ0:
  356.         JB          FLQH,DISPL0        ;如果“風(fēng)類切換”為1睡眠風(fēng)(自然風(fēng))就轉(zhuǎn)移,顯示定時時間
  357.         JNB          XSNRXZ,DISPL0        ;如果“顯示內(nèi)容選擇”為0(顯示定時時間)就轉(zhuǎn)移
  358.         MOV         A,DANG           ;顯示檔位,裝入檔位值
  359.         CJNE        A,XSHC1,DPYSZ3        ;當(dāng)前檔位值與緩存1不相同就轉(zhuǎn)移,立即顯示
  360.         MOV         A,HMJS               ;相同,裝入(10)毫秒計數(shù)2
  361.         CJNE        A,#99,DPYSZ2        ;不是99就轉(zhuǎn)移,每0.5秒顯示一次
  362.         LJMP        DPYSZ3              ;是,顯示
  363. DPYSZ1:        RET
  364. DPYSZ2:
  365.         CJNE         A,#49,DPYSZ1         ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  366. DPYSZ3:
  367.         MOV          XSHC1,DANG           ;當(dāng)前檔位值放入緩存1
  368.         MOV          ZXM1,#0               ;放入消隱碼到待發(fā)送TM1637區(qū)1
  369.         MOV          ZXM4,#0               ;放入消隱碼到待發(fā)送TM1637區(qū)4
  370.         MOV          R0,#ZXM2          ;裝入待發(fā)送TM1637區(qū)2地址
  371.         MOV         A,DANG           ;裝入檔位值
  372.         LCALL        BCD               ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)2和3
  373.         LCALL        disp              ;發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示
  374.         RET
  375. ;--------------------------------
  376. DISPL0:
  377.         CLR        XSNRXZ                 ;“顯示內(nèi)容選擇”置為0,顯示定時時間
  378.         MOV          R1,#DSSJS         ;把定時時間“時”的地址放入R1
  379.         MOV          A,@R1             ;裝入“時”
  380.         JZ           DISPL1            ;如果“時”為0就轉(zhuǎn)移
  381.         LJMP         DISPL3
  382. DISPL1:
  383.         CLR          SSBZ                ;“時”為0,把“閃爍標志”置為0,始終顯示冒號
  384.         INC          R1                ;地址加1,指向“分”
  385.         MOV          A,@R1                ;裝入“分”
  386. DISPL3:
  387.         CJNE         A,XSHC1,DISPL6        ;寄存器A的數(shù)據(jù)與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  388.         INC          R1                  ;地址加1
  389.         MOV          A,@R1               ;裝入下一個時間數(shù)值
  390.         DEC          R1                  ;地址減1
  391.         CJNE         A,XSHC2,DISPL6        ;寄存器A的數(shù)據(jù)與顯示緩存2不相同就轉(zhuǎn)移,立即顯示
  392.         MOV          A,HMJS              ;都相同,裝入(10)毫秒時間計數(shù)2
  393.         CJNE         A,#99,DISPL5        ;不是99就轉(zhuǎn)移
  394.         LJMP         DISPL6              ;是,顯示(每0.5秒顯示一次)
  395. DISPL4:        RET
  396. DISPL5:
  397.         CJNE         A,#49,DISPL4         ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  398. DISPL6:
  399.         INC          R1                ;地址加1
  400.         MOV          A,@R1             ;裝入后面一位時間數(shù)值
  401.         MOV          XSHC2,A           ;放入緩存2
  402.         DEC          R1                ;地址減1
  403.         MOV          A,@R1             ;裝入前面一位時間數(shù)值
  404.         MOV          XSHC1,A           ;放入緩存1
  405.         MOV          R0,#ZXM1          ;待發(fā)送TM1637區(qū)1地址
  406.         LCALL        BCD               ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)1、2
  407.         INC          R1                ;地址加1
  408.         MOV          R0,#ZXM3          ;待發(fā)送TM1637區(qū)3地址
  409.         MOV          A,@R1             ;裝入后面一位時間數(shù)值
  410.         LCALL        BCD               ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3、4
  411.         JB           SSBZ,DISPL8        ;如果“閃爍標志”為1就轉(zhuǎn)移,不顯示冒號
  412. DISPL7:
  413.         ORL          ZXM2,#10000000B        ;把最高位置為1(最高位為1就顯示冒號)
  414. DISPL8:
  415.         LCALL        disp             ;發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示
  416.         RET
  417. ;--------------------------------
  418. DSZ:
  419.         JNB          XSQHE,DHW        ;如果“顯示切換2”為0(顯示紅外遙控信號解碼)就轉(zhuǎn)移
  420.         MOV        A,ZRFJG                ;裝入當(dāng)前要顯示的項目號,1:檔位下限;2=檔位上限;3=檔位變化的間隔時間(秒)
  421.         DEC        A                ;減1
  422.         JNZ        DSZ1                ;不為0就轉(zhuǎn)移
  423.         MOV        A,DANG_D        ;是1,顯示檔位下限
  424.         MOV          ZXM1,#038H        ;放入“L”到待發(fā)送TM1637區(qū)1
  425.         LJMP        DSZ3
  426. DSZ1:
  427.         DEC        A                ;減1
  428.         JNZ        DSZ2                ;不為0就轉(zhuǎn)移
  429.         MOV        A,DANG_G        ;是2,顯示檔位上限
  430.         MOV          ZXM1,#076H        ;放入“H”到待發(fā)送TM1637區(qū)1
  431.         LJMP        DSZ3
  432. DSZ2:
  433.         MOV        A,SMFJG                ;是3,顯示檔位變化的間隔時間(秒)
  434.         MOV          ZXM1,#079H        ;放入“E”到待發(fā)送TM1637區(qū)1
  435. DSZ3:
  436.         MOV          ZXM2,#040H        ;放入“-”到待發(fā)送TM1637區(qū)2
  437.         MOV          R0,#ZXM3          ;待發(fā)送TM1637區(qū)3地址
  438.         LCALL        BCD               ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)2和3
  439.         LCALL        disp              ;顯示
  440.         RET
  441. ;---------------------------------
  442. DHW:
  443.         JB          BMXSQH,DHW4        ;如果“編碼顯示切換”為1(顯示數(shù)據(jù)碼+反碼)就轉(zhuǎn)移
  444.         MOV        A,XMBH                ;裝入功能編號
  445.         CJNE         A,XSHC1,DHW3        ;與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  446.         MOV         A,HMJS               ;相同,裝入(10)毫秒計數(shù)
  447.         CJNE        A,#99,DHW2        ;不是99就轉(zhuǎn)移,每0.5秒顯示一次
  448.         LJMP        DHW3              ;是,顯示
  449. DHW1:        RET
  450. DHW2:
  451.         CJNE         A,#49,DHW1         ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  452. DHW3:
  453.         MOV          XSHC1,XMBH           ;功能編號放入緩存1
  454.         MOV          R0,#ZXM1          ;顯示功能編號+系統(tǒng)碼,待發(fā)送TM1637區(qū)1
  455.         MOV        A,XMBH           ;裝入功能編號
  456.         LCALL        BCD1               ;獲取字形碼放到待發(fā)送TM1637區(qū)
  457.         MOV          ZXM2,#040H        ;放入“-”到待發(fā)送TM1637區(qū)2
  458.         MOV        A,ANJZ                ;裝入系統(tǒng)碼
  459.         MOV          R0,#ZXM3          ;待發(fā)送TM1637區(qū)3
  460.         LCALL        HEX              ;顯示十六進制系統(tǒng)碼
  461.         LCALL        disp              ;顯示十六進制系統(tǒng)碼
  462.         RET
  463. DHW4:
  464.         MOV        A,XMBH           ;裝入功能編號
  465.         MOV         B,#2               ;功能編號乘2
  466.         MUL         AB                ;功能編號乘2
  467.         DEC         A                 ;計算結(jié)果減1
  468.         ADD         A,#ANJZ           ;加遙控按鍵值首地址,得出數(shù)據(jù)碼的實際地址
  469.         MOV         R1,A             ;地址放入R1
  470.         MOV         A,@R1            ;裝入數(shù)據(jù)碼
  471.         CJNE         A,XSHC1,DHW7        ;與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  472.         INC          R1                  ;地址加1
  473.         MOV          A,@R1               ;裝入裝入數(shù)據(jù)碼反碼
  474.         DEC          R1                  ;地址減1
  475.         CJNE         A,XSHC2,DHW7        ;與顯示緩存2不相同就轉(zhuǎn)移,立即顯示
  476.         MOV          A,HMJS              ;都相同,裝入(10)毫秒時間計數(shù)
  477.         CJNE         A,#99,DHW6        ;不是99就轉(zhuǎn)移
  478.         LJMP         DHW7              ;是,顯示(每0.5秒顯示一次)
  479. DHW5:        RET
  480. DHW6:
  481.         CJNE         A,#49,DHW5         ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  482. DHW7:
  483.         INC          R1                ;地址加1
  484.         MOV          A,@R1             ;裝入數(shù)據(jù)碼反碼
  485.         MOV          XSHC2,A           ;放入緩存2
  486.         DEC          R1                ;地址減1
  487.         MOV          A,@R1             ;裝入數(shù)據(jù)碼碼
  488.         MOV          XSHC1,A           ;放入緩存1
  489.         MOV          R0,#ZXM1          ;待發(fā)送TM1637區(qū)1
  490.         LCALL        HEX              ;查表獲取字形碼
  491.         MOV         A,@R1            ;裝入數(shù)據(jù)碼反碼
  492.         LCALL        HEX              ;查表獲取字形碼
  493.         LCALL        disp              ;顯示
  494.         RET
  495. ;---------------------------------
  496. HEX:
  497.         PUSH        ACC
  498.         SWAP        A                ;高低半字節(jié)交換
  499.         ANL        A,#0FH                ;邏輯與運算
  500.         LCALL        BCD1               ;查表獲取字形碼放到待發(fā)送TM1637區(qū)
  501.         INC        R0                ;地址加1
  502.         POP        ACC
  503.         ANL        A,#0FH                ;邏輯與運算
  504.         LCALL        BCD1               ;查表獲取字形碼放到待發(fā)送TM1637區(qū)
  505.         INC        R0                ;地址加1
  506.         INC        R1                ;地址加1
  507.         RET
  508. ;---------------------------------
  509. BCD:
  510.         MOV          B,#10            ;轉(zhuǎn)換為BCD碼
  511.         DIV          AB               ;轉(zhuǎn)換為BCD碼
  512.         PUSH        DPL
  513.         PUSH        DPH
  514.         MOV          DPTR,#SEGTAB        ;查表獲取字形碼
  515.         MOVC         A,@A+DPTR        ;查表獲取字形碼
  516.         POP        DPH
  517.         POP        DPL
  518.         MOV          @R0,A            ;字形碼放入待發(fā)送TM1637區(qū)
  519.         INC          R0               ;地址加1
  520.         XCH          A,B              ;A、B寄存器內(nèi)容交換
  521. BCD1:
  522.         PUSH        DPL
  523.         PUSH        DPH
  524.         MOV          DPTR,#SEGTAB        ;查表獲取字形碼
  525.         MOVC         A,@A+DPTR        ;查表獲取字形碼
  526.         POP        DPH
  527.         POP        DPL
  528.         MOV          @R0,A            ;字形碼放入待發(fā)送TM1637區(qū)
  529.         RET

  530. ;************** 關(guān)閉T1中斷的顯示功能,顯示“----”**************
  531. HENGX:
  532.         SETB        XSKG                ;“顯示開關(guān)”置為1,關(guān)閉T1中斷的顯示功能
  533.         MOV        ZXM1,#40H        ;顯示“----”
  534.         MOV        ZXM2,#40H
  535.         MOV        ZXM3,#40H        ;顯示“----”
  536.         MOV        ZXM4,#40H
  537.         LJMP        disp0

  538. ;---------- 發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示,地址自動加1 ----------
  539. disp:
  540.         MOV          A,FWBZ0          ;裝入復(fù)位提示(閃爍顯示)秒計數(shù)
  541.         JZ           disp0                  ;如果是0(未發(fā)生復(fù)位)就轉(zhuǎn)移
  542.         JNB          SSBZ,disp0        ;已經(jīng)發(fā)生復(fù)位,“閃爍標志”為0(閃爍顯示中的“顯示”狀態(tài))就轉(zhuǎn)移
  543.         CLR          A               ;處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼(0)
  544.         MOV          ZXM1,A          ;放入消隱碼
  545.         MOV          ZXM2,A          ;放入消隱碼
  546.         MOV          ZXM3,A          ;放入消隱碼
  547.         MOV          ZXM4,A          ;放入消隱碼
  548. disp0:
  549.         LCALL        Srt
  550.         MOV          A,#040H          ;數(shù)據(jù)命令設(shè)置40H:地址自動加1,寫數(shù)據(jù)到顯示寄存器
  551.         LCALL        Writebyte        ;發(fā)送一個字節(jié)
  552.         LCALL        Stop
  553.         NOP
  554.         LCALL        Srt
  555.         MOV          A,#0C0H          ;地址命令設(shè)置C0H:初始地址為00H
  556.         LCALL        Writebyte        ;發(fā)送一個字節(jié)
  557.         MOV          R6,#4            ;發(fā)送4個字節(jié)數(shù)據(jù)
  558.         MOV          R1,#ZXM1         ;等待發(fā)送的字形碼始址
  559. disp1:
  560.         MOV          A,@R1            ;裝入要發(fā)送的字形碼
  561.         LCALL        Writebyte        ;發(fā)送一個字節(jié)
  562.         INC          R1               ;地址加1
  563.         DJNZ        R6,disp1            ;如果還未發(fā)送完就繼續(xù)
  564.         LCALL        Stop
  565.         LCALL        Srt
  566.         MOV          A,SMGLD          ;裝入設(shè)置的數(shù)碼管亮度(1~8)
  567.         ADD          A,#087H          ;加上87H后即為對應(yīng)的亮度控制命令88H~8FH
  568.         LCALL        Writebyte        ;按設(shè)置的亮度開顯示
  569.         LCALL         Stop
  570.         RET

  571. ;----- 發(fā)送8bit(一個字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開始 -----
  572. Writebyte:
  573.         MOV         R7,#8             ;發(fā)送8位數(shù)據(jù)
  574. WBY1:
  575.         CLR         CLK               ;拉低CLK
  576.         JNB         ACC.0,WBY2        ;A寄存器的低位(0位)如果為0就轉(zhuǎn)移
  577.         SETB        DIO                ;為1,拉高DIO
  578.         SJMP        WBY3
  579. WBY2:
  580.         CLR         DIO             ;為0,拉低DIO
  581. WBY3:
  582.         MOV         R4,#13           ;延時
  583.         DJNZ        R4,$                 ;延時
  584.         SETB        CLK             ;拉高CLK
  585.         CLR         C               ;進位標志清0
  586.         RRC         A               ;A寄存器內(nèi)容帶進位循環(huán)右移
  587.         DJNZ        R7,WBY1         ;如果還未發(fā)送完8bit數(shù)據(jù)就繼續(xù)
  588.         CLR         CLK             ;8位數(shù)據(jù)發(fā)送完了
  589.         MOV         R7,#20          ;設(shè)置等待應(yīng)答信號延時計數(shù)
  590. WBY5:
  591.         JNB         DIO,WBY6        ;判斷TM1637發(fā)過來的ACK應(yīng)答信號,應(yīng)答就轉(zhuǎn)移(0,低電平)
  592.         DJNZ        R7,WBY5            ;
  593. WBY6:
  594.         MOV         R4,#13                 ;延時
  595.         DJNZ        R4,$                ;延時
  596.         SETB         CLK             ;拉高CLK
  597.         MOV         R4,#13                 ;延時
  598.         DJNZ        R4,$                ;延時
  599.         RET         

  600. ;------------------ Start子程序 ------------------
  601. Srt:
  602.         SETB         DIO             ;拉高DIO
  603.         SETB         CLK             ;拉高CLK
  604.         MOV         R4,#13          ;延時
  605.         DJNZ        R4,$                ;延時
  606.         SETB         DIO             ;拉高DIO
  607.         MOV         R4,#13          ;延時
  608.         DJNZ        R4,$                ;延時
  609.         CLR         DIO             ;拉低DIO
  610.         MOV         R4,#13          ;延時
  611.         DJNZ        R4,$                ;延時
  612.         CLR         CLK             ;拉低CLK
  613.         RET         

  614. ;------------------ Stop子程序 ------------------
  615. Stop:
  616.         CLR         CLK
  617.         MOV         R4,#30
  618.         DJNZ        R4,$
  619.         CLR         DIO
  620.         MOV         R4,#30
  621.         DJNZ        R4,$
  622.         SETB        CLK
  623.         MOV         R4,#40
  624.         DJNZ        R4,$
  625.         SETB        DIO
  626.         MOV         R4,#30
  627.         DJNZ        R4,$
  628.         CLR         CLK
  629.         CLR         DIO
  630.         RET         

  631. ;********************** 以下為EEPROM操作子程序 **********************
  632. ;STC8G1K08有4K的EEPROM,共8個扇區(qū),
  633. ;第1扇區(qū):0000H~01FFH;第2扇區(qū):0200H~03FFH……
  634. ;----------------------------------------------------
  635. ;
  636. ;------- 讀EEPROM保存的各項設(shè)置,如果沒有就保存當(dāng)前的設(shè)置值 ---------
  637. REEP:
  638.         LCALL        RE00              ;讀EEPROM
  639.         JNC        WEEP                ;無數(shù)據(jù)(C=0)就轉(zhuǎn)移,保存當(dāng)前的設(shè)置值
  640.         RET
  641. WEEP:
  642.         LCALL        BCJDQ                ;全功率驅(qū)動繼電器保持至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
  643.         MOV          IAP_ADDRH,#00H        ;第一個扇區(qū)地址的高8位
  644.         MOV          IAP_ADDRL,#00H        ;第一個扇區(qū)地址的低8位
  645.         LCALL        Sector_Erase        ;擦除整個扇區(qū)
  646.         MOV          R1,#FWBZ1           ;首地址
  647.         MOV          R2,#30              ;共寫入20個字節(jié)
  648. WEEP1:
  649.         MOV          A,@R1                ;裝入R1指向的RAM地址的內(nèi)容到A
  650.         LCALL        Byte_Program         ;寫入EEPROM
  651.         INC          IAP_ADDRL            ;EEPROM地址加1
  652.         INC          R1                   ;RAM地址增1
  653.         DJNZ         R2,WEEP1             ;未保存完就轉(zhuǎn)移繼續(xù)
  654.         MOV          IAP_ADDRL,#0         ;保存完了,扇區(qū)地址低位指向0(當(dāng)前扇區(qū)首址)
  655.         LCALL        Byte_Read            ;讀出來檢查看是否寫入成功
  656.         CJNE         A,FWBZ1,WEEP3        ;如果與EEPROM數(shù)據(jù)判斷標志1不相同就轉(zhuǎn)移
  657.         INC          IAP_ADDRL            ;EEPROM地址加1
  658.         LCALL        Byte_Read            ;讀第二個字節(jié)
  659.         CJNE         A,FWBZ2,WEEP3        ;如果與EEPROM數(shù)據(jù)判斷標志2不相同就轉(zhuǎn)移
  660.         RET                        ;成功了,退出
  661. WEEP3:
  662.         SETB        XSKG                ;“顯示開關(guān)”置為1,關(guān)閉T1中斷的顯示功能
  663.         MOV          MJS,#5            ;顯示5秒E1
  664.         MOV          ZXM1,#0           ;消隱碼
  665.         MOV          ZXM2,#079H        ;E
  666.         MOV          ZXM3,#006H        ;1
  667.         MOV          ZXM4,#0           ;消隱碼
  668.         LCALL        DISP              ;顯示
  669. WEEP4:
  670.         MOV          A,MJS
  671.         JNZ          WEEP4             ;等待MJS為0秒
  672.         RET

  673. ;;---------- 讀EEPROM保存的各項設(shè)置 ----------
  674. RE00:
  675.         LCALL        BCJDQ                ;全功率驅(qū)動繼電器保持至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
  676.         MOV          IAP_ADDRH,#00H        ;第一個扇區(qū)地址的高8位
  677.         MOV          IAP_ADDRL,#00H        ;第一個扇區(qū)地址的低8位
  678.         LCALL        Byte_Read           ;讀第一個字節(jié),返回:A=讀出的數(shù)據(jù)
  679.         CJNE         A,FWBZ1,RE02        ;如果不是原來保存的數(shù)據(jù)就轉(zhuǎn)移
  680.         INC          IAP_ADDRL           ;EEPROM字節(jié)地址增1
  681.         LCALL        Byte_Read           ;讀第二個字節(jié)
  682.         CJNE         A,FWBZ2,RE02        ;如果不是原來保存的數(shù)據(jù)就轉(zhuǎn)移
  683.         MOV          R1,#FWBZ2           ;從FWBZ2+1處開始放置讀出的設(shè)置值
  684.         MOV          R2,#28              ;再讀出28個字節(jié)
  685. RE01:
  686.         INC          R1                  ;RAM地址增1
  687.         INC          IAP_ADDRL           ;EEPROM字節(jié)地址增1
  688.         LCALL        Byte_Read           ;讀一個字節(jié),返回:A=讀出的數(shù)據(jù)
  689.         MOV          @R1,A               ;放到R1指向的RAM地址
  690.         DJNZ         R2,RE01             ;未讀完就繼續(xù)
  691.         SETB        C                ;把C置為1,讀取成功
  692.         RET
  693. RE02:
  694.         CLR        C                ;把C置為0,沒有數(shù)據(jù)
  695.         RET

  696. ;-------------------------------
  697. ;EEPROM操作需要數(shù)毫秒以上,期間MCU會暫停,PWM停止。
  698. ;全功率驅(qū)動使繼電器保持吸合狀態(tài)至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
  699. BCJDQ:
  700.         LCALL        SETPWM          ;設(shè)置“延時PWM驅(qū)動”時間
  701.         SETB        EEPBC                ;“EEPROM操作子程序調(diào)用”標志置為1,使T0中斷暫停執(zhí)行繼電器控制程序
  702.           LCALL        CTL00                ;控制繼電器
  703.         CLR        EEPBC                ;標志置為0
  704.         RET

  705. ;-------------------------------
  706. ;讀一個字節(jié),A=讀出的數(shù)據(jù)
  707. Byte_Read:
  708.         MOV        IAP_CONTR,#80H                ;打開IAP功能
  709.         MOV        IAP_TPS,#12                ;設(shè)置等待參數(shù)
  710.         MOV        IAP_CMD,#01                  ;設(shè)置IAP讀命令
  711.         MOV        IAP_TRIG,#05AH               ;觸發(fā)命令
  712.         MOV        IAP_TRIG,#0A5H               ;觸發(fā)命令
  713.         NOP
  714.         MOV        A,IAP_DATA                   ;讀出的數(shù)據(jù)在IAP_DATA,送入累加器A
  715.         RET

  716. ;-------------------------------
  717. ;字節(jié)編程,A=需寫入的數(shù)據(jù)
  718. Byte_Program:
  719.         MOV        IAP_CONTR,#80H                ;打開IAP功能
  720.         MOV        IAP_TPS,#12                ;設(shè)置等待參數(shù)
  721.         MOV        IAP_CMD,#02                  ;設(shè)置IAP寫命令
  722.         MOV        IAP_DATA,A                   ;要寫入的數(shù)據(jù)先送進IAP_DATA寄存器
  723.         MOV        IAP_TRIG,#05AH               ;觸發(fā)命令
  724.         MOV        IAP_TRIG,#0A5H               ;觸發(fā)命令
  725.         RET

  726. ;-------------------------------
  727. ;擦除扇區(qū)
  728. Sector_Erase:
  729.         MOV        IAP_CONTR,#80H                ;打開IAP功能
  730.         MOV        IAP_TPS,#12                ;設(shè)置等待參數(shù)
  731.         MOV        IAP_CMD,#03                  ;設(shè)置IAP擦除命令
  732.         MOV        IAP_TRIG,#05AH               ;觸發(fā)命令
  733.         MOV        IAP_TRIG,#0A5H               ;觸發(fā)命令
  734.         RET

  735. ;************************* 以上為EEPROM操作子程序 ***************************
  736. ;
  737. ;1~15檔控制碼:
  738. DAB1: DB 0FEH,0FDH,0FBH,0FAH,0F9H,0F8H,0F4H,0F2H,0F1H,0F0H,0E4H,0E2H,0E1H,0E0H,0DFH
  739. ;
  740. ;------------------ 字形表 ------------------
  741. SEGTAB:
  742.         DB  00111111B  ;0(3FH)
  743.         DB  00000110B  ;1(06H)
  744.         DB  01011011B  ;2(5BH)
  745.         DB  01001111B  ;3(4FH)
  746.         DB  01100110B  ;4(66H)
  747.         DB  01101101B  ;5(6DH)
  748.         DB  01111101B  ;6(7DH)
  749.         DB  00000111B  ;7(07H)
  750.         DB  01111111B  ;8(7FH)
  751.         DB  01101111B  ;9(6FH)
  752.         DB  01110111B  ;A(77H)
  753.         DB  01111100B  ;B(7CH)
  754.         DB  00111001B  ;C(39H)
  755.         DB  01011110B  ;D(5EH)
  756.         DB  01111001B  ;E(79H)
  757.         DB  01110001B  ;F(71H)

  758. ;---------------------------------------------

  759.         END
復(fù)制代碼

回復(fù)

使用道具 舉報

板凳
ID:262 發(fā)表于 2022-11-7 00:44 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

地板
ID:584814 發(fā)表于 2022-11-9 11:17 | 只看該作者
感覺能用匯編的都是牛人。如此詳細的注釋更牛
膜拜中學(xué)習(xí)了 ...
回復(fù)

使用道具 舉報

5#
ID:888585 發(fā)表于 2022-11-10 10:19 | 只看該作者
一開始沒有仔細看,定睛一看是匯編,牛
回復(fù)

使用道具 舉報

6#
ID:1051908 發(fā)表于 2022-11-14 15:36 | 只看該作者
繼電器還有一種叫固態(tài)繼電器,你可以參考一下。
回復(fù)

使用道具 舉報

7#
ID:230742 發(fā)表于 2022-11-15 11:46 | 只看該作者
匯編。膜拜大佬。
其實最好用的,還是可控硅。我修過一個可以遙控的電風(fēng)扇,就是可控硅控制的。不過是簡單的用法。4個TO-92封裝的小可控硅,控制電機的3個轉(zhuǎn)速。繼電器應(yīng)該算是下下策了,都已經(jīng)是智能控制了。在加個陣風(fēng)模式,繼電器豈不是壞得更快。
論壇里有很多單片機控制可控硅調(diào)光、調(diào)速、調(diào)溫的例子,可以參考一下。一兩千瓦都可以的可控硅,控制個電風(fēng)扇才幾十瓦,應(yīng)該沒啥問題。
回復(fù)

使用道具 舉報

8#
ID:1009477 發(fā)表于 2022-11-22 00:03 | 只看該作者
感覺能用匯編的都是牛人
回復(fù)

使用道具 舉報

9#
ID:430492 發(fā)表于 2022-11-23 14:13 | 只看該作者
5旬不能算老漢吧,現(xiàn)在得算中年人,60以上才能算老人。
回復(fù)

使用道具 舉報

10#
ID:336378 發(fā)表于 2022-11-25 17:19 | 只看該作者
這個程序估計沒幾個人要下載去研究,畢經(jīng)要過繪編這關(guān)。樓主還是牛。功基好。
回復(fù)

使用道具 舉報

11#
ID:1009425 發(fā)表于 2022-12-21 17:21 | 只看該作者
牛人,匯編程序也能寫這么長,花了不少精力才能弄出來
回復(fù)

使用道具 舉報

12#
ID:651494 發(fā)表于 2022-12-22 16:41 | 只看該作者
看到一堆MOV,JUMP,好熟悉的感覺!
回復(fù)

使用道具 舉報

13#
ID:1064915 發(fā)表于 2023-8-21 09:28 | 只看該作者
不定期損壞可控硅,估計是沒有過零檢測
回復(fù)

使用道具 舉報

14#
ID:468209 發(fā)表于 2023-8-21 22:28 來自手機 | 只看該作者
已前機械按鈕轉(zhuǎn)鈕的風(fēng)扇就做過微風(fēng)檔  接法也很簡單 就是一個1.2uF的風(fēng)扇電容接在定時器就可了   當(dāng)定時到了 線路斷開 電流會在電容通過 這樣定時到了就進入微風(fēng)檔了  現(xiàn)在的都是電子遙控風(fēng)扇加上有空調(diào)就懶得弄了 也很麻煩基本上要從新做控制電路
回復(fù)

使用道具 舉報

15#
ID:23844 發(fā)表于 2023-10-21 12:01 | 只看該作者
可以借鑒樓主的電路與想路,用C語言來仿制一個.匯編不好移植另不是大神級別難看懂
回復(fù)

使用道具 舉報

16#
ID:868302 發(fā)表于 2023-10-24 13:59 | 只看該作者
牛人啊,匯編還這么流程
回復(fù)

使用道具 舉報

17#
ID:890642 發(fā)表于 2024-8-28 20:21 來自手機 | 只看該作者
牛逼人物
回復(fù)

使用道具 舉報

18#
ID:89300 發(fā)表于 2024-9-16 13:48 | 只看該作者
大爺牛逼。匯編只看懂點點!
回復(fù)

使用道具 舉報

19#
ID:712493 發(fā)表于 2024-9-16 21:06 | 只看該作者
hdtd121 發(fā)表于 2022-11-22 00:03
感覺能用匯編的都是牛人

不涉及計算的話,匯編不復(fù)雜的!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲夜射 | 欧美不卡视频一区发布 | av 一区二区三区 | 亚洲成人精品久久久 | 毛片电影 | 国产在线拍偷自揄拍视频 | 欧美亚洲一区二区三区 | 我要看免费一级毛片 | 三极网站 | 亚洲品质自拍视频 | 久久久久九九九女人毛片 | 日韩av高清 | 欧美成人一区二免费视频软件 | www.夜夜骑.com| 久久精品国产亚洲一区二区三区 | 日韩综合在线播放 | 亚洲视频中文字幕 | 亚洲综合在线视频 | 中文字幕爱爱视频 | 一区二区三区四区在线视频 | 中文字幕亚洲一区 | 精品久久久久久一区二区 | 国产亚洲精品久久午夜玫瑰园 | 在线欧美亚洲 | 亚洲国产精品一区二区三区 | 久久精品在线免费视频 | 日韩成人精品在线 | 国产精品入口久久 | 嫩草视频在线免费观看 | 97久久精品午夜一区二区 | 国产精品18久久久久久白浆动漫 | 欧美综合久久 | 亚洲 欧美 日韩在线 | 欧美久久久网站 | 国产亚洲一区二区在线观看 | 久干网| 国产丝袜一区二区三区免费视频 | 美女高潮网站 | 色资源站| 久久99视频免费观看 | 国产电影一区二区三区爱妃记 |