数码之家

 找回密码
 立即注册
搜索
查看: 6591|回复: 209

[C51] 五旬老汉学编程:红外遥控电容调速电风扇控制器(详细汇编注解)

    [复制链接]
发表于 2022-8-16 03:51:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
制作这个风扇控制器主要是有时需要非常小的微风,特别是睡觉的时候,其次是年纪大了不容易睡着,想要定时久点,至少2小时以上。两年前制作过一个风扇控制器,不是特别好用,现在用电容做调速,效果不错运行很静没有噪音。原打算用可控硅控制,无奈试了几种电路形式都会不定期损坏可控硅,甚至有过几次一插电就击穿,只好放弃,改用继电器控制,继电器的缺点是吸合/断开有哒哒响的声音,所以先全功率驱动继电器,延时一定时间后使用PWM方式驱动保持吸合状态,降低功耗减少发热量,这样就可以用隔音材料把它包起来,减小哒哒响的声音。PWM频率过低会听到继电器线圈产生的噪音,所以定为人耳可听范围的上限20KHz,占空比50%,实测驱动电流为30%左右,能保持吸合状态,在继电器线圈并联一只104电容后驱动电流为50%左右,为了稳定可靠,保留继电器线圈并联的104电容,经测试未感觉到继电器有明显升温。遥控可使用家里闲置的遥控器,只要能解码都可以使用,或花几块钱网购一个风扇遥控器。

电路原理图.jpg
KZQ2.jpg
KZQ1.jpg
KZQ3.jpg
KZQ4.jpg
KZQ5.jpg
YK.jpg


汇编程序源代码:
电风扇-电容调速.rar (90.28 KB, 下载次数: 15)

  1. ;=======================================
  2. ;红外遥控电容调速长定时电风扇控制器
  3. ;STC8G1K08(DIP16或SOP16)+TM1637显示模块+EC11编码器+CBB电容
  4. ;杨小强,2022年8月
  5. ;内部R/C时钟,频率选择:11.0592MHz
  6. ;显示:(TM1637)4位数码管显示模块
  7. ;调整定时、档位:EC11带按键5脚旋转编码器。也可以用3只按键代替EC11编码器
  8. ;
  9. ;工作时先全功率驱动继电器,延时一定时间后转为PWM方式驱动,以降低功耗减少发热量,
  10. ;PWM周期25微秒*2=50微秒,频率20KHz占空比50%,继电器线圈并联一只104电容,驱动电流降低到50%左右
  11. ;保持吸合状态。
  12. ;如果使用可控硅控制就取消主程序中初始化部分的“SETB PWM”指令,或改为“CLR PWM”(禁止PWM驱动)
  13. ;
  14. ;EC11编码器按键、旋转动作:
  15. ; 1.旋转编码器:对当前显示的“定时时间”或“档位”作增(减)调整
  16. ; 2.短按1次:正常风与自然风(睡眠风)切换。自然风状态时LED指示灯亮,只显示定时时间。
  17. ; 3.短按2次:设置自然风(睡眠风)渐慢/渐快变化的上下限档位范围、各档位变化的间隔时间(秒)
  18. ; 4.长按10秒:显示“----”,红外遥控信号解码,遥控器按键功能定义。定义好后须长按10秒才保存
  19. ;
  20. ;短按编码器按键2次设置自然风(睡眠风)渐慢/渐快变化的上下限档位范围、档位变化的间隔时间(秒):
  21. ; 1.显示:L-最低档位下限,旋转编码器加/减,上、下限档位之间最少间隔3档。
  22. ; 2.显示:H-最高档位上限,旋转编码器加/减,上、下限档位之间最少间隔3档。
  23. ; 3.显示:E-档位渐慢/渐快变化时的间隔时间(1~5秒),旋转编码器加/减
  24. ;设置好一项,短按编码器按键或者闪烁5秒无操作,自动跳到下一项。
  25. ;短按2次编码器按键保存并退出,或在第3项时无操作闪烁5秒自动保存并退出。
  26. ;
  27. ;长按10秒显示“----”进入红外遥控器的按键定义:
  28. ;定义1“关”、2“开/风速”、3“定时”、4“自然风”、5“+”、6“-”六个功能键。
  29. ;    交替显示功能编号+遥控器客户码(不显示反码)和原来保存的按键值,按键值为数据码+数据码反码
  30. ;共4个十六进制数,按下遥控器按键收到信号解码成功并显示,即为新的按键值,遥控器客户码与原来保
  31. ;存的不相同时,自动删除旧的数据(保存才会生效),短按跳到下一个功能编号,也可以旋转EC11编码器
  32. ;向前/后跳到任意编号,全部或部分定义好后,长按10秒编码器按键显示“----”保存并退出才生效,
  33. ;短按两次退出或60秒无操作自动退出,不保存,仍然还是原来的数据。
  34. ;
  35. ;1“关”键:定时时间清零,关风扇
  36. ;2“开/风速”键:当定时时间为零时,置上电默认定时时间,开风扇;定时时间不为零时,档位
  37. ;                加1,到最高档后又从1档开始循环,支持长按连续加;自然风(睡眠风)状态时
  38. ;                不能调整档位。
  39. ;3“定时”键:增加定时时间。风扇在关的状态时,增加定时时间立即开风扇。
  40. ;4“自然风”键:正常风与自然风(睡眠风)切换,自然风(睡眠风)状态时LED指示灯亮,只显示定时时间。
  41. ;5“+”键:对当前显示的“定时时间”或“档位”作增加调整,支持长按连续加。
  42. ;6“-”键:对当前显示的“定时时间”或“档位”作减少调整,支持长按连续减。
  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脚,自然风LED指示灯,低电平亮
  54. ;P3.7----16脚,红外接收头
  55. ;
  56. ;各档档位控制码及对应的电容容量:
  57. ;01档:控制码FEH,P3.0控制的继电器导通,电容容量1uF
  58. ;02档:控制码FDH,P3.1控制的继电器导通,电容容量2.2uF
  59. ;03档:控制码FBH,P3.2控制的继电器导通,电容容量3.3uF
  60. ;04档:控制码FAH,P3.0、P3.2控制的继电器导通,电容容量1uF+3.3uF=4.3uF
  61. ;05档:控制码F9H,P3.1、P3.2控制的继电器导通,电容容量2.2uF+3.3uF=5.5uF
  62. ;06档:控制码F8H,P3.0、P3.1、P3.2控制的继电器导通,电容容量1uF+2.2uF+3.3uF=6.5uF
  63. ;07档:控制码F4H,P3.0、P3.1、P3.3控制的继电器导通,电容容量1uF+2.2uF+4.7uF=7.9uF
  64. ;08档:控制码F2H,P3.0、P3.2、P3.3控制的继电器导通,电容容量1uF+3.3uF+4.7uF=9uF
  65. ;09档:控制码F1H,P3.1、P3.2、P3.3控制的继电器导通,电容容量2.2uF+3.3uF+4.7uF=10.2uF
  66. ;10档:控制码F0H,P3.0、P3.1、P3.2、P3.3控制的继电器导通,电容容量1uF+2.2uF+3.3uF+4.7uF=11.2uF
  67. ;11档:控制码E4H,P3.0、P3.1、P3.3、P3.4控制的继电器导通,电容容量1uF+2.2uF+4.7uF+4.7uF=12.6uF
  68. ;12档:控制码E2H,P3.0、P3.2、P3.3、P3.4控制的继电器导通,电容容量1uF+3.3uF+4.7uF+4.7uF=13.7uF
  69. ;13档:控制码E1H,P3.1、P3.2、P3.3、P3.4控制的继电器导通,电容容量2.2uF+3.3uF+4.7uF+4.7uF=14.9uF
  70. ;14档:控制码E0H,P3.0、P3.1、P3.2、P3.3、P3.4控制的继电器导通,电容容量1uF+2.2uF+3.3uF+4.7uF+4.7uF=15.9uF
  71. ;15档:控制码DFH,P3.5控制的继电器导通,直通。
  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脚,自然风状态LED指示灯,低电平亮
  87.         IR        EQU        P3.7        ;16脚,红外接收头
  88.         BUZZER        EQU        P5.5        ;7脚,无源蜂鸣器

  89. ;---------------------------- 位地址及RAM的使用 ----------------------------
  90. BMQDZ        BIT        20H.0        ;编码器动作,1=编码器有旋转动作;0=没有旋转动作
  91. XZFX        BIT        20H.1        ;旋转方向,1=编码器顺时针正转;0=编码器逆时针反转
  92. FLQH        BIT        20H.2        ;风类切换,1=自然风(睡眠风);0=正常风
  93. TSFX        BIT        20H.3        ;调速方向,1=渐快;0=渐慢。自然风渐变控制时的调速方向。
  94. YSBC        BIT        20H.4        ;延时保存,1=在MJS倒计时结束时保存档位。
  95. SSBZ        BIT        20H.5        ;闪烁标志,1=不显示,0=显示,数字及冒号闪烁时用,每0.5秒变化一次。
  96. XSNRXZ        BIT        20H.6        ;显示内容选择,1=显示档位;0=显示定时时间。
  97. XSKG        BIT        20H.7        ;显示开关,1=关闭T1中断的显示功能,0=允许显示定时和档位等内容
  98. XSQHY        BIT        21H.0        ;显示切换1,1=显示自然风档位变化范围或红外解码显示;0=显示档位或定时。
  99. XSQHE        BIT        21H.1        ;显示切换2,1=显示自然风档位变化范围;0=红外遥控信号解码显示。设置时用
  100. BMXSQH        BIT        21H.2        ;编码显示切换,1=显示数据码+反码;0=显示功能编号+系统码。设置时用
  101. PWM        BIT        21H.3        ;1=使用PWM方式驱动;0=禁止PWM驱动
  102. PWMBZ        BIT        21H.4        ;PWM的电平状态标志,1=高电平,0=低电平。PWM周期25微秒*2=50微秒,20KHz占空比50%
  103. EEPBC        BIT        21H.5        ;EEPROM操作子程序调用标志,1=EEPROM操作子程序正在调用继电器控制程序

  104. FWBZ0         EQU        022H          ;闪烁显示时长(秒)。受干扰等原因导致复位时闪烁10秒
  105. DSSJS         EQU        023H          ;定时时间,时
  106. DSSJF         EQU        024H          ;定时时间,分
  107. DSSJM         EQU        025H          ;定时时间,秒
  108. SMGLD         EQU        026H          ;数码管亮度,1~8级
  109. DSDWJG         EQU        027H          ;上电设置的定时与档位交替显示的间隔时间(秒)
  110. DSDW         EQU        028H          ;运行时使用,定时与档位交替显示的间隔时间(秒)
  111. SMFJG2         EQU        029H          ;运行时使用,自然风(睡眠风)档位变化的间隔时间(秒)
  112. DANGW         EQU        02AH          ;运行时使用,自然风(睡眠风)变化时的实时档位
  113. XMBH         EQU        02BH          ;项目编号,设置时使用
  114. HM           EQU        02CH          ;毫秒,每毫秒减1,为0后重新放入计数值。定时器1使用,时间、显示处理
  115. SHMJS         EQU        02DH          ;(10)毫秒倒计时,每10毫秒减1,直到为0
  116. HMJS         EQU        02EH          ;(10)毫秒计数,为0后重新放入99(1秒)
  117. MJS           EQU        02FH          ;秒计数,每秒减1,直到为0,主程序使用
  118. XSHC1         EQU        030H          ;显示缓存1,与上次不同就立即显示,否则0.5秒显示一次
  119. XSHC2         EQU        031H          ;显示缓存2,与上次不同就立即显示,否则0.5秒显示一次
  120. ZXM1          EQU        032H          ;显示用,待发送到TM1637的字形码1
  121. ZXM2          EQU        033H          ;显示用,待发送到TM1637的字形码2
  122. ZXM3          EQU        034H          ;显示用,待发送到TM1637的字形码3
  123. ZXM4          EQU        035H          ;显示用,待发送到TM1637的字形码4
  124. MA1          EQU        036H          ;接收到的红外遥控系统码(客户码)
  125. MA2          EQU        037H          ;接收到的红外遥控系统码(客户码)反码
  126. MA3          EQU        038H          ;接收到的红外遥控数据码
  127. MA4          EQU        039H          ;接收到的红外遥控数据码反码
  128. HWJS         EQU        03AH          ;每10毫秒减1,直到为0,为0时清除“接收到的红外遥控数据码”,防止接收到别的连续码产生误动作。
  129. ZRFJG         EQU        03BH          ;1:自然风变化时的档位下限;2=档位上限;3=档位变化的间隔时间。设置时用
  130. FENGMQ        EQU        03CH          ;蜂鸣器鸣响时长(*10毫秒),每10毫秒减1直到为0,0=蜂鸣器不响
  131. ZDJS         EQU        03DH          ;中断计数,蜂鸣器处理用
  132. YSPWM        EQU        03EH          ;延时PWM驱动(*10毫秒),先全功率驱动继电器,每10毫秒减1,为0时转为PWM方式驱动

  133. FWBZ1         EQU        03FH          ;复位判断标志1,也作EEPROM数据判断标志
  134. FWBZ2         EQU        040H          ;复位判断标志2,也作EEPROM数据判断标志
  135. DANG_G         EQU        041H          ;自然风(睡眠风)变化时的档位上限
  136. DANG_D         EQU        042H          ;自然风(睡眠风)变化时的档位下限
  137. SMFJG         EQU        043H          ;自然风(睡眠风)档位变化的间隔时间(秒)
  138. DANG         EQU        044H          ;正常风档位
  139. ANJZ         EQU        045H          ;红外遥控编码首地址,系统码(客户码),6个键的数据码+数据码反码使用此地址后面12个字节


  140. ;--------------- 辅助寄存器、EEPROM寄存器地址 ---------------
  141. AUXR              EQU 08EH          ;辅助寄存器
  142. IAP_DATA          EQU 0C2H          ;数据寄存器,读出、写入的数据放在此处
  143. IAP_ADDRH         EQU 0C3H          ;地址寄存器高八位
  144. IAP_ADDRL         EQU 0C4H          ;地址寄存器低八位
  145. IAP_CMD           EQU 0C5H          ;命令寄存器,0=关闭,1=读,2=写,3=擦除
  146. IAP_TRIG          EQU 0C6H          ;命令触发寄存器
  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微秒产生一次中断,控制继电器、LED指示灯、蜂鸣器 ---------------
  158. INTT0:
  159.         PUSH         ACC
  160.         PUSH         PSW
  161.         LCALL        Control                ;控制继电器
  162.         JNB        FLQH,INTT01         ;如果“风类切换”是0(正常风)就转移
  163.         CLR        LED                ;是自然风状态,点亮LED指示灯
  164. INTT01:
  165.         CPL        PWMBZ                ;“PWM电平状态标志”取反。PWM周期25微秒*2=50微秒,20KHz占空比50%
  166.         MOV        A,ZDJS                ;中断计数
  167.         JZ        INTT02                ;为0就转移,每5次(25微秒*5=125微秒)执行一次蜂鸣器处理。
  168.         DEC        ZDJS                ;减1
  169.         LJMP        INTT04                ;
  170. INTT02:
  171.         MOV        ZDJS,#4                ;重新放入计数(5次)
  172.         MOV        A,FENGMQ        ;蜂鸣器鸣响时长
  173.         JZ        INTT03                ;如果是0(不响)就转移
  174.         CPL        BUZZER                ;取反,驱动无源蜂鸣器发声。周期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毫秒产生一次中断,时间、显示处理 ---------------
  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                ;出中断时会自动恢复原默认的第0组工作寄存器(R0~R7地址为00H~07H)
  189.         MOV        A,HM                ;毫秒计数
  190.         JZ        INTT10                ;如果是0就转移,每10毫秒执行一次显示、时间处理子程序
  191.         DEC        HM                ;减1
  192.         LJMP        INTT11
  193. INTT10:
  194.         MOV        HM,#9                ;重新放入计数值(10毫秒)
  195.         LCALL        TIME                ;时间处理
  196.         LCALL        DISPLAY                ;显示处理
  197. INTT11:
  198.         POP          PSW
  199.         POP        B
  200.         POP          ACC
  201.         RETI

  202. ;--------------- 定时器T0、T1设置 ----------------
  203. SETINT:        
  204.         ORL        AUXR,#0C0H        ;定时器T0、T1时钟1T模式
  205.         ANL        TMOD,#00H        ;设置定时器T0、T1模式为16位自动重载
  206.         MOV        TL0,#0ECH        ;设置定时0初始值(25微秒)
  207.         MOV        TH0,#0FEH        ;设置定时0初始值(25微秒)
  208.         MOV        TL1,#0CDH        ;设置定时1初始值(1毫秒)
  209.         MOV        TH1,#0D4H        ;设置定时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                ;设置定时器0中断为最高优先级
  217.         SETB        EA                ;允许全局中断
  218.         RET

  219. ;*********************************** 主程序开始 ***********************************
  220. START:
  221.         MOV     P1M0,#00H              ;设置P1为双向口模式
  222.         MOV     P1M1,#00H              ;
  223.         MOV     P3M0,#00H              ;设置P3为双向口模式
  224.         MOV     P3M1,#00H              ;
  225.         MOV     P5M0,#00H              ;设置P5为双向口模式
  226.         MOV     P5M1,#00H              ;
  227.         MOV          SP,#0C0H              ;设置堆栈指针
  228.         MOV          A,FWBZ1               ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
  229.         CJNE         A,#0C8H,START1        ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
  230.         MOV          A,FWBZ2               ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
  231.         CJNE         A,#0D9H,START1        ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
  232.         MOV        FWBZ0,#10        ;放入复位提示,闪烁显示时长(秒)
  233.         LCALL        SETINT                ;定时器设置
  234.         LJMP         START3                ;跳过初始化继续运行
  235. START1:
  236.         CLR          A                     ;初始化,RAM从20H开始清零50H个字节
  237.         MOV          R0,#50H               ;初始化,RAM从20H开始清零50H个字节
  238.         MOV          R1,#20H               ;初始化,RAM从20H开始清零50H个字节
  239. START2:
  240.         MOV          @R1,A                 ;初始化,RAM从20H开始清零50H个字节
  241.         INC          R1                    ;初始化,RAM从20H开始清零50H个字节
  242.         DJNZ         R0,START2             ;
  243.         SETB        PWM                   ;PWM标志置为1,使用PWM方式驱动,如果用可控硅控制就取消这条指令或改为“CLR PWM”(禁止PWM驱动)
  244.         MOV          FWBZ1,#0C8H           ;初始化,放入复位及EEPROM判断标志1到RAM
  245.         MOV          FWBZ2,#0D9H           ;初始化,放入复位及EEPROM判断标志2到RAM
  246.         MOV        FENGMQ,#12         ;上电蜂鸣器响一声,鸣响时长12*10毫秒=120毫秒
  247.         LCALL        SDMRDS                ;置上电默认定时时间
  248.         MOV        SMGLD,#3          ;置数码管亮度为3级(8级亮度最高)
  249.         MOV        DSDWJG,#3        ;定时与档位交替显示的间隔时间(秒)
  250.         MOV        SMFJG,#2        ;睡眠风(自然风)渐慢/渐快档位变化的间隔时间(秒),如果EEPROM保存有设置值,将替换此默认设置
  251.         MOV        DANG,#15        ;正常风档位(1~15),如果EEPROM保存有设置值,将替换此默认设置
  252.         MOV        DANG_G,#5        ;自然风变化时最高档位上限(4~15),如果EEPROM保存有设置值,将替换此默认设置
  253.         MOV        DANG_D,#1        ;自然风变化时最低档位下限(1~12),如果EEPROM保存有设置值,将替换此默认设置
  254.         LCALL        SETINT                ;初始化,定时器设置
  255.         LCALL        REEP                ;读EEPROM保存的各项设置,没有就保存当前的设置值
  256. START3:
  257.         CLR        XSKG                ;“显示开关”置为0,允许T1中断的显示功能
  258.         CLR        XSQHY                ;“显示切换1”置为0,显示档位、定时时间
  259.         LCALL        HWYKCL                ;调用红外遥控处理子程序
  260.         LCALL        SKEY                  ;扫描编码器按键
  261.         JC           START4                ;有按键动作(C=1)就转移
  262.         LCALL        Scan1               ;扫描编码器
  263.         JNB        BMQDZ,START5        ;编码器没有动作(BMQDZ=0)就转移
  264.         LCALL        BMQCL                 ;调用编码器旋转动作处理子程序
  265.         LJMP         START3
  266. START4:
  267.         LCALL        AJDZCL                ;调用按键动作处理子程序
  268.         LJMP         START3
  269. START5:
  270.         JNB        YSBC,START3        ;如果“延时保存”为0(不需保存当前档位值)就转移
  271.         MOV        A,MJS                ;装入倒计时
  272.         JNZ        START3                ;不是0就转移
  273.         CLR        YSBC                ;时间到,“延时保存”置为0
  274.         LCALL        WEEP                ;保存当前档位值
  275.         LJMP         START3

  276. ;*********************************** 主程序结束 ***********************************
  277. ;
  278. ;--------------- 设置上电默认定时 ---------------
  279. SDMRDS:
  280.         MOV        DSSJS,#8        ;小时
  281.         RET

  282. ;--------------- 设置“延时PWM驱动”时间 ---------------
  283. ;先全功率驱动继电器,延时结束后转为PWM方式驱动,降低功耗减少继电器发热量。
  284. ;继电器吸合速度正常为几毫秒至几十毫秒。PWM方式驱动改为禁止后,“延时PWM驱动”无意义
  285. SETPWM:
  286.         MOV        YSPWM,#10          ;延时时间(*10毫秒),10*10=100毫秒
  287.         RET

  288. ;-------------------------------------------------------------------------------
  289. ;红外遥控处理子程序
  290. ;1“关”键:定时时间清零,关风扇
  291. ;2“开/风速”键:定时时间为零时,置上电默认定时时间,开风扇;定时时间不为零时,档位
  292. ;                加1,到最高档后又从1档开始循环,支持长按连续加;
  293. ;                自然风(睡眠风)状态时不能调整档位。
  294. ;3“定时”键:增加定时时间。在关的状态时,增加定时时间立即开风扇。支持长按连续加。
  295. ;4“睡眠”键:正常风与自然风(睡眠风)切换,自然风状态时LED指示灯亮,只显示定时时间。
  296. ;5“+”键:对当前显示的“定时时间”或“档位”作增加调整,支持长按连续加。
  297. ;6“-”键:对当前显示的“定时时间”或“档位”作减少调整,支持长按连续减。
  298. ;-------------------------------------------------------------------------------
  299. HWYKCL:
  300.         LCALL        JIEMA                ;调用红外遥控解码子程序
  301.         JC        YKCL1                ;解码成功(C=1)就转移
  302. YKCL0:
  303.         RET
  304. YKCL1:
  305.         MOV        R5,A                ;解码子程序返回的参数暂时放到R5
  306.         MOV        A,MA1                ;装入当前接收到的系统码到A
  307.         MOV        B,ANJZ                ;装入原来保存的系统码到B
  308.         CJNE        A,B,YKCL0        ;不同就转移退出
  309.         MOV        R0,#ANJZ        ;按键值首地址
  310.         INC        R0                ;地址加1
  311.         MOV        R3,#6                ;共搜索6个按键值
  312.         MOV        R7,#1                ;功能编号
  313. YKCL2:
  314.         MOV        A,MA3                ;装入数据码
  315.         MOV        B,@R0                ;装入原来的数据码
  316.         CJNE        A,B,YKCL3        ;不同就转移,检查下一个
  317.         INC        R0                ;相同,地址加1,检查反码是否相同
  318.         MOV        A,MA4                ;装入数据码反码
  319.         MOV        B,@R0                ;装入数据码反码
  320.         DEC        R0                ;地址减1
  321.         CJNE        A,B,YKCL3        ;不同就转移,检查下一个
  322.         LJMP        YKCL4                ;搜索到了
  323. YKCL3:
  324.         INC        R0                ;地址加1
  325.         INC        R0                ;地址加1
  326.         INC        R7                ;功能编号加1
  327.         DJNZ        R3,YKCL2        ;如果未检查完就转移继续
  328.         RET                        ;未搜索到,退出
  329. YKCL4:
  330.         LCALL        SETPWM          ;设置“延时PWM驱动”时间
  331.         MOV        A,R5                ;解码子程序返回的参数
  332.         JNZ        YKCL41                ;如果是连续码(1)就转移
  333.         MOV        FENGMQ,#12         ;蜂鸣器响一声,12*10毫秒=120毫秒
  334. YKCL41:
  335.         MOV        A,R7                ;功能编号放入A
  336.         CJNE        A,#1,YKCL5        ;不是1(关)就转移
  337.         LCALL        DSSJQL                ;定时时间清零,关风扇
  338.         CLR        XSNRXZ                ;“显示内容选择”置为0,显示定时时间
  339.         RET
  340. YKCL5:
  341.         CJNE        A,#2,YKCL8        ;不是2(开/风速)就转移
  342.         MOV        A,DSSJS                ;检查定时时间是否为0
  343.         JNZ        YKCL6                ;不为0就转移
  344.         MOV        A,DSSJF                ;检查定时时间是否为0
  345.         JNZ        YKCL6                ;不为0就转移
  346.         MOV        A,DSSJM                ;检查定时时间是否为0
  347.         JNZ        YKCL6                ;不为0就转移
  348.         LCALL        SDMRDS                ;是0,放入上电默认定时时间,开风扇
  349.         MOV        SHMJS,#150        ;设置持续按下“开/风速”等待1.5秒才响应连续码
  350.         RET
  351. YKCL6:
  352.         JB          FLQH,YKCL12        ;如果“风类切换”为1睡眠风(自然风)就转移退出
  353.         MOV        A,SHMJS
  354.         JNZ        YKCL12                ;如果时间未到就转移退出,不响应
  355.         MOV        SHMJS,#30        ;设置响应连续码间隔时间(×10毫秒)
  356.         SETB        XSNRXZ                ;“显示内容选择”置为1,显示档位
  357.         MOV        A,DANG                ;装入当前档位值
  358.         CJNE        A,#15,YKCL7        ;不是最高档(15)就转移
  359.         MOV        DANG,#0                ;是,改为0
  360. YKCL7:
  361.         SETB        XZFX                ;“旋转方向”置为1(+)
  362.         LCALL        BMQCL                ;加
  363.         RET
  364. YKCL8:
  365.         CJNE        A,#3,YKCL9        ;不是3(定时)就转移
  366.         MOV        A,SHMJS
  367.         JNZ        YKCL12                ;如果时间未到就转移退出,不响应
  368.         MOV        SHMJS,#30        ;设置响应连续码的间隔时间(×10毫秒)
  369.         CLR        XSNRXZ                ;“显示内容选择”置为0,显示定时时间
  370.         LJMP        YKCL7
  371. YKCL9:
  372.         CJNE        A,#4,YKCL10        ;不是4睡眠风(自然风)就转移
  373.         MOV        A,SHMJS
  374.         JNZ        YKCL12                ;如果时间未到就转移退出,不响应
  375.         MOV        SHMJS,#100        ;设置响应连续码的间隔时间,1秒
  376.         CPL        FLQH                ;“风类切换”取反,正常风/自然风切换
  377.         RET
  378. YKCL10:
  379.         CJNE        A,#5,YKCL11        ;不是5(加+)就转移
  380.         MOV        A,SHMJS
  381.         JNZ        YKCL12                ;如果时间未到就转移退出,不响应
  382.         MOV        SHMJS,#20        ;设置响应连续码的间隔时间(×10毫秒)
  383.         SETB        XZFX                ;“旋转方向”置为1(+)
  384.         LCALL        BMQCL                ;加
  385.         RET
  386. YKCL11:
  387.         MOV        A,SHMJS                ;
  388.         JNZ        YKCL12                ;如果时间未到就转移退出,不响应
  389.         MOV        SHMJS,#20        ;设置响应连续码的间隔时间(×10毫秒)
  390.         CLR        XZFX                ;“旋转方向”置为0(-)
  391.         LCALL        BMQCL                ;减
  392. YKCL12:
  393.         RET

  394. ;--------------------------------------------------------------------------------------------
  395. ;子程序:红外遥控解码
  396. ;出口参数:
  397. ;C=1、A=0:解码成功。
  398. ;C=1、A=1:连续码。
  399. ;系统码(客户码)放在MA1,系统码(客户码)反码放在MA2
  400. ;数据码(按键值)放在MA3,数据码(按键值)反码放在MA4
  401. ;
  402. ;红外接收头实际输出的NEC编码格式:
  403. ;引导码:9ms低电平+4.5ms高电平
  404. ;码0:0.56ms低电平+0.56ms高电平
  405. ;码1:0.56ms低电平+1.68ms高电平
  406. ;结束位:0.56ms低电平
  407. ;单键码:引导码+8位系统码+8位系统码反码+8位数据码+8位数据码反码+结束位
  408. ;连续码:引导码9ms低电平+2.25ms高电平+结束位0.56ms低电平
  409. ;
  410. ;有个别红外遥控器并不是8位系统码+8位系统码反码+8位数据码+8位数据码反码的数据格式,
  411. ;而是这两种情况:
  412. ;一、16位固定的系统码(客户码)+8位数据码+8位数据码反码
  413. ;二、24位固定的系统码(客户码)+8位数据码
  414. ;所以对解码结果不作反码检验
  415. ;
  416. ;43微秒延时子程序的数值是156,因T0中断频率高占用资源,使延时变长,修改为127才能正确解码,
  417. ;如果移植到别的程序,没有过高频率的中断,数值要改回156
  418. ;--------------------------------------------------------------------------------------------
  419. JIEMA:
  420.         JB        IR,JMerr        ;IR为1(高电平)就转移退出,无信号
  421.         MOV        R7,#200                ;检测200次×43微秒=8600微秒(8.6毫秒)
  422. JIEMA1:
  423.         LCALL        DELAY43US        ;延时43微秒
  424.         JB        IR,JMerr        ;如果出现高电平(IR为1)就转移退出,不是有效信号
  425.         DJNZ        R7,JIEMA1        ;重复200次
  426.         MOV        R7,#20                ;未出现高电平,视为有效9毫秒引导码,再检测20次
  427. JIEMA2:
  428.         LCALL        DELAY43US        ;延时43微秒
  429.         JB        IR,JIEMA3        ;如果出现高电平(IR=1)就转移
  430.         DJNZ        R7,JIEMA2        ;重复20次×43微秒=860微秒(0.86毫秒)
  431.         LJMP        JMerr                ;超时,退出,不是有效信号
  432. JIEMA3:
  433.         MOV        HWJS,#50        ;500毫秒计数,为0时清除“接收到的红外遥控数据码”,防止接收到别的连续码产生误动作。
  434.         MOV        R7,#70                ;已变为高电平,9毫秒引导码结束,检测70次共3010微秒
  435. JIEMA4:
  436.         LCALL        DELAY43US        ;延时43微秒
  437.         JNB        IR,LXM                ;出现低电平(IR=0)就视为是2.25毫秒连续码
  438.         DJNZ        R7,JIEMA4
  439.         MOV        R7,#50                ;3.01毫秒内未出现低电平,不是连续码,再检测50次
  440. JIEMA5:
  441.         LCALL        DELAY43US        ;延时43微秒
  442.         JNB        IR,JIEMA6        ;出现低电平(IR=0)就转移,4.5毫秒引导码高电平结束
  443.         DJNZ        R7,JIEMA5        ;重复50次共2150微秒
  444.         LJMP        JMerr                ;超时,退出,不是有效信号
  445. LXM:
  446.         SETB        C                ;是连续码,把C置为1
  447.         MOV        A,#1                ;是连续码,把1放入A
  448.         RET
  449. JIEMA6:
  450. ;--- 引导码9ms低电平+4.5ms高电平结束 ---
  451.         MOV        R1,#MA1         ;存放编码的首地址放入R1
  452.         MOV        R5,#4                 ;共4个字节数据
  453. JIEMA7:
  454.          MOV        R6,#8                ;每个字节为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(高电平)就转移
  460.         DJNZ        R7,JIEMA9        ;时间未到就继续检测,等待低电平信号结束
  461.         LJMP        JMerr                ;超时,退出
  462. JIEMA10:
  463.         MOV        R7,#20                ;变为高电平了,延时20次共860微秒(0.86毫秒)
  464. JIEMA11:
  465.         LCALL        DELAY43US
  466.         DJNZ        R7,JIEMA11        ;延时0.86毫秒
  467.         MOV        C,IR                ;延时结束IR的电平就是数据信号(0或1),移入C中
  468.         JNB        IR,JIEMA13        ;如果IR是0(低电平)就转移
  469.         MOV        R7,#50                ;是高电平,检测50次×43微秒=2150微秒(2.15毫秒)
  470. JIEMA12:
  471.         LCALL        DELAY43US        ;
  472.         JNB        IR,JIEMA13        ;如果IR是0(低电平)就转移,
  473.         DJNZ        R7,JIEMA12        ;时间未到就继续检测,等待高电平信号结束
  474.         LJMP        JMerr                ;超时,退出
  475. JIEMA13:
  476.         MOV        A,@R1                ;装入R1指向的RAM地址的数据到A寄存器
  477.         RRC        A                ;将C中的值(0或1)移入A中的最低位
  478.         MOV        @R1,A                ;把A中的数据放回R1指向的RAM
  479.         DJNZ        R6,JIEMA8        ;如果未接收完8位就转移继续
  480.         INC        R1                ;接收完8位了,地址加1
  481.         DJNZ        R5,JIEMA7        ;如果4个字节数据未接收完就转移继续
  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微秒的数值是156,因T0中断频率高占用资源,使延时变长,修改为此数
  493. NEXT43:                                ;值才能正确解码,如果移植到别的程序,没有过高频率的中断,此数值要改回156
  494.         DJNZ        12H,NEXT43
  495.         POP        12H
  496.         RET

  497. ;------------------------------------------------------------------------------------------------
  498. ;子程序:EC11编码器按键动作处理
  499. ; 1.短按1次:正常风与睡眠风(自然风)切换。睡眠风状态时LED指示灯亮,只显示定时时间。
  500. ; 2.短按2次:设置睡眠风(自然风)渐慢/渐快变化的上下限档位范围、档位变化时的间隔时间(秒)
  501. ; 3.长按10秒:显示“----”,红外线遥控信号解码,遥控器按键的功能定义,定义好后须长按10秒才保存
  502. ;
  503. ;红外遥控器的按键定义:
  504. ;定义1“关”、2“开/风速”、3“定时”、4“睡眠”、5“+”、6“-”六个功能键。
  505. ;    交替显示功能编号+遥控器客户码和原来保存的按键值,按键值为数据码+数据码反码4个十
  506. ;六进制数,按下遥控器按键收到信号解码成功并显示,即为新的按键值,遥控器客户码与原来保
  507. ;存的不相同时,自动删除旧的数据(保存才会生效),短按跳到下一个功能编号,也可以旋转EC11
  508. ;编码器向前/后跳到任意功能编号,全部或部分定义好后,长按10秒显示“----”保存并退出才生
  509. ;效,短按两次退出或60秒无操作自动退出,不保存,仍然还是原来的数据。
  510. ;-------------------------------------------------------------------------------------------------
  511. AJDZCL:
  512.         LCALL        KEY                ;调用编码器按键开关处理子程序
  513.         CJNE        A,#1,AJDZ2        ;如果不是按下1次就转移
  514.         CPL        FLQH                ;“风类切换”取反,正常风/自然风切换
  515.         RET
  516. AJDZ2:
  517.         CJNE        A,#2,AJDZ3        ;如果不是按下2次就转移
  518.         LCALL        ZRFFW                ;调用自然风变化档位上下限范围、档位变化间隔时间设置子程序
  519.         RET
  520. AJDZ3:
  521.         SETB        XSQHY                ;是长按10秒,“显示切换1”置为1,显示红外解码或自然风档位变化范围
  522.         CLR        XSQHE                ;“显示切换2”置为0,红外遥控信号解码显示
  523.         MOV        XMBH,#1                ;先放入项目编号1(关)
  524.         LCALL        HENGX                ;关闭T0中断的显示功能,显示“----”
  525.         LCALL        KEYEX                ;等待按键释放
  526.         CLR        XSKG                ;“显示开关”置为0,恢复T1中断的显示功能
  527. AJDZ4:
  528.         CLR        BMXSQH                ;“编码显示切换”置为0,先显示功能编号+系统码
  529. AJDZ5:
  530.         MOV        MJS,#60                ;设置无信号等待时间(秒)
  531.         MOV        DSDW,#2                ;设置系统码和数据码交替显示间隔时间(秒)
  532. AJDZ6:
  533.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不闪烁显示
  534. AJDZ7:
  535.         LCALL        JIEMA                ;调用红外遥控解码子程序
  536.         JC        LXMPD                ;解码成功(C=1)就转移
  537.         LCALL        SKEY                ;扫描编码器按键
  538.         JNC        AJDZ11                ;没有按键动作(C=0)就转移
  539.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不闪烁显示
  540.         LCALL        KEY                ;有按键动作,调用编码器按键处理子程序
  541.         CJNE        A,#3,AJDZ9        ;如果不是3(长按10秒)就转移
  542. AJDZ8:
  543.         LCALL        WEEP                ;保存当前设置
  544.         LCALL        HENGX                ;关闭T0中断的显示功能,显示“----”
  545.         LCALL        KEYEX                ;等待按键释放
  546.         CLR        XSKG                ;“显示开关”置为0,恢复T1中断的显示功能
  547.         RET
  548. LXMPD:
  549.         JZ        AJDZ17                ;如果A=0(不是连续码)就转移
  550.         LJMP        AJDZ5
  551. AJDZ9:
  552.         CJNE        A,#1,AJDZ_Q        ;如果不是1(短按1次)就转移退出,不保存
  553. AJDZ90:
  554.         MOV        A,XMBH                ;装入项目编号
  555.         CJNE        A,#6,AJDZ10        ;如果不是最后一项就转移
  556.         MOV        XMBH,#0
  557. AJDZ10:
  558.         INC        XMBH                ;加1,跳到下一个功能编号
  559.         LJMP        AJDZ4
  560. AJDZ11:
  561.         LCALL        Scan1               ;扫描编码器(有方向标志)
  562.         JB        BMQDZ,AJDZ15        ;编码器有动作(1)就转移
  563.         MOV        A,DSDW                ;没有转动,装入交替显示间隔时间(秒)到寄存器A
  564.         JNZ        AJDZ12                ;不为0就转移
  565.         CPL        BMXSQH                ;为0,“编码显示切换”取反,显示另一项
  566.         MOV        DSDW,#1                ;设置系统码和数据码交替显示间隔时间(秒)
  567. AJDZ12:
  568.         MOV        A,MJS                ;装入无信号等待时间到寄存器A
  569.         JNZ        AJDZ13                ;不为0就转移
  570. AJDZ_Q:
  571.         LCALL        RE00                ;读EEPROM保存的数据
  572.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不闪烁显示,退出,不保存
  573.         RET
  574. AJDZ13:
  575.         CJNE        A,#6,AJDZ14        ;检查剩余时间
  576. AJDZ14:
  577.         JNC        AJDZ6                ;等于或大于就转移,不闪烁显示
  578.         MOV        FWBZ0,A                ;剩余时间放到FWBZ0,闪烁显示
  579.         LJMP        AJDZ7
  580. AJDZ15:
  581.         LCALL        Scan2             ;扫描编码器(无方向标志)
  582.         JB           BMQDZ,AJDZ15        ;旋转动作未结束(1)就转移继续等待
  583.         JB        XZFX,AJDZ90         ;顺时针正转(1)就转移
  584.         MOV        A,XMBH                ;反转,装入项目编号
  585.         DEC        A                ;减1
  586.         JNZ        AJDZ16                ;不为0就转移
  587.         MOV        A,#6                ;跳到第6项
  588. AJDZ16:
  589.         MOV        XMBH,A
  590.         LJMP        AJDZ4
  591. ;
  592. AJDZ17:
  593.         SETB        BMXSQH                ;“编码显示切换”置为1(显示数据码+反码)
  594.         MOV        A,MA1                ;装入当前接收到的系统码到A
  595.         MOV        B,ANJZ                ;装入原来保存的系统码到B
  596.         CJNE        A,B,AJDZ20        ;不同就转移
  597.         MOV        R0,#ANJZ        ;遥控编码首地址
  598.         INC        R0                ;地址加1
  599.         MOV        R3,#6                ;检查6个按键值,发现有相同的就删除(清零)
  600. AJDZ18:
  601.         MOV        A,MA3                ;装入数据码
  602.         MOV        B,@R0                ;装入原来的数据码
  603.         CJNE        A,B,AJDZ19        ;不同就转移,检查下一个
  604.         INC        R0                ;相同,地址加1,检查反码看是否也相同
  605.         MOV        A,MA4                ;装入数据码反码
  606.         MOV        B,@R0                ;装入数据码反码
  607.         DEC        R0                ;地址减1
  608.         CJNE        A,B,AJDZ19        ;不同就转移,检查下一个
  609.         MOV        @R0,#0                ;也相同,数据码位置放入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        ;如果未检查完就转移继续
  617.         LJMP        AJDZ22
  618. AJDZ20:
  619.         MOV        ANJZ,MA1           ;移入新的系统码
  620.         MOV        R0,#ANJZ           ;原来的数据全部清零
  621.         MOV        R3,#12           ;原来的数据全部清零
  622. AJDZ21:
  623.         INC        R0                   ;原来的数据全部清零
  624.         MOV        @R0,#0           ;原来的数据全部清零
  625.         DJNZ        R3,AJDZ21           ;原来的数据全部清零
  626. AJDZ22:
  627.         MOV        A,XMBH           ;装入项目编号
  628.         MOV         B,#2               ;项目编号乘2
  629.         MUL         AB                ;项目编号乘2
  630.         DEC         A                 ;计算结果减1
  631.         ADD         A,#ANJZ           ;加遥控编码首地址
  632.         MOV         R0,A             ;得出数据码的实际地址
  633.         MOV        @R0,MA3             ;把接收到的数据移到对应的按键值RAM地址
  634.         INC        R0                     ;把接收到的数据移到对应的按键值RAM地址
  635.         MOV        @R0,MA4             ;把接收到的数据移到对应的按键值RAM地址
  636.         LJMP        AJDZ5

  637. ;---------------------------------------------------------------------------------
  638. ;子程序:设置调整睡眠风(自然风)变化的档位上下限范围、变化时的间隔时间(秒)
  639. ; 1.显示:L-最低档位下限
  640. ; 2.显示:H-最高档位上限
  641. ; 3.显示:E-档位变化时的间隔时间(秒)
  642. ;短按编码器按键,跳到另一项;短按2次编码器按键保存并退出;无操作5秒后开始闪烁显示,
  643. ;闪烁显示5秒跳到下一项,如果在第3项,闪烁显示5秒无操作则保存并退出。
  644. ;上、下限档位之间最少间隔3档。自然风档位变化的间隔时间为1~5秒
  645. ;---------------------------------------------------------------------------------
  646. ZRFFW:
  647.         SETB        XSQHY                ;“显示切换1”置为1,显示红外解码或自然风档位变化范围
  648.         SETB        XSQHE                ;“显示切换2”置为1,显示自然风档位变化范围
  649.         MOV        ZRFJG,#1        ;先设为第一项,档位下限
  650. ZRFFW1:
  651.         MOV        A,ZRFJG                ;装入项目号
  652.         DEC        A                ;减1
  653.         JNZ        ZRFFW2                ;不为0就转移
  654.         LCALL        ZRFXX                ;是1,设置下限档位调整时的最大和最小值、调整对象的地址
  655.         LJMP        SZTZ
  656. ZRFFW2:
  657.         DEC        A                ;减1
  658.         JNZ        ZRFFW3                ;不为0就转移
  659.         LCALL        ZRFSX                ;是2,设置上限档位调整时的最大和最小值、调整对象的地址
  660.         LJMP        SZTZ
  661. ZRFFW3:
  662.         MOV        R5,#1                ;是3,档位变化的间隔时间(秒),调整时的最小值
  663.         MOV        R6,#5                ;是3,档位变化的间隔时间(秒),调整时的最大值
  664.         MOV        R0,#SMFJG        ;档位变化的间隔时间(秒)地址
  665. SZTZ:
  666.         MOV        MJS,#10                ;无操作等待时间10秒
  667. SZTZ1:
  668.         MOV        FWBZ0,#0        ;把0放入到FWBZ0,不闪烁显示
  669. SZTZ2:
  670.         LCALL        SKEY                ;扫描编码器按键开关
  671.         JNC        SZTZ5                ;没有按键动作(C=0)就转移
  672.         LCALL        KEY                ;有按键动作,调用编码器按键处理子程序
  673.         CJNE        A,#2,SZTZ3
  674. SZTZ3:
  675.         JNC        SZTZ4                ;如果是按下2次及以上就转移
  676. SZTZ30:
  677.         INC        ZRFJG                ;是按下1次,项目号加1(跳到下一项)
  678.         MOV        A,ZRFJG                ;装入项目号
  679.         CJNE        A,#4,SZTZ31        ;是否小于4
  680. SZTZ31:        JC        ZRFFW1                ;小于就转移
  681.         LJMP        ZRFFW                ;等于或大于,转移,设为第一项
  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        ;编码器已经转动(1)就转移
  690.         MOV        A,MJS                ;没有转动,装入秒计数到寄存器A
  691.         JZ        SZTZ7                ;如果秒计数为0(10秒无操作)就转移
  692.         CJNE        A,#6,SZTZ6        ;检查剩余时间
  693. SZTZ6:
  694.         JNC        SZTZ1                ;等于或大于就转移,不闪烁显示
  695.         MOV        FWBZ0,A                ;剩余时间放到FWBZ0,闪烁显示
  696.         LJMP        SZTZ2
  697. SZTZ7:
  698.         MOV        A,ZRFJG                ;时间到,装入项目号
  699.         CJNE        A,#3,SZTZ30        ;不是最后一项就转移,跳到下一项
  700.         LJMP        SZTZ4                ;转移,保存并退出
  701. SZTZ8:
  702.         LCALL        Scan2             ;扫描编码器(无方向标志)
  703.         JB           BMQDZ,SZTZ8        ;旋转动作未结束(1)就转移继续等待
  704.         JB        XZFX,SZTZ11         ;是顺时针正转(1)就转移
  705.         MOV        B,R5                ;是反转,装入最小值到B寄存器
  706.         MOV        A,@R0                ;装入R0指向的RAM地址的调整对象数值
  707.         DEC        A                ;减1
  708.         CJNE        A,B,SZTZ9        ;与最小比较
  709. SZTZ9:
  710.         JC        SZTZ10                ;如果小于就转移
  711.         MOV        @R0,A                ;等于或大于,把减1后的结果放回去
  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地址的调整对象数值
  719.         INC        A                ;加1
  720.         CJNE        A,B,SZTZ12        ;加完后与最大值比较
  721. SZTZ12:
  722.         JC        SZTZ13                ;如果小于就转移
  723.         MOV        @R0,B                ;等于或大于,直接放入最大值
  724.         LJMP        SZTZ
  725. SZTZ13:
  726.         MOV        @R0,A                ;小于最大值,把加1后的结果放回去
  727.         LJMP        SZTZ

  728. ;---------------------------------------------------------------------------
  729. ;设置睡眠风(自然风)变化范围的上限档位,最大为15档,最小为下限档位加3档
  730. ;---------------------------------------------------------------------------
  731. ZRFSX:        
  732.         MOV        B,#15                ;调整时的最大值
  733.         MOV        A,DANG_D        ;装入当前档位下限
  734.         ADD        A,#3                ;加3档
  735.         CJNE        A,B,ZRFSX1        ;是否等于或大于上限
  736. ZRFSX1:
  737.         JC        ZRFSX2                ;小于就转移
  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                ;调整时的最小值
  745.         MOV        R6,B                ;调整时的最大值
  746.         MOV        R0,#DANG_G        ;自然风档位上限地址
  747.         RET
  748. ;---------------------------------------------------------------------------
  749. ;设置睡眠风(自然风)变化范围的下限档位,最小为1档,最大为上限档位减3档
  750. ;---------------------------------------------------------------------------
  751. ZRFXX:
  752.         MOV        B,#4                ;调整时的最小值1加3档
  753.         MOV        A,DANG_G        ;装入当前自然风档位上限
  754.         CJNE        A,B,ZRFXX1
  755. ZRFXX1:
  756.         JC        ZRFXX2                ;小于就转移
  757.         SUBB        A,#3                ;等于或大于,档位上限减3档即为调整时的最大值
  758.         MOV        B,A                ;等于或大于,档位上限减3档即为调整时的最大值
  759.         LJMP        ZRFXX3
  760. ZRFXX2:
  761.         MOV        DANG_G,B        ;小于最小值+3档,把上限档位改为最小值加3档
  762.         MOV        B,#1
  763. ZRFXX3:
  764.         MOV        R5,#1                ;调整时的最小值
  765.         MOV        R6,B                ;调整时的最大值
  766.         MOV        R0,#DANG_D        ;自然风档位下限地址
  767.         RET

复制代码
未完,下面还有

打赏

参与人数 4家元 +70 收起 理由
zzy_85569381 + 20 謝謝分享
hongo + 20 優秀文章
萧错 + 20 原創內容
moontree + 10 謝謝分享

查看全部打赏

 楼主| 发表于 2022-8-16 03:55:33 | 显示全部楼层

  1. ;------------------------------------------------------------------------------------
  2. ;子程序:编码器按键开关处理,间隔时间不超过0.6秒的2次短按,为有效按键动作
  3. ;出口参数: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就转移,时间未到
  11.         MOV        A,#3                ;时间到了
  12.         RET
  13. KEY2:
  14.         LCALL        SKEY                ;扫描按键
  15.         JC        KEY1                ;如果C=1(按键还没松开),就继续扫描
  16.         LCALL        KEYA                ;扫描按键600毫秒
  17.         JZ        KEY3                ;如果600毫秒内有按键动作就转移
  18.         MOV        A,#1                ;600毫秒内没有按键动作,置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)毫秒计数
  30.         JZ           KEYC             ;为0(时间到)就转移
  31.         LCALL        SKEY            ;扫描按键
  32.         JNC          KEYB             ;没有按键动作(C=0)就转移
  33.         CLR          A                ;有按键动作A=0
  34.         RET
  35. KEYC:
  36.         MOV          A,#1                 ;等待时间已到,A=1没有按键动作
  37.         RET

  38. ;-------------- 按键开关扫描,未按C=0,已按下C=1 --------------
  39. SKEY:
  40.         SETB         EC11K                ;按键端口置为高电平
  41.         JNB          EC11K,SKEY1        ;为0(低电平)就转移
  42.         CLR          C                ;C置为0,没有按键动作
  43.         RET
  44. SKEY1:
  45.         LCALL        DELAY20          ;延时20毫秒
  46.         SETB        EC11K              ;延时结束后再次把按键端口置为高电平
  47.         JNB          EC11K,SKEY2        ;为0(低电平)就转移
  48.         CLR          C                ;C置为0,没有按键动作
  49.         RET                        ;按键未被有效按下,退出
  50. SKEY2:
  51.         SETB         C                ;C置为1,按键已有效按下
  52.         LCALL        SETPWM          ;有按键动作就重新放置“延时PWM驱动”时间
  53.         RET


  54. ;------------------ 等待按键释放 ------------------
  55. KEYEX:
  56.         LCALL        SKEY                   ;扫描按键
  57.         JC           KEYEX           ;如果C=1(按键还没释放)就继续扫描
  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. ;子程序:编码器旋转动作处理,根据旋转方向增(减)定时时间、档位
  77. ;10小时以下每次增(减)30分钟;10小时及以上每次增(减)1个小时;20小时以上每次增(减)2个小时
  78. ;---------------------------------------------------------------------------------------------
  79. BMQCL:
  80.         LCALL        Scan2             ;扫描编码器(无方向标志)
  81.         MOV        DSDW,DSDWJG        ;置交替显示间隔时间
  82.         JB           BMQDZ,BMQCL        ;“编码器动作”为1(动作未结束)就转移继续等待
  83. BMQCL0:
  84.         JNB           XSNRXZ,BMQCL5        ;“显示内容选择”为0(显示定时时间)就转移
  85.         SETB        YSBC                ;“延时保存”置为1
  86.         MOV        MJS,#10                ;“延时保存”时长(秒)。延时结束后才保存,避免频繁的EEPROM操作
  87.         MOV        A,DANG                ;装入当前档位值
  88.         JB        XZFX,BMQCL2         ;“旋转方向”为1(顺时针正转)就转移
  89.         DEC        A                ;是反转,减1档
  90.         JNZ        BMQCL1                ;减1后不为0就转移
  91.         RET       
  92. BMQCL1:
  93.         MOV        DANG,A
  94.         RET
  95. BMQCL2:
  96.         CJNE        A,#15,BMQCL3        ;是否已到最高15档
  97. BMQCL3:
  98.         JC        BMQCL4                ;小于就转移
  99.         MOV        DANG,#15        ;等于或大于,放入最高档位15
  100.         RET
  101. BMQCL4:
  102.         INC        DANG                ;还未到上限,增1档
  103.         RET
  104. BMQCL5:
  105.         CLR         SSBZ                ;“闪烁标志”置为0(数字及冒号状态为“显示”)
  106.         MOV         A,DSSJS                  ;装入定时时间(时)
  107.         CJNE        A,#20,BMQCL6        ;当前“时”是否等于或大于20
  108. BMQCL6:
  109.         JC          BMQCL7                ;小于就转移
  110.         MOV         R5,#2                ;等于或大于20,加减2个小时
  111.         LJMP        BMQCL9
  112. BMQCL7:
  113.         CJNE        A,#10,BMQCL8        ;当前“时”是否等于或大于10
  114. BMQCL8:
  115.         JC          BMQCL13                ;小于就转移
  116.         MOV         R5,#1                ;等于或大于10,加减1个小时
  117. BMQCL9:
  118.         JNB         XZFX,BMQCL11        ;“旋转方向”为0(逆时针反转)就转移
  119.         ADD         A,R5                 ;是正转,加
  120.         CJNE        A,#100,BMQCL10        ;加完后是否等于或大于100
  121. BMQCL10:
  122.         JC          BMQCL12                 ;如果小于就转移,把A放回到DSSJS
  123.         MOV         DSSJS,#99        ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
  124.         MOV         DSSJF,#59        ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
  125.         MOV         DSSJM,#59        ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
  126.         RET
  127. BMQCL11:
  128.         SUBB        A,R5                ;是反转,减
  129. BMQCL12:
  130.         MOV         DSSJS,A                ;把计算结果放入DSSJS
  131.         RET
  132. BMQCL13:
  133.         MOV         A,DSSJF             ;小于10小时,装入定时时间(分)
  134.         JNB         XZFX,BMQCL16          ;“旋转方向”为0(逆时针反转)就转移
  135.         ADD         A,#30              ;是正转,当前“分”加30
  136.         CJNE        A,#60,BMQCL14        ;加完后“分”是否等于或大于60
  137. BMQCL14:
  138.         JC          BMQCL15             ;小于60就转移,把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        ;是逆时针反转,当前“分”是否等于或大于30
  146. BMQCL17:
  147.         JC          BMQCL18          ;小于就转移
  148.         SUBB        A,#30                  ;定时时间(分)减30
  149.         MOV         DSSJF,A         ;把计算结果放入定时时间(分)
  150.         RET
  151. BMQCL18:
  152.         MOV         A,#30                  ;“分”小于30,把30放入寄存器A
  153.         CLR         C               ;进位标志清0
  154.         SUBB        A,DSSJF         ;减“定时时间(分)”
  155.         MOV         DSSJF,A         ;减完后的结果暂时放入DSSJF
  156.         MOV         A,#60
  157.         SUBB        A,DSSJF         ;60减上面的计算结果,得出定时时间(分),然后小时减1
  158.         MOV         DSSJF,A         ;得出的数放入定时时间(分)
  159.         MOV         A,DSSJS         ;装入定时时间(时)
  160.         JZ        DSSJQL                ;如果“时”为0就转移(不够减了,把定时时间清零)
  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. ;子程序:扫描编码器是否有旋转动作并设置好方向标志
  170. ;出口参数:“编码器动作”=1已经转动,=0没有转动;“旋转方向”=1顺时针正转,=0逆时针反转
  171. ;----------------------------------------------------------------------------------------------
  172. Scan1:
  173.         SETB         EC11A               ;拉高编码器A引脚电平
  174.         SETB         EC11B               ;拉高编码器B引脚电平
  175.         JNB          EC11A,Scan11        ;如果为0(低电平)就转移,编码器有旋转动作,顺时针正转
  176.         JNB          EC11B,Scan12        ;如果为0(低电平)就转移,编码器有旋转动作,逆时针反转
  177.         CLR          BMQDZ                 ;没有旋转动作,把“编码器动作”置为0
  178.         RET
  179. Scan11:
  180.         SETB         XZFX                ;顺时针正转,把“旋转方向”置为1
  181.         SETB         BMQDZ                ;有旋转动作,把“编码器动作”置为1
  182.         LCALL        SETPWM          ;有动作就重新放置“延时PWM驱动”时间
  183.         RET  
  184. Scan12:
  185.         CLR          XZFX                ;逆时针反转,把“旋转方向”置为0
  186.         SETB         BMQDZ                ;有旋转动作,把“编码器动作”置为1
  187.         LCALL        SETPWM          ;有动作就重新放置“延时PWM驱动”时间
  188.         RET

  189. ;-------------------------------------------------------------
  190. ;子程序:扫描编码器是否有旋转动作,不设置方向标志
  191. ;出口参数:“编码器动作”BMQDZ=1已经转动,=0没有转动
  192. ;-------------------------------------------------------------
  193. Scan2:
  194.         SETB         EC11A               ;拉高编码器A引脚电平
  195.         SETB         EC11B               ;拉高编码器B引脚电平
  196.         JNB          EC11A,Scan21        ;如果为0(低电平)就转移,编码器有旋转动作
  197.         JNB          EC11B,Scan21        ;如果为0(低电平)就转移,编码器有旋转动作
  198.         CLR          BMQDZ                 ;没有旋转动作,把“编码器动作”置为0
  199.         RET
  200. Scan21:
  201.         SETB         BMQDZ                ;有旋转动作,把“编码器动作”置为1
  202.         LCALL        SETPWM          ;有动作就重新放置“延时PWM驱动”时间
  203.         RET

  204. ;--------------------------------------------------------------
  205. ;子程序:继电器控制,T0中断、EEPROM操作子程序调用
  206. ;--------------------------------------------------------------
  207. Control:
  208.         JNB        EEPBC,CTL00        ;EEPBC标志为0就转移。为1表示EEPROM操作子程序正在调用下面的继电器控制程序
  209.         RET
  210. CTL00:
  211.         MOV        A,DSSJM                ;装入定时时间(秒)到寄存器A
  212.         JNZ        CTL02                ;不是0就转移
  213.         MOV        A,DSSJF                ;装入定时时间(分)到寄存器A
  214.         JNZ        CTL02                ;不是0就转移
  215.         MOV        A,DSSJS                ;装入定时时间(时)到寄存器A
  216.         JNZ        CTL02                ;不是0就转移
  217. CTL01:
  218.         MOV        P3,#0FFH        ;置P3端口为高电平,断电
  219.         RET
  220. CTL02:
  221.         JNB        PWM,CTL03        ;PWM标志为0就转移。0=禁止PWM驱动,1=使用PWM方式驱动
  222.         MOV        A,YSPWM          ;装入“延时PWM驱动”,为0时使用PWM驱动方式
  223.         JNZ           CTL03                ;不是0就转移
  224.         JB        PWMBZ,CTL01        ;“PWM电平状态标志”为1(高电平)就转移。PWM周期25微秒*2=50微秒,20KHz占空比50%
  225. CTL03:
  226.         JB        FLQH,CTL05         ;“风类切换”为1自然风(睡眠风)就转移
  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         ;装入自然风(睡眠风)档位变化时的间隔时间(秒)
  240.         JZ        CTL06                ;是0就转移
  241.         MOV        A,DANGW                ;装入自然风当前档位
  242.         LJMP        CTL04
  243. CTL06:
  244.         MOV        SMFJG2,SMFJG        ;重新放入设置的档位变化间隔时间
  245.         LCALL        SETPWM          ;设置“延时PWM驱动”时间
  246.         MOV        A,DANGW           ;装入当前档位值
  247.         JNB        TSFX,CTL09         ;如果“调速方向”为0(渐慢降档)就转移
  248.         CJNE        A,DANG_G,CTL07        ;当前档位值是否等于或大于设置的最高上限
  249. CTL07:
  250.         JC        CTL08                ;小于就转移
  251.         MOV        A,DANG_G        ;等于或大于,装入最高上限
  252.         CLR        TSFX                ;“调速方向”改为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        ;当前档位值不是设置的最低下限就转移
  260.         SETB        TSFX                ;是,“调速方向”改为1(渐快增档)
  261.         LJMP        CTL04
  262. CTL10:
  263.         JC        CTL13                ;小于就转移
  264.         CJNE        A,DANG_G,CTL11        ;是否大于设置的最高上限
  265. CTL11:
  266.         JC        CTL12                ;小于就转移
  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中断调用,时间计数及倒计时处理。10毫秒执行一次
  278. ;--------------------------------------------------------------
  279. TIME:
  280.         MOV        A,YSPWM           ;延时PWM驱动
  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)毫秒计数
  289.         JZ           TIME2           ;如果是0就转移
  290.         DEC          SHMJS           ;每10毫秒减1,直到为0
  291. TIME2:
  292.         MOV        A,HWJS          ;每10毫秒减1,为0时清除“接收到的红外遥控数据码”
  293.         JZ           TIME3           ;是0就转移
  294.         DEC        HWJS                   ;减1
  295.         LJMP        TIME4
  296. TIME3:
  297.         MOV          MA1,FWBZ1          ;用“复位及EEPROM判断标志”填充“接收到的红外遥控数据码”
  298.         MOV          MA2,FWBZ2          ;用“复位及EEPROM判断标志”填充“接收到的红外遥控数据码”
  299. TIME4:
  300.         MOV          A,HMJS             ;装入(10)毫秒计数2
  301.         JZ           TIME6              ;如果是0就转移
  302.         DEC          HMJS               ;不是0,减1
  303.         CJNE         A,#50,TIME5        ;如果不是50就转移退出
  304.         SETB         SSBZ                ;“闪烁标志”置为1,数字及冒号闪烁时用,每0.5秒变化一次
  305. TIME5:
  306.         RET
  307. TIME6:
  308.         CLR          SSBZ             ;“闪烁标志”置为0,数字及冒号闪烁时用,每0.5秒变化一次
  309.         MOV          HMJS,#99        ;重新放入计数值(1秒)
  310.         MOV          A,SMFJG2           ;装入运行时使用的“睡眠风(自然风)档位变化时的间隔时间(秒)”
  311.         JZ           TIME7                  ;如果是0就转移
  312.         DEC          SMFJG2             ;每秒减1,直到为0
  313. TIME7:
  314.         MOV          A,MJS           ;秒计数
  315.         JZ           TIME8                  ;如果是0就转移
  316.         DEC          MJS             ;每秒减1,直到为0
  317. TIME8:
  318.         MOV          A,FWBZ0           ;装入复位提示(闪烁显示)秒计数
  319.         JZ           TIME9                  ;如果是0就转移
  320.         DEC          FWBZ0             ;每秒减1,直到为0
  321. TIME9:
  322.         MOV          A,DSDW           ;装入定时与档位交替显示的间隔时间(秒)
  323.         JNZ           TIME10                  ;如果不是0就转移
  324.         MOV        DSDW,DSDWJG        ;重新放入设置值
  325.         CPL        XSNRXZ                ;“显示内容选择”取反,交替显示
  326. TIME10:
  327.         DEC          DSDW             ;每秒减1,直到为0
  328.         MOV          A,DSSJM           ;装入定时时间(秒)到寄存器A
  329.         JZ           TIME11             ;如果是0就转移
  330.         DEC          DSSJM             ;减1秒
  331.         RET
  332. TIME11:
  333.         MOV          A,DSSJF           ;装入定时时间(分)到寄存器A
  334.         JZ           TIME12             ;如果是0就转移
  335.         DEC          DSSJF             ;不是0,减1分
  336.         MOV          DSSJM,#59         ;把59放入定时时间(秒)
  337.         RET
  338. TIME12:
  339.         MOV          A,DSSJS         ;装入定时时间(时)到寄存器A
  340.         JNZ          TIME13           ;不是0就转移
  341.         CLR        XSNRXZ                ;定时结束,“显示内容选择”置为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中断调用,显示定时时间及档位、红外遥控解码等。10毫秒执行一次
  350. ;---------------------------------------------------------------------------
  351. DISPLAY:
  352.         JB          XSKG,DPYSZ1        ;如果“显示开关”为1(禁止T1显示功能)就转移,退出
  353.         JNB          XSQHY,DPYSZ0        ;如果“显示切换1”为0(显示定时或档位)就转移
  354.         LJMP        DSZ
  355. DPYSZ0:
  356.         JB          FLQH,DISPL0        ;如果“风类切换”为1睡眠风(自然风)就转移,显示定时时间
  357.         JNB          XSNRXZ,DISPL0        ;如果“显示内容选择”为0(显示定时时间)就转移
  358.         MOV         A,DANG           ;显示档位,装入档位值
  359.         CJNE        A,XSHC1,DPYSZ3        ;当前档位值与缓存1不相同就转移,立即显示
  360.         MOV         A,HMJS               ;相同,装入(10)毫秒计数2
  361.         CJNE        A,#99,DPYSZ2        ;不是99就转移,每0.5秒显示一次
  362.         LJMP        DPYSZ3              ;是,显示
  363. DPYSZ1:        RET
  364. DPYSZ2:
  365.         CJNE         A,#49,DPYSZ1         ;不是49就转移退出,每0.5秒显示一次
  366. DPYSZ3:
  367.         MOV          XSHC1,DANG           ;当前档位值放入缓存1
  368.         MOV          ZXM1,#0               ;放入消隐码到待发送TM1637区1
  369.         MOV          ZXM4,#0               ;放入消隐码到待发送TM1637区4
  370.         MOV          R0,#ZXM2          ;装入待发送TM1637区2地址
  371.         MOV         A,DANG           ;装入档位值
  372.         LCALL        BCD               ;转换并获取字形码放到待发送TM1637区2和3
  373.         LCALL        disp              ;发送4个字节数据到TM1637显示
  374.         RET
  375. ;--------------------------------
  376. DISPL0:
  377.         CLR        XSNRXZ                 ;“显示内容选择”置为0,显示定时时间
  378.         MOV          R1,#DSSJS         ;把定时时间“时”的地址放入R1
  379.         MOV          A,@R1             ;装入“时”
  380.         JZ           DISPL1            ;如果“时”为0就转移
  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的数据与显示缓存1不相同就转移,立即显示
  388.         INC          R1                  ;地址加1
  389.         MOV          A,@R1               ;装入下一个时间数值
  390.         DEC          R1                  ;地址减1
  391.         CJNE         A,XSHC2,DISPL6        ;寄存器A的数据与显示缓存2不相同就转移,立即显示
  392.         MOV          A,HMJS              ;都相同,装入(10)毫秒时间计数2
  393.         CJNE         A,#99,DISPL5        ;不是99就转移
  394.         LJMP         DISPL6              ;是,显示(每0.5秒显示一次)
  395. DISPL4:        RET
  396. DISPL5:
  397.         CJNE         A,#49,DISPL4         ;不是49就转移退出,每0.5秒显示一次
  398. DISPL6:
  399.         INC          R1                ;地址加1
  400.         MOV          A,@R1             ;装入后面一位时间数值
  401.         MOV          XSHC2,A           ;放入缓存2
  402.         DEC          R1                ;地址减1
  403.         MOV          A,@R1             ;装入前面一位时间数值
  404.         MOV          XSHC1,A           ;放入缓存1
  405.         MOV          R0,#ZXM1          ;待发送TM1637区1地址
  406.         LCALL        BCD               ;转换并获取字形码放到待发送TM1637区1、2
  407.         INC          R1                ;地址加1
  408.         MOV          R0,#ZXM3          ;待发送TM1637区3地址
  409.         MOV          A,@R1             ;装入后面一位时间数值
  410.         LCALL        BCD               ;转换并获取字形码放到待发送TM1637区3、4
  411.         JB           SSBZ,DISPL8        ;如果“闪烁标志”为1就转移,不显示冒号
  412. DISPL7:
  413.         ORL          ZXM2,#10000000B        ;把最高位置为1(最高位为1就显示冒号)
  414. DISPL8:
  415.         LCALL        disp             ;发送4个字节数据到TM1637显示
  416.         RET
  417. ;--------------------------------
  418. DSZ:
  419.         JNB          XSQHE,DHW        ;如果“显示切换2”为0(显示红外遥控信号解码)就转移
  420.         MOV        A,ZRFJG                ;装入当前要显示的项目号,1:档位下限;2=档位上限;3=档位变化的间隔时间(秒)
  421.         DEC        A                ;减1
  422.         JNZ        DSZ1                ;不为0就转移
  423.         MOV        A,DANG_D        ;是1,显示档位下限
  424.         MOV          ZXM1,#038H        ;放入“L”到待发送TM1637区1
  425.         LJMP        DSZ3
  426. DSZ1:
  427.         DEC        A                ;减1
  428.         JNZ        DSZ2                ;不为0就转移
  429.         MOV        A,DANG_G        ;是2,显示档位上限
  430.         MOV          ZXM1,#076H        ;放入“H”到待发送TM1637区1
  431.         LJMP        DSZ3
  432. DSZ2:
  433.         MOV        A,SMFJG                ;是3,显示档位变化的间隔时间(秒)
  434.         MOV          ZXM1,#079H        ;放入“E”到待发送TM1637区1
  435. DSZ3:
  436.         MOV          ZXM2,#040H        ;放入“-”到待发送TM1637区2
  437.         MOV          R0,#ZXM3          ;待发送TM1637区3地址
  438.         LCALL        BCD               ;转换并获取字形码放到待发送TM1637区2和3
  439.         LCALL        disp              ;显示
  440.         RET
  441. ;---------------------------------
  442. DHW:
  443.         JB          BMXSQH,DHW4        ;如果“编码显示切换”为1(显示数据码+反码)就转移
  444.         MOV        A,XMBH                ;装入功能编号
  445.         CJNE         A,XSHC1,DHW3        ;与显示缓存1不相同就转移,立即显示
  446.         MOV         A,HMJS               ;相同,装入(10)毫秒计数
  447.         CJNE        A,#99,DHW2        ;不是99就转移,每0.5秒显示一次
  448.         LJMP        DHW3              ;是,显示
  449. DHW1:        RET
  450. DHW2:
  451.         CJNE         A,#49,DHW1         ;不是49就转移退出,每0.5秒显示一次
  452. DHW3:
  453.         MOV          XSHC1,XMBH           ;功能编号放入缓存1
  454.         MOV          R0,#ZXM1          ;显示功能编号+系统码,待发送TM1637区1
  455.         MOV        A,XMBH           ;装入功能编号
  456.         LCALL        BCD1               ;获取字形码放到待发送TM1637区
  457.         MOV          ZXM2,#040H        ;放入“-”到待发送TM1637区2
  458.         MOV        A,ANJZ                ;装入系统码
  459.         MOV          R0,#ZXM3          ;待发送TM1637区3
  460.         LCALL        HEX              ;显示十六进制系统码
  461.         LCALL        disp              ;显示十六进制系统码
  462.         RET
  463. DHW4:
  464.         MOV        A,XMBH           ;装入功能编号
  465.         MOV         B,#2               ;功能编号乘2
  466.         MUL         AB                ;功能编号乘2
  467.         DEC         A                 ;计算结果减1
  468.         ADD         A,#ANJZ           ;加遥控按键值首地址,得出数据码的实际地址
  469.         MOV         R1,A             ;地址放入R1
  470.         MOV         A,@R1            ;装入数据码
  471.         CJNE         A,XSHC1,DHW7        ;与显示缓存1不相同就转移,立即显示
  472.         INC          R1                  ;地址加1
  473.         MOV          A,@R1               ;装入装入数据码反码
  474.         DEC          R1                  ;地址减1
  475.         CJNE         A,XSHC2,DHW7        ;与显示缓存2不相同就转移,立即显示
  476.         MOV          A,HMJS              ;都相同,装入(10)毫秒时间计数
  477.         CJNE         A,#99,DHW6        ;不是99就转移
  478.         LJMP         DHW7              ;是,显示(每0.5秒显示一次)
  479. DHW5:        RET
  480. DHW6:
  481.         CJNE         A,#49,DHW5         ;不是49就转移退出,每0.5秒显示一次
  482. DHW7:
  483.         INC          R1                ;地址加1
  484.         MOV          A,@R1             ;装入数据码反码
  485.         MOV          XSHC2,A           ;放入缓存2
  486.         DEC          R1                ;地址减1
  487.         MOV          A,@R1             ;装入数据码码
  488.         MOV          XSHC1,A           ;放入缓存1
  489.         MOV          R0,#ZXM1          ;待发送TM1637区1
  490.         LCALL        HEX              ;查表获取字形码
  491.         MOV         A,@R1            ;装入数据码反码
  492.         LCALL        HEX              ;查表获取字形码
  493.         LCALL        disp              ;显示
  494.         RET
  495. ;---------------------------------
  496. HEX:
  497.         PUSH        ACC
  498.         SWAP        A                ;高低半字节交换
  499.         ANL        A,#0FH                ;逻辑与运算
  500.         LCALL        BCD1               ;查表获取字形码放到待发送TM1637区
  501.         INC        R0                ;地址加1
  502.         POP        ACC
  503.         ANL        A,#0FH                ;逻辑与运算
  504.         LCALL        BCD1               ;查表获取字形码放到待发送TM1637区
  505.         INC        R0                ;地址加1
  506.         INC        R1                ;地址加1
  507.         RET
  508. ;---------------------------------
  509. BCD:
  510.         MOV          B,#10            ;转换为BCD码
  511.         DIV          AB               ;转换为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            ;字形码放入待发送TM1637区
  519.         INC          R0               ;地址加1
  520.         XCH          A,B              ;A、B寄存器内容交换
  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            ;字形码放入待发送TM1637区
  529.         RET

  530. ;************** 关闭T1中断的显示功能,显示“----”**************
  531. HENGX:
  532.         SETB        XSKG                ;“显示开关”置为1,关闭T1中断的显示功能
  533.         MOV        ZXM1,#40H        ;显示“----”
  534.         MOV        ZXM2,#40H
  535.         MOV        ZXM3,#40H        ;显示“----”
  536.         MOV        ZXM4,#40H
  537.         LJMP        disp0

  538. ;---------- 发送4个字节数据到TM1637显示,地址自动加1 ----------
  539. disp:
  540.         MOV          A,FWBZ0          ;装入复位提示(闪烁显示)秒计数
  541.         JZ           disp0                  ;如果是0(未发生复位)就转移
  542.         JNB          SSBZ,disp0        ;已经发生复位,“闪烁标志”为0(闪烁显示中的“显示”状态)就转移
  543.         CLR          A               ;处于闪烁显示中的“不显示”状态,放入消隐码(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          ;数据命令设置40H:地址自动加1,写数据到显示寄存器
  551.         LCALL        Writebyte        ;发送一个字节
  552.         LCALL        Stop
  553.         NOP
  554.         LCALL        Srt
  555.         MOV          A,#0C0H          ;地址命令设置C0H:初始地址为00H
  556.         LCALL        Writebyte        ;发送一个字节
  557.         MOV          R6,#4            ;发送4个字节数据
  558.         MOV          R1,#ZXM1         ;等待发送的字形码始址
  559. disp1:
  560.         MOV          A,@R1            ;装入要发送的字形码
  561.         LCALL        Writebyte        ;发送一个字节
  562.         INC          R1               ;地址加1
  563.         DJNZ        R6,disp1            ;如果还未发送完就继续
  564.         LCALL        Stop
  565.         LCALL        Srt
  566.         MOV          A,SMGLD          ;装入设置的数码管亮度(1~8)
  567.         ADD          A,#087H          ;加上87H后即为对应的亮度控制命令88H~8FH
  568.         LCALL        Writebyte        ;按设置的亮度开显示
  569.         LCALL         Stop
  570.         RET

  571. ;----- 发送8bit(一个字节)数据到TM1637,A=要发送的数据,从低位开始 -----
  572. Writebyte:
  573.         MOV         R7,#8             ;发送8位数据
  574. WBY1:
  575.         CLR         CLK               ;拉低CLK
  576.         JNB         ACC.0,WBY2        ;A寄存器的低位(0位)如果为0就转移
  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寄存器内容带进位循环右移
  587.         DJNZ        R7,WBY1         ;如果还未发送完8bit数据就继续
  588.         CLR         CLK             ;8位数据发送完了
  589.         MOV         R7,#20          ;设置等待应答信号延时计数
  590. WBY5:
  591.         JNB         DIO,WBY6        ;判断TM1637发过来的ACK应答信号,应答就转移(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个扇区,
  633. ;第1扇区:0000H~01FFH;第2扇区:0200H~03FFH……
  634. ;----------------------------------------------------
  635. ;
  636. ;------- 读EEPROM保存的各项设置,如果没有就保存当前的设置值 ---------
  637. REEP:
  638.         LCALL        RE00              ;读EEPROM
  639.         JNC        WEEP                ;无数据(C=0)就转移,保存当前的设置值
  640.         RET
  641. WEEP:
  642.         LCALL        BCJDQ                ;全功率驱动继电器保持至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
  643.         MOV          IAP_ADDRH,#00H        ;第一个扇区地址的高8位
  644.         MOV          IAP_ADDRL,#00H        ;第一个扇区地址的低8位
  645.         LCALL        Sector_Erase        ;擦除整个扇区
  646.         MOV          R1,#FWBZ1           ;首地址
  647.         MOV          R2,#30              ;共写入20个字节
  648. WEEP1:
  649.         MOV          A,@R1                ;装入R1指向的RAM地址的内容到A
  650.         LCALL        Byte_Program         ;写入EEPROM
  651.         INC          IAP_ADDRL            ;EEPROM地址加1
  652.         INC          R1                   ;RAM地址增1
  653.         DJNZ         R2,WEEP1             ;未保存完就转移继续
  654.         MOV          IAP_ADDRL,#0         ;保存完了,扇区地址低位指向0(当前扇区首址)
  655.         LCALL        Byte_Read            ;读出来检查看是否写入成功
  656.         CJNE         A,FWBZ1,WEEP3        ;如果与EEPROM数据判断标志1不相同就转移
  657.         INC          IAP_ADDRL            ;EEPROM地址加1
  658.         LCALL        Byte_Read            ;读第二个字节
  659.         CJNE         A,FWBZ2,WEEP3        ;如果与EEPROM数据判断标志2不相同就转移
  660.         RET                        ;成功了,退出
  661. WEEP3:
  662.         SETB        XSKG                ;“显示开关”置为1,关闭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保存的各项设置 ----------
  674. RE00:
  675.         LCALL        BCJDQ                ;全功率驱动继电器保持至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
  676.         MOV          IAP_ADDRH,#00H        ;第一个扇区地址的高8位
  677.         MOV          IAP_ADDRL,#00H        ;第一个扇区地址的低8位
  678.         LCALL        Byte_Read           ;读第一个字节,返回:A=读出的数据
  679.         CJNE         A,FWBZ1,RE02        ;如果不是原来保存的数据就转移
  680.         INC          IAP_ADDRL           ;EEPROM字节地址增1
  681.         LCALL        Byte_Read           ;读第二个字节
  682.         CJNE         A,FWBZ2,RE02        ;如果不是原来保存的数据就转移
  683.         MOV          R1,#FWBZ2           ;从FWBZ2+1处开始放置读出的设置值
  684.         MOV          R2,#28              ;再读出28个字节
  685. RE01:
  686.         INC          R1                  ;RAM地址增1
  687.         INC          IAP_ADDRL           ;EEPROM字节地址增1
  688.         LCALL        Byte_Read           ;读一个字节,返回:A=读出的数据
  689.         MOV          @R1,A               ;放到R1指向的RAM地址
  690.         DJNZ         R2,RE01             ;未读完就继续
  691.         SETB        C                ;把C置为1,读取成功
  692.         RET
  693. RE02:
  694.         CLR        C                ;把C置为0,没有数据
  695.         RET

  696. ;-------------------------------
  697. ;EEPROM操作需要数毫秒以上,期间MCU会暂停,PWM停止。
  698. ;全功率驱动使继电器保持吸合状态至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
  699. BCJDQ:
  700.         LCALL        SETPWM          ;设置“延时PWM驱动”时间
  701.         SETB        EEPBC                ;“EEPROM操作子程序调用”标志置为1,使T0中断暂停执行继电器控制程序
  702.           LCALL        CTL00                ;控制继电器
  703.         CLR        EEPBC                ;标志置为0
  704.         RET

  705. ;-------------------------------
  706. ;读一个字节,A=读出的数据
  707. Byte_Read:
  708.         MOV        IAP_CONTR,#80H                ;打开IAP功能
  709.         MOV        IAP_TPS,#12                ;设置等待参数
  710.         MOV        IAP_CMD,#01                  ;设置IAP读命令
  711.         MOV        IAP_TRIG,#05AH               ;触发命令
  712.         MOV        IAP_TRIG,#0A5H               ;触发命令
  713.         NOP
  714.         MOV        A,IAP_DATA                   ;读出的数据在IAP_DATA,送入累加器A
  715.         RET

  716. ;-------------------------------
  717. ;字节编程,A=需写入的数据
  718. Byte_Program:
  719.         MOV        IAP_CONTR,#80H                ;打开IAP功能
  720.         MOV        IAP_TPS,#12                ;设置等待参数
  721.         MOV        IAP_CMD,#02                  ;设置IAP写命令
  722.         MOV        IAP_DATA,A                   ;要写入的数据先送进IAP_DATA寄存器
  723.         MOV        IAP_TRIG,#05AH               ;触发命令
  724.         MOV        IAP_TRIG,#0A5H               ;触发命令
  725.         RET

  726. ;-------------------------------
  727. ;擦除扇区
  728. Sector_Erase:
  729.         MOV        IAP_CONTR,#80H                ;打开IAP功能
  730.         MOV        IAP_TPS,#12                ;设置等待参数
  731.         MOV        IAP_CMD,#03                  ;设置IAP擦除命令
  732.         MOV        IAP_TRIG,#05AH               ;触发命令
  733.         MOV        IAP_TRIG,#0A5H               ;触发命令
  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
复制代码

打赏

参与人数 5家元 +83 收起 理由
alszy + 20 優秀文章
cushion + 20 謝謝分享
jpdd521 + 5 编程这么费事啊,瞬间不想玩了。。.
玛德陛下 + 20 謝謝分享
慕名而来 + 18 優秀文章

查看全部打赏

回复 支持 4 反对 0

使用道具 举报

 楼主| 发表于 2022-8-16 04:13:00 | 显示全部楼层
本来是很整齐的,一发上来就参差不齐了,奇怪
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-16 05:55:58 来自手机浏览器 | 显示全部楼层
用汇编,很牛。
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-16 06:40:56 | 显示全部楼层
哥 5旬可算不上老汉啊
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-16 06:49:34 来自手机浏览器 | 显示全部楼层
牛人啊,佩服佩服
回复 支持 反对

使用道具 举报

发表于 2022-8-16 06:59:33 | 显示全部楼层
虽说改装到此款风扇意义不大,不如买款落地式艾美特风扇,小挡基本可以静音微风了,相对此款还不容易伤身体,敬佩学习是一种进步学习,这才是重点
回复 支持 反对

使用道具 举报

发表于 2022-8-16 07:17:04 来自手机浏览器 | 显示全部楼层
太腻害了,硬码编程
回复 支持 反对

使用道具 举报

发表于 2022-8-16 07:46:42 | 显示全部楼层
有上学时的感觉protel99  51单片机 汇编自己做点东西,标注的相当详细
回复 支持 反对

使用道具 举报

发表于 2022-8-16 07:48:01 来自手机浏览器 | 显示全部楼层
业余还是用c吧,汇编可移植性,易读性都不好,就是效率高,可现在单片机高性能的太多选择
回复 支持 反对

使用道具 举报

发表于 2022-8-16 07:58:27 | 显示全部楼层
继电器的保持电流比吸合电流要小的多,为了降低继电器的电能消耗,还有一种方式是串联一个电阻,电阻上并联一个大电容
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-16 07:59:12 | 显示全部楼层
50岁学编程记指令。
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:01:22 | 显示全部楼层
看了你的标题,忽然感觉自己也老了,也马上是五旬老汉了!汇编估计是你上大学时学的吧,这么多年还没有忘记,真是难得!如果是刚刚学习单片机,现在都是从C学起了,只有咱们那个年代才是从汇编学起!
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-16 08:10:44 来自手机浏览器 | 显示全部楼层
佩服啊,汇编写这么长!
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:31:45 | 显示全部楼层
杨小强厉害,真有闲心玩
回复 支持 0 反对 0

使用道具 举报

发表于 2022-8-16 08:46:41 | 显示全部楼层
只能说厉害厉害厉害。
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:48:35 | 显示全部楼层
汇编语言,厉害
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:52:05 | 显示全部楼层
本人4旬老汉也学不会,腻害
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:58:31 | 显示全部楼层
串联电容,原理是利用交流容抗,达到限制电流目的。。。其实可以用可控硅,检测零点,斩波控制。效果也差不多,而且没机械噪声
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 21:52 , Processed in 0.202800 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表