数码之家

 找回密码
 立即注册
搜索
查看: 6423|回复: 14

[C51] STC89C51RC+TM1637显示模块+EC11编码器,电风扇长定时+自然风升级版

[复制链接]
发表于 2020-7-18 07:52:33 | 显示全部楼层 |阅读模式

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

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

x
上次制作的电风扇长定时+自然风,一直觉得不自然,现在升级加了个“渐慢——渐快”变化方式和慢速档(按编码器开关3次快速进入转速调整),用起来不那么生硬,仍然保留间歇通/断电方式。升级版需增加一个过零检测电路接到外部中断INT0,编码器的A、B、K改接P3.3(INT1)、P3.4、P3.5,不能用按键代替编码器了,转速调整共设20级,再往上调变化不明显,意义不大。改变可控硅导通角的调速方式电机会产生嗡嗡响的噪音,所以采用每间隔1~20个过零检测信号脉冲,截止一个正半周一个负半周的调速方式,但也有缺点,低速时电机会有抖动现象,只要速度不调得太低,影响不大。本人只知道一点点汇编语言,别的语言也不懂,从自学编程到现在,算起来平均一年编程不到一次,并不熟练,应该会有很多不规范和罗嗦的地方


原理图:
电路原理图.JPG

源程序:
  1. ;STC89C51RC+TM1637显示模块+EC11编码器,电风扇长定时+自然风汇编程序
  2. ;杨小强,2020年7月
  3. ;晶振:11.0592MHz
  4. ;显示:(TM1637)4位数码管显示模块
  5. ;调整、设置:EC11带开关5脚旋转编码器
  6. ;电源:闲置5V手机充电器
  7. ;
  8. ;最长定时99小时59分59秒;自然风周期可调,有渐慢——渐快、间歇通/断电两种方式可选择
  9. ;如果过零检测不接或者有故障将没有慢速功能,自然风自动改为间歇通/断电方式
  10. ;
  11. ;按编码器开关1次:常速/自然风切换
  12. ;按编码器开关2次:常速/慢速切换。两次按键动作之间不大于0.6秒
  13. ;按编码器开关3次:快速进入慢速时的转速调整,1~20级;自然风状态渐慢时降到这里设置的转速。
  14. ;                 12级以上时转速调整变化不明显,自然风状态将没有渐慢——渐快循环。
  15. ;                 60秒无任何操作或按编码器开关自动保存并退出。
  16. ;
  17. ;长按编码器开关5秒以上15秒以内,松开按键后进入设置状态,设置完第7项按编码器开关1次后又跳转到第一项
  18. ;退出设置状态:15秒无任何操作或按编码器开关2次自动保存并退出。
  19. ;根据数码管左边显示的数字进行以下各项设置,通过旋转编码器加或减,按编码器开关1次进入下一项设置:
  20. ;一、显示1——设置自然风状态时,常速——慢速周期时长,10~60秒,默认20秒
  21. ;二、显示2——设置自然风间歇通/断电方式时常速通电时长,最短为1秒;最长为上一项所设的周期减3秒
  22. ;三、显示3——设置3小时以下定时调整时,编码器每转动一格的增(减)值:5、10、15、20、25、30分钟,默
  23. ;         认10分钟,3小时以上增(减)值30分钟;10小时以上增(减)值1个小时;20小时以上增(减)值2个小时
  24. ;四、显示4——设置电风扇插电就自动填入的定时时间,0~30小时,默认8小时
  25. ;五、显示5——设置数码管亮度,1~8级,默认为3级
  26. ;六、显示6——设置自然风方式,0=渐慢——渐快变化方式,1=间歇通/断电方式
  27. ;七、显示7——设置慢速状态时的转速,1~20级,本项60秒无任何操作自动保存并退出。
  28. ;
  29. ;长按编码器开关15秒:恢复各项默认设置,数码管显示88:88
  30. ;设置保存失败显示5秒E1
  31. ;
  32. ;--------------------------- 端口定义 ---------------------------
  33.         CLK        EQU P1.5   ;接显示模块TM1637的CLK
  34.         DIO        EQU P1.6   ;接显示模块TM1637的DIO
  35.         GLJC        EQU P3.2   ;过零检测,外部中断INT0
  36.         EC11A        EQU P3.3   ;接编码器的A引脚,外部中断INT1
  37.         EC11B        EQU P3.4   ;接编码器的B引脚
  38.         EC11K        EQU P3.5   ;接编码器的按键开关引脚
  39.         RLED        EQU P0.4   ;慢速状态LED指示灯,低电平亮;单片机发生复位时也亮
  40.         LED        EQU P0.5   ;自然风状态LED指示灯,低电平亮
  41.         MOC        EQU P0.7   ;接MOC3022光控可控硅,低电平时风扇电机通电

  42. ;--------------------------- 位地址及RAM的使用 ---------------------------
  43. ;(20H)第0位:1=编码器已经转动,等待主程序处理,0=没有转动或主程序已处理
  44. ;(20H)第1位:1=编码器顺时针正转;0=编码器逆时针反转
  45. ;(20H)第2位:1=自然风状态;0=正常状态
  46. ;(20H)第3位:1=禁止;0=允许。进行各项设置时使用,允许/禁止检查剩余时间
  47. ;(20H)第4位:1=闪烁显示;0=不闪烁。进行各项设置时用
  48. ;(20H)第5位:1=不显示,0=显示,数字及冒号闪烁时用,由T0中断每0.5秒取反一次
  49. ;(20H)第6位:1=主程序显示3秒88:88或5秒E1;0=正常
  50. ;(20H)第7位:1=慢速状态;0=常速。“常速/慢速”切换
  51. ;(21H)第8位:1=允许;0=禁止。渐变控制标志
  52. ;(21H)第9位:1=渐快;0=渐慢。渐变控制时的调速方向

  53.         FWBZ1        EQU        022H        ;复位判断标志1,也作EEPROM数据判断标志
  54.         FWBZ2        EQU        023H        ;复位判断标志2,也作EEPROM数据判断标志
  55.         ZRFZQ        EQU        024H        ;自然风时状态常速——慢速变化周期时长
  56.         ZRFSJ        EQU        025H        ;自然风时电机常速通电时长
  57.         BMQZJ        EQU        026H          ;编码器每转动一小格的增(减)值
  58.         SDDS        EQU        027H        ;上电就自动设定的定时时间(小时)
  59.         SMGLD        EQU        028H          ;数码管亮度
  60.         ZRFFS        EQU        029H        ;自然风方式
  61.         MSZTZS        EQU        02AH        ;慢速状态转速
  62.         DSSJS        EQU        02BH        ;定时时间,时
  63.         DSSJF        EQU        02CH          ;定时时间,分
  64.         DSSJM        EQU        02DH        ;定时时间,秒
  65.         ZQ        EQU        02EH        ;T0、INT0中断使用,自然风常速——慢速周期时长
  66.         SJ        EQU        02FH        ;T0、INT0中断使用,自然风时电机常速通电时长
  67.         SJJS        EQU        030H          ;时间计数,每10毫秒减1,为0后定时时间减1秒,重新放入定义的计数值
  68.         MJS        EQU        031H        ;按键处理时用,秒计数,每秒减1,直到为0
  69.         SSSC        EQU        032H        ;闪烁时长,每秒减1,直到为0
  70.         XSHC1        EQU        033H        ;上次显示的内容,与当前不同就立即显示,相同就每0.5秒显示一次
  71.         XSHC2        EQU        034H        ;上次显示的内容,与当前不同就立即显示,相同就每0.5秒显示一次
  72.         XXSZ        EQU        035H        ;下限数值,进行各项设置时用
  73.         SXSZ        EQU        036H        ;上限数值,进行各项设置时用
  74.         WCZSJ        EQU        037H         ;无操作时间,进行各项设置时用
  75.         ZXM1        EQU        038H        ;显示用,待发送到TM1637的字形码1
  76.         ZXM2        EQU        039H        ;显示用,待发送到TM1637的字形码2
  77.         ZXM3        EQU        03AH        ;显示用,待发送到TM1637的字形码3
  78.         ZXM4        EQU        03BH        ;显示用,待发送到TM1637的字形码4
  79.         DSZJ        EQU        03CH        ;加减定时时间使用
  80.         JCGLMC1        EQU        03DH         ;检查过零脉冲用
  81.         JCGLMC2        EQU        03EH         ;检查过零脉冲用
  82.         GLMC        EQU        03FH         ;过零脉冲计数
  83.         DDMC        EQU        040H         ;断电脉冲计数
  84.         MSZS        EQU        041H         ;T0、INT0中断使用,设置的转速级数
  85.         JBJS1        EQU        042H         ;T0、INT0中断使用,渐变计数
  86.         JBJS2        EQU        043H         ;T0、INT0中断使用,渐变计数
  87.         JKTZSJ        EQU        044H        ;渐快——渐慢变化调整时用
  88.         DISPL        EQU        045H         ;设置要显示的目标:
  89.                                 ;0=显示定时时间
  90.                                 ;1=显示1——设置自然风状态时的常速——慢速周期时长
  91.                                 ;2=显示2——设置自然风时电机常速通电时长
  92.                                 ;3=显示3——设置3小时以下定时调整时,编码器每转动一小格的增(减)值
  93.                                 ;4=显示4——设置上电自动填入的定时时间
  94.                                 ;5=显示5——设置数码管亮度
  95.                                 ;6=显示6——设置自然风方式
  96.                                 ;7=显示7——设置慢速时的转速

  97. ;--------------- 看门狗、EEPROM特殊功能寄存器地址 ---------------
  98.         AUXR                EQU 08EH        ;辅助寄存器
  99.         WDT_CONTR        EQU 0E1H        ;看门狗地址
  100.         IAP_DATA         EQU 0E2H        ;数据寄存器,读出、写入的数据放在此处
  101.         IAP_ADDRH        EQU 0E3H        ;地址寄存器高八位
  102.         IAP_ADDRL        EQU 0E4H        ;地址寄存器低八位
  103.         IAP_CMD                EQU 0E5H        ;命令寄存器,0=关闭,1=读,2=写,3=擦除
  104.         IAP_TRIG        EQU 0E6H        ;命令触发寄存器,每次操作先放入46H再放入B9,命令立即被触发起动
  105.         IAP_CONTR        EQU 0E7H        ;控制寄存器,Flash操作允许/禁止及等待时间
  106.         ENABLE_IAP        EQU 083H ;定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数,时钟<12MHz时为83H

  107. ;=====================================================================================
  108.         ORG        0000H
  109.         LJMP        START

  110.         ORG        0003H                ;外部中断INT0入口
  111.         LJMP        INT_0                ;外部中断INT0入口

  112.         ORG        000BH                ;T0中断入口
  113.         LJMP        T0INT                ;T0中断入口

  114.         ORG        0013H                ;外部中断INT1入口
  115.         LJMP        INT_1                ;外部中断INT1入口

  116.         ORG        0030H                ;程序代码始址安排在30H

  117. ;----------------------------------------------------------------------------------------
  118. ;定义时间计数值,当定时时间实际走时误差较大时,可调整此数值使误差减小
  119. ;例如每分钟快7秒,就把此数值改为112D(7秒÷60秒×100≈12,12+100=112);每分钟慢6秒,就
  120. ;把此数值改为90D(6秒÷60秒×100=10,100-10=90)
  121. ;----------------------------------------------------------------------------------------
  122. HMJS:        DB        100D                ;定义时间计数值,100表示100×10毫秒=1秒,后面的D表示是十进制数

  123. ;--------------- 定时器0中断(10毫秒产生一次中断) ---------------
  124. T0INT:        PUSH        ACC
  125.         PUSH        PSW
  126.         LCALL        TIME                ;处理各项时间
  127.         LCALL        DISPLAY                ;显示
  128.         LCALL        JCGLMC                ;检查过零检测脉冲,如果有故障就由本中断控制可控硅、LED指示灯
  129.         POP        PSW
  130.         POP        ACC
  131.         RETI

  132. ;--------------- 外部中断INT0,接过零检测电路,控制转速、状态LED指示灯 ---------------
  133. INT_0:        PUSH        ACC
  134.         PUSH        PSW
  135.         LCALL        Control                ;根据条件控制可控硅、状态LED指示灯
  136.         POP        PSW
  137.         POP        ACC
  138.         RETI

  139. ;------ 外部中断INT1,P3.3接编码器A引脚 ------
  140. INT_1:        SETB        EC11B                ;拉高编码器B引脚电平
  141.         PUSH        PSW
  142.         JB        00H,INT1_2        ;如果位地址0H为1就退出中断处理程序,等待主程序处理
  143.         SETB        00H                ;把位地址00H置为1,表示编码器已转动,等待主程序处理
  144.         JB        EC11B,INT1_1        ;如果编码器B引脚为1(高电平)就转移,说明是顺时针正转
  145.         CLR        01H                ;是0(低电平),逆时针反转,把位地址01H置为0
  146.         LJMP        INT1_2
  147. INT1_1:        SETB        01H                ;是顺时针正转,把位地址01H置为1
  148. INT1_2:        POP        PSW
  149.         RETI

  150. ;--------------- 设置各项默认值 ----------------
  151. SZMRZ:        MOV        ZRFZQ,#20        ;自然风状周期时长(秒)
  152.         MOV        ZRFSJ,#5        ;自然风间歇通/断电方式时的电机通电时长(秒)
  153.         MOV        BMQZJ,#10          ;编码器每转动一小格的+、-值(分钟))
  154.         MOV        SDDS,#8                ;上电就自动设定的定时时间(小时)
  155.         MOV        SMGLD,#3          ;数码管亮度,8级亮度最高
  156.         MOV        ZRFFS,#0        ;自然风方式,0=渐慢——渐快循环方式
  157.         MOV        MSZTZS,#8        ;慢速状态转速
  158.         RET

  159. ;--------------- T0、INT0、INT1中断设置 ----------------
  160. SETINT:        ANL        AUXR,#7FH        ;定时器时钟12T模式
  161.         ANL        TMOD,#0F0H        ;设置定时器模式
  162.         MOV        TL0,#000H        ;设置定时初值,10毫秒产生一次中断(晶振:11.0592MHz)
  163.         MOV        TH0,#0DCH        ;设置定时初值,10毫秒产生一次中断(晶振:11.0592MHz)
  164.         CLR        TF0                ;清除TF0标志
  165.         SETB        ET0                ;允许定时器0中断
  166.         SETB        TR0                ;定时器0开始计时
  167.         SETB        IT0                ;设外部中断INT0为下降沿触发
  168.         SETB        EX0                ;允许外部中断INT0
  169.         SETB        PX0                ;设外部中断INT0为高优先级
  170.         SETB        IT1                ;设外部中断INT1为下降沿触发
  171.         SETB        EX1                ;允许外部中断INT1
  172.         SETB        EA                ;允许全局中断
  173.         RET

  174. ;---- 启动看门狗及喂狗,11.0592MHz预分频数=4(142.2毫秒),00111001B(39H) ----
  175. WG:        MOV        WDT_CONTR,#00111001B
  176.         RET

  177. ;********************************* 主程序开始 ********************************
  178. START:        MOV        SP,#050H        ;设置堆栈指针
  179.         MOV        A,FWBZ1                ;
  180.         CJNE        A,#0C8H,START0        ;
  181.         MOV        A,FWBZ2                ;检查复位判断标志,不相同说明是初次上电,从初始化开始运行
  182.         CJNE        A,#0D9H,START0        ;
  183.         LCALL        SETINT                ;中断设置
  184.         CLR        RLED                ;RAM内容没变,说明是被干扰等原因复位,不是初次上电,点亮复位LED指示灯
  185.         MOV        A,DISPL                ;
  186.         CJNE        A,#7,SAT        ;不管是什么原因复位,只要RAM不被改变就跳过初始化,继续运行
  187.         LJMP        STARTD                ;
  188. SAT:        CJNE        A,#6,SAT0        ;
  189.         LJMP        STARTC        
  190. SAT0:        CJNE        A,#5,SAT1        ;
  191.         LJMP        STARTB                ;
  192. SAT1:        CJNE        A,#4,SAT2        ;
  193.         LJMP        STARTA                ;
  194. SAT2:        CJNE        A,#3,SAT3        ;根据DISPL的内容跳转到复位前的位置
  195.         LJMP        START9                ;
  196. SAT3:        CJNE        A,#2,SAT4        ;
  197.         LJMP        START8                ;
  198. SAT4:        CJNE        A,#1,START2        ;
  199.         LJMP        START7                ;
  200. START0:        CLR        A
  201.         MOV        R0,#30H                ;
  202.         MOV        R1,#20H                ;
  203. START1:        MOV        @R1,A                ;初始化,从RAM地址20H开始清零30H个字节
  204.         INC        R1                ;
  205.         DJNZ        R0,START1        ;
  206.         LCALL        SETINT                ;初始化,中断设置
  207.         MOV        FWBZ1,#0C8H        ;初始化,放入复位判断标志1到RAM
  208.         MOV        FWBZ2,#0D9H        ;初始化,放入复位判断标志2到RAM
  209.         LCALL        REEP                ;初始化,读EEPROM保存的各项设置,如果没有就设为默认值并保存
  210.         SETB        RLED                ;初始化,设RLED为高电平,复位LED指示灯不亮
  211. ;
  212. START2:        LCALL        WG                ;喂狗
  213.         MOV        DISPL,#0        ;设置要显示的目标,0=显示定时时间
  214.         CLR        06H                ;位地址06H置为0,显示定时时间
  215.         JNB        00H,START3        ;如果位地址00H为0(编码器没有转动)就转移
  216.         SETB        EC11A                ;拉高编码器A引脚电平
  217.         SETB        EC11B                ;拉高编码器B引脚电平
  218.         JNB        EC11A,START3        ;如果仍为0(低电平)就转移,说明还没有旋转到卡点位置
  219.         JNB        EC11B,START3        ;如果仍为0(低电平)就转移,说明还没有旋转到卡点位置
  220.         LCALL        DSSJZJ                ;AB引脚都为高电平了,已经旋转到卡点位置,根据方向增减定时时间
  221.         CLR        00H                ;把位地址00H置为0,表示已经响应并处理编码器旋转动作
  222. START3:        LCALL        SKEY                ;扫描编码器按键开关
  223.         JNC        START2                ;没有按键动作(C=0)就转移
  224.         LCALL        KEY                ;有按键动作,调用编码器按键开关处理子程序
  225.         CJNE        A,#1,START4        ;如果不是按下1次(正常/自然风切换)就转移
  226.         JNB        07H,STAT2        ;如果当前不是慢速状态就转移
  227.         CLR        07H                ;是慢速状态,位地址第07位置为0,先退出慢速状态
  228. STAT1:        SETB        RLED                ;关LED2
  229.         LJMP        START2
  230. STAT2:        CPL        02H                ;位地址第02位取反,自然风/正常状态切换
  231.         MOV        MSZS,MSZTZS        ;把设置的慢速状态转速放入MSZS
  232.         MOV        ZQ,#0
  233.         MOV        SJ,#0
  234.         LJMP        START2
  235. START4:        CJNE        A,#2,STAT3        ;如果不是2(正常/慢速之间切换)就转移
  236.         CPL        07H                ;是按2次,位地址第07位取反,“正常/慢速”状态切换
  237.         JNB        07H,STAT1        ;如果取反后不是慢速状态就转移,关LED2
  238.         CLR        RLED                ;是慢速状态,点亮LED2
  239.         LJMP        START2
  240. STAT3:        CJNE        A,#3,START5        ;如果不是3(设置慢速状态时的转速)就转移
  241.         LCALL        MSSZ                ;设置慢速状态时的转速
  242.         LJMP        START2
  243. START5:        CJNE        A,#5,START7        ;如果不是5(恢复默认设置)就转移
  244.         LCALL        SZMRZ                ;恢复各项默认设置
  245.         SETB        06H                ;把位地址06H设置为1,数码管显示3秒88:88
  246.         MOV        SSSC,#3                ;3秒
  247.         MOV        ZXM1,#0FFH        ;8
  248.         MOV        ZXM2,#0FFH        ;8
  249.         MOV        ZXM3,#0FFH        ;8
  250.         MOV        ZXM4,#0FFH        ;8
  251.         LCALL        DISP                ;显示
  252. START6:        MOV        A,SSSC
  253.         LCALL        WG                ;喂狗
  254.         JNZ        START6                ;等待SSSC为0秒
  255.         LCALL        WSET                ;保存设置
  256.         LCALL        KEYEX                ;等待按键松开
  257.         LJMP        START2
  258. START7:        MOV        DISPL,#1        ;是4,进入各项设置,1=显示“1——设置自然风状态时通断电周期时长”
  259.         LCALL        ZQSZ                ;周期时长设置
  260.         JNZ        START8                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  261.         LJMP        START2                ;是15秒无操作自动保存返回,设置结束
  262. START8:        MOV        DISPL,#2        ;2=显示“2——设置自然风时电机通电时长”
  263.         LCALL        TDSC                ;通电时长设置
  264.         JNZ        START9                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  265.         LJMP        START2
  266. START9:        MOV        DISPL,#3        ;3=显示“3——设置2小时以下定时调整时,编码器每转动一格的增(减)值”
  267.         LCALL        BMQZJZ                ;编码器增减值设置
  268.         JNZ        STARTA                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  269.         LJMP        START2
  270. STARTA:        MOV        DISPL,#4        ;4=显示“4——设置插电自动填入的定时时间”
  271.         LCALL        SDDSSJ                ;上电定时时间设置(小时)
  272.         JNZ        STARTB                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  273.         LJMP        START2
  274. STARTB:        MOV        DISPL,#5        ;5=显示“5——设置数码管亮度”
  275.         LCALL        LDSZ                ;亮度设置
  276.         JNZ        STARTC                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  277.         LJMP        START2
  278. STARTC:        MOV        DISPL,#6        ;6=显示“6——设置自然风方式”
  279.         LCALL        FSSZ                ;自然风方式设置
  280.         JNZ        STARTD                ;如果是按下编码器按键开关返回,就转移,进行下一项设置
  281.         LJMP        START2
  282. STARTD:        MOV        DISPL,#7        ;7=显示“7——设置慢速时的转速”
  283.         LCALL        MSSZ                ;慢速转速设置
  284.         JNZ        START7                ;如果是按下编码器按键开关返回,就转移到第一项设置
  285.         LJMP        START2                ;是15秒无操作自动保存返回,设置结束

  286. ;-------------------------------------------------------------------------------------
  287. ;子程序:根据编码器旋转方向加减定时时间。
  288. ;3小时及以下,按设置的值加减:5、10、15、20、25、30分钟
  289. ;3小时以上每次增(减)30分钟;10小时以上每次增(减)1个小时;20小时以上每次增(减)2个小时
  290. ;-------------------------------------------------------------------------------------
  291. DSSJZJ:        MOV        DSSJM,#59        ;先放入59到定时时间(秒)
  292.         MOV        A,DSSJS                ;装入定时时间(时)
  293.         CJNE        A,#20,DSZJ1        ;当前“时”是否等于或大于20
  294. DSZJ1:        JC        DSZJ2                ;小于就转移
  295.         MOV        DSZJ,#2                ;等于或大于20,加减2个小时
  296.         LJMP        DSZJ4
  297. DSZJ2:        CJNE        A,#10,DSZJ3        ;当前“时”是否等于或大于10
  298. DSZJ3:        JC        DSZJ8                ;小于就转移
  299.         MOV        DSZJ,#1                ;等于或大于10,加减1个小时
  300. DSZJ4:         JNB        01H,DSZJ6        ;如果位地址01H为0(逆时针反转)就转移
  301.         ADD        A,DSZJ                ;是正转,加
  302.         CJNE        A,#100,DSZJ5        ;加完后是否等于或大于100
  303. DSZJ5:        JC        DSZJ7                ;如果小于就转移,把A放回到DSSJS
  304.         MOV        DSSJS,#99        ;已经大于99了,直接设置为99:59:59
  305.         MOV        DSSJF,#59        ;已经大于99了,直接设置为99:59:59
  306.         RET
  307. DSZJ6:        SUBB        A,DSZJ                ;是反转,减
  308. DSZJ7:        MOV        DSSJS,A                ;把计算结果放入DSSJS
  309.         RET
  310. DSZJ8:        MOV        DSZJ,BMQZJ        ;把设置的“增(减)值”放入DSZJ
  311.         CJNE        A,#3,DSZJ11        ;当前“时”不是3就转移
  312.         JB        01H,DSZJ12         ;是3,如果位地址01H为1(正转)就转移,把DSZJ处的“增(减)值”改为30(分钟)
  313.         MOV        A,DSSJF                ;是反转,装入定时时间(分)
  314.         JZ        DSZJ13                ;如果当前“分”为0(3:00)就转移,按设置的增(减)值减
  315.         CJNE        A,#30,DSZJ9        ;“分”不为0,是否等于或大于30
  316. DSZJ9:        JC        DSZJ10                ;小于就转移,把0放入定时时间(分),使时间变为3:00
  317.         SUBB        A,#30                ;等于或大于,减30分
  318.         MOV        DSSJF,A                ;把计算结果放入定时时间(分)
  319.         RET
  320. DSZJ10:        MOV        DSSJF,#0        ;小于30,把0放入定时时间(分),使时间变为3:00
  321.         RET
  322. DSZJ11:        JC        DSZJ13                 ;小于3就转移
  323. DSZJ12:        MOV        DSZJ,#30        ;大于3:00,把DSZJ处的“增(减)值”改为30(分钟)
  324. DSZJ13:        MOV        A,DSSJF                ;装入定时时间(分)
  325.         JNB        01H,DSZJ16         ;如果位地址01H为0(逆时针反转)就转移
  326.         ADD        A,DSZJ                ;是正转,当前“分”直接加DSZJ处的“增(减)值”
  327.         CJNE        A,#60,DSZJ14        ;加完后“分”是否等于或大于60
  328. DSZJ14:        JC        DSZJ15                ;小于60就转移,把A放入定时时间(分)
  329.         SUBB        A,#60                ;等于或大于60,就减60,然后小时加1
  330.         MOV        DSSJF,A                ;把A放入定时时间(分)
  331.         MOV        A,DSSJS                ;装入“时”
  332.         INC        A                ;小时加1
  333.         MOV        DSSJS,A
  334.         CJNE        A,#3,DSZJ19        ;加完后“时”不是3就转移,退出
  335.         CLR        A                ;加完后大于3:00了,把0放入定时时间(分),使时间变为3:00
  336. DSZJ15:        MOV        DSSJF,A
  337.         RET
  338. DSZJ16:        CJNE        A,DSZJ,DSZJ17        ;是逆时针反转,当前“分”是否等于或大于DSZJ处的“增(减)值”
  339. DSZJ17:        JC        DSZJ20                ;小于就转移
  340.         SUBB        A,DSZJ                ;等于或大于,定时时间(分)减“增(减)值”
  341.         MOV        DSSJF,A                ;把计算结果放入定时时间(分)
  342.         JZ        DSZJ18                ;如果“分”为0就转移
  343.         RET
  344. DSZJ18:        CJNE        A,DSSJS,DSZJ19        ;如果“时”不为0就转移
  345.         MOV        DSSJM,A                ;“时、分”都为0,“秒”也清零
  346. DSZJ19:        RET
  347. DSZJ20:        MOV        A,DSZJ                ;“分”小于“增(减)值”,装入DSZJ处的“增(减)值”
  348.         CLR        C                ;进位标志清0
  349.         SUBB        A,DSSJF                ;“增(减)值”减“定时时间(分)”
  350.         MOV        DSSJF,A                ;减完后的结果暂时放入DSSJF
  351.         MOV        A,#60
  352.         SUBB        A,DSSJF                ;60减上面的计算结果,得出定时时间(分),然后小时减1
  353.         MOV        DSSJF,A                ;得出的数放入定时时间(分)
  354.         MOV        A,DSSJS                ;装入定时时间(时)
  355.         JZ        DSSJQL                ;如果“时”为0就转移(不够减了,把定时时间清零)
  356.         DEC        DSSJS                ;“时”不为0,减1
  357.         RET
  358. DSSJQL: CLR        A
  359.         MOV        DSSJS,A                ;定时时间清零
  360.         MOV        DSSJF,A                ;定时时间清零
  361.         MOV        DSSJM,A                ;定时时间清零
  362.         RET

  363. ;----------------------------------------------------------------------------------------
  364. ;设置自然风周期时长
  365. ;----------------------------------------------------------------------------------------
  366. ZQSZ:        MOV        XXSZ,#10        ;下限为10秒
  367.         MOV        SXSZ,#60        ;上限为60秒
  368.         LCALL        LDSZ1                ;设置
  369.         PUSH        ACC
  370.         MOV        A,ZRFZQ                ;装入自然风周期
  371.         SUBB        A,#3                ;减
  372.         CJNE        A,ZRFSJ,ZQSZ1
  373. ZQSZ1:        JNC        ZQSZ2                ;减完后等于或大于就转移
  374.         MOV        ZRFSJ,A                ;小于,修改为减3后的数
  375.         LCALL        WSET                ;保存设置
  376. ZQSZ2:        POP        ACC
  377.         RET

  378. ;----------------------------------------------------------------------------------------
  379. ;设置自然风时电机常速通电时长,最短为1秒;最长为上一项所设的周期减3秒
  380. ;----------------------------------------------------------------------------------------
  381. TDSC:        MOV        A,ZRFZQ                ;装入“自然风周期”
  382.         SUBB        A,#3                ;减
  383.         MOV        SXSZ,A                ;放入上限值
  384.         MOV        XXSZ,#1                ;下限为1秒
  385.         LJMP        LDSZ1

  386. ;----------------------------------------------------------------------------------------
  387. ;设置2小时以下定时调整时,编码器每转动一小格的增(减)值,5、10、15、20、25、30分钟
  388. ;----------------------------------------------------------------------------------------
  389. BMQZJZ:        MOV        XXSZ,#5                ;下限为5
  390.         MOV        SXSZ,#30        ;上限为30
  391.         MOV        R4,#5                ;调整时的加减步长值
  392.         LJMP        LDSZ2

  393. ;----------------------------------------------------------------------------------------
  394. ;设置插电就自动填入的定时时间,0~30小时
  395. ;----------------------------------------------------------------------------------------
  396. SDDSSJ:        MOV        XXSZ,#0                ;下限为0小时
  397.         MOV        SXSZ,#30        ;上限为30小时
  398.         LJMP        LDSZ1

  399. ;----------------------------------------------------------------------------------------
  400. ;设置数码管亮度,1~8级,8级亮度最高
  401. ;----------------------------------------------------------------------------------------
  402. LDSZ:        MOV        XXSZ,#1                ;下限为1
  403.         MOV        SXSZ,#8                ;上限为8
  404. LDSZ1:        MOV        R4,#1                ;调整时的加减步长值
  405. LDSZ2:        MOV        WCZSJ,#15        ;无操作等待时间15秒
  406.         LJMP        SZTZ

  407. ;----------------------------------------------------------------------------------------
  408. ;设置自然风方式,0=渐慢——渐快变化方式,1=间歇通/断电方式
  409. ;----------------------------------------------------------------------------------------
  410. FSSZ:        MOV        XXSZ,#0                ;下限
  411.         MOV        SXSZ,#1                ;上限
  412.         LJMP        LDSZ1

  413. ;----------------------------------------------------------------------------------------
  414. ;设置慢速时的转速,1~20级,本项60秒无任何操作自动保存并退出。
  415. ;----------------------------------------------------------------------------------------
  416. MSSZ:        MOV        DISPL,#7        ;7=显示“7——慢速状态时的转速设置”
  417.         MOV        XXSZ,#1                ;下限
  418.         MOV        SXSZ,#20        ;上限
  419.         MOV        R4,#1                ;调整时的加减步长值
  420.         MOV        WCZSJ,#60        ;无操作等待时间60秒
  421.         LJMP        SZTZ

  422. ;----------------------------------------------------------------------------------------
  423. ;子程序:根据XXSZ、SXSZ设定的上下限范围、编码器旋转方向,调整DISPL指向的对象。
  424. ;无操作10秒后开始闪烁显示,15秒自动保存并退出;有按键动作就保存并退出
  425. ;入口参数:下限值放入XXSZ;上限值放入SXSZ;R4=加、减步长值
  426. ;出口参数:15秒无操作或按下2次以上自动保存退出A=0;按编码器按键开关1次保存退出A=1
  427. ;----------------------------------------------------------------------------------------
  428. SZTZ:        MOV        MJS,WCZSJ        ;装入无操作等待时间到MJS
  429.         CLR        03H                ;位地址03H置为0,允许检查剩余时间
  430. SZTZ1:        LCALL        SKEY                ;扫描编码器按键开关
  431.         JNC        SZTZ2                ;没有按键动作(C=0)就转移
  432.         LCALL        KEY                ;有按键动作,调用编码器按键开关处理子程序
  433.         CJNE        A,#2,SZTZ11
  434. SZTZ11:        JNC        SZTZ3                ;如果是按下2次以上就转移
  435.         CLR        04H                ;把位地址04H置为0,不闪烁显示
  436.         LCALL        WSET                ;保存设置
  437.         MOV        A,#1                ;按编码器按键开关1次保存退出A=1
  438.         RET
  439. SZTZ2:        JB        00H,SZTZ4        ;如果位地址00H为1(编码器已经转动)就转移
  440.         MOV        A,MJS                ;没有转动,装入秒计数到寄存器A
  441.         JZ        SZTZ3                ;如果秒计数为0(15秒无操作)就转移
  442.         JB        03H,SZTZ1        ;不为0,如果位地址03H为1就转移,不检查剩余时间
  443.         CJNE        A,#5,SZTZ1        ;检查剩余时间,如果不是5秒就转移,继续扫描编码器
  444.         SETB        04H                ;还剩5秒,把位地址04H置为1,设置为闪烁显示
  445.         MOV        SSSC,A                ;闪烁时长5秒放入SSSC
  446.         SETB        03H                ;位地址03H置为1,禁止检查剩余时间
  447.         LJMP        SZTZ1
  448. SZTZ3:        CLR        04H                ;15秒时间到,把位地址04H置为0,不闪烁显示
  449.         LCALL        WSET                ;保存设置
  450.         CLR        A                ;15秒无操作自动保存退出A=0
  451.         RET
  452. SZTZ4:        CLR        04H                ;编码器已经转动,把位地址04H置为0,不闪烁显示
  453.         SETB        EC11A                ;拉高编码器A引脚电平
  454.         SETB        EC11B                ;拉高编码器B引脚电平
  455.         JNB        EC11A,SZTZ        ;如果仍为0(低电平)就转移,说明还没有旋转到卡点位置
  456.         JNB        EC11B,SZTZ        ;如果仍为0(低电平)就转移,说明还没有旋转到卡点位置
  457.         MOV        A,DISPL                ;AB引脚都为高电平,已经旋转到卡点位置了,装入要设置的目标项
  458.         DEC        A                ;减1
  459.         ADD        A,#ZRFZQ        ;加上各项设置的起始地址
  460.         MOV        R0,A                ;把得出的具体地址放入R0
  461.         JB        01H,SZTZ7         ;如果位地址01H为1(顺时针正转)就转移
  462.         MOV        A,XXSZ                ;是反转,装入下限数值到A寄存器
  463.         ADD        A,R4                ;加步长值
  464.         MOV        MJS,A                ;把下限值+步长值的结果暂时放入MJS
  465.         MOV        A,@R0                ;装入R0指向的RAM地址的调整对象数值
  466.         CJNE        A,MJS,SZTZ5        ;调整对象数值与“下限值+步长值”比较
  467. SZTZ5:        JC        SZTZ6                ;如果调整对象数值小于“下限值+步长值”(不够减)就转移
  468.         SUBB        A,R4                ;等于或大于,减步长值
  469.         MOV        @R0,A                ;把计算结果放回去
  470.         LJMP        SZTZ10
  471. SZTZ6:        MOV        @R0,XXSZ        ;不够减了,直接放入下限值
  472.         LJMP        SZTZ10
  473. SZTZ7:        MOV        A,@R0                ;是正转,装入R0指向的RAM地址的调整对象数值
  474.         ADD        A,R4                ;加步长值
  475.         CJNE        A,SXSZ,SZTZ8        ;加完后与上限数值比较
  476. SZTZ8:        JC        SZTZ9                ;如果小于就转移
  477.         MOV        @R0,SXSZ        ;等于或大于,直接放入上限值
  478.         LJMP        SZTZ10
  479. SZTZ9:        MOV        @R0,A                ;小于上限数值,把计算结果放回去
  480. SZTZ10:        CLR        00H                ;把位地址00H置为0,表示已经处理编码器旋转动作
  481.         LJMP        SZTZ

  482. ;----------------------------------------------------------------------------------------
  483. ;子程序:编码器按键开关处理
  484. ;出口参数:A=1(按了1次);A=2(按了2次);A=3(按了3次);A=4长按达到了5秒;A=5长按达到了15秒
  485. ;----------------------------------------------------------------------------------------
  486. KEY:        MOV        MJS,#15                ;放入等待时间,15秒
  487. KEY1:        MOV        A,MJS                ;装入等待时间
  488.         JNZ        KEY2                ;如果不为0就转移,时间未到
  489.         MOV        A,#5                ;为0,时间到了,放入5到A寄存器,长按达到了15秒
  490.         RET
  491. KEY2:        LCALL        SKEY                ;扫描按键
  492.         JC        KEY1                ;如果C=1(按键还没松开),就继续扫描
  493.         CJNE        A,#10,KEY3        ;按键松开了,剩余时间与10比较,不等于就转移
  494.         LJMP        KEY4                ;等于10,长按时间达到了5秒(15-10=5)
  495. KEY3:        JNC        KEY5                ;大于10就转移
  496. KEY4:        MOV        A,#4                ;等于或小于10,放入4到A寄存器,长按时间达到了5秒以上
  497.         RET
  498. KEY5:        LCALL        KEYA                ;大于10,按下的时间小于5秒,扫描按键600毫秒
  499.         JZ        KEY6                ;如果600毫秒内有按键动作就转移
  500.         RET                        ;600毫秒内没有按键动作,这时A=1(按了1次),退出
  501. KEY6:        LCALL        KEYEX                ;等待第二次按键松开
  502.         LCALL        KEYA                ;按键松开了,扫描按键600毫秒
  503.         JZ        KEY7                ;如果600毫秒内有按键动作就转移
  504.         MOV        A,#2                ;600毫秒内没有按键动作,A=2(按了2次)
  505.         RET
  506. KEY7:        LCALL        KEYEX                ;等待第三次按键松开
  507.         MOV        A,#3                ;第三次按键松开了,A=3(按了3次)
  508.         RET

  509. ;------------------ 扫描按键开关600毫秒,有按键动作A=0,无按键动作A=1 ------------------
  510. KEYA:        PUSH        03H
  511.         MOV        03H,#60                ;等待600毫秒,10*60=600毫秒
  512. KEYB:        MOV        A,SJJS                ;装入(10)毫秒计数
  513. KEYC:        CJNE        A,SJJS,KEYD        ;如果不相同就转移,说明时间已经过了10毫秒
  514.         LCALL        SKEY                ;扫描按键
  515.         JC        KEYE                ;如果有按键动作(C=1)就转移
  516.         LJMP        KEYC
  517. KEYD:        DJNZ        03H,KEYB        ;03H减1,不为0就转移,继续扫描
  518.         POP        03H
  519.         MOV        A,#1                ;600毫秒等待时间已到,A=1没有按键动作
  520.         RET
  521. KEYE:        POP        03H
  522.         CLR        A                ;600毫秒内有按键动作A=0
  523.         RET

  524. ;------------------ 等待按键松开 ------------------
  525. KEYEX:        LCALL        SKEY                ;扫描按键
  526.         JC        KEYEX                ;如果C=1(按键还没松开),就继续扫描
  527.         RET

  528. ;------------------ 按键开关扫描,未按C=0,已按下C=1 ------------------
  529. SKEY:        SETB        EC11K                ;按键开关设为高电平
  530.         JNB        EC11K,SKEY1        ;为0(低电平)就转移,表示按键开关已经被按下
  531. SKEY0:        CLR        C                ;为1(高电平),C置为0,没有按键动作
  532.         LCALL        WG                ;喂狗
  533.         RET
  534. SKEY1:        PUSH        00H                ;按键已被按下,延时10毫秒
  535.         PUSH        01H                ;延时10毫秒
  536.         MOV        00H,#87                ;延时10毫秒
  537.         MOV        01H,#10                ;延时10毫秒
  538. SKEY2:        DJNZ        01H,SKEY2        ;延时10毫秒
  539.         DJNZ        00H,SKEY2        ;延时10毫秒
  540.         POP        01H                ;延时10毫秒
  541.         POP        00H                ;延时10毫秒
  542.         SETB        EC11K                ;延时结束后再次把按键开关设为高电平
  543.         JB        EC11K,SKEY0        ;为1就转移,按键开关未被有效按下
  544.         SETB        C                ;为1,按键动作有效,置C为1
  545.         LCALL        WG                ;喂狗
  546.         RET

  547. ;*************************** 以下为EEPROM操作子程序 **********************************
  548. ;STC89C51RC有4K字节的EEPROM,由8个扇区组成,每个扇区512字节,地址2000H-2FFFH
  549. ;第1扇区:2000H~21FFH,第2扇区:2200H~23FFH……第8扇区:2E00H~2FFFH
  550. ;-------------------------------------------
  551. ;读一字节,A=读出的数据
  552. Byte_Read:
  553.         MOV        IAP_CONTR,#ENABLE_IAP        ;打开IAP功能,设置Flash操作等待时间(83H)
  554.         MOV        IAP_CMD,#01                ;设置为IAP/ISP/EEPROM字节读模式命令(1)
  555.         MOV        IAP_TRIG,#46H                ;先送46H
  556.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被触发起动
  557.         NOP
  558.         MOV        A,IAP_DATA                ;读出的数据在IAP_DATA单元中,送入累加器A
  559.         RET
  560. ;-------------------------------------------
  561. ;字节编程,A=需写入的数据
  562. Byte_Program:
  563.         MOV        IAP_CONTR,#ENABLE_IAP        ;打开IAP功能,设置Flash操作等待时间(83H)
  564.         MOV        IAP_CMD,#02                ;设置为IAP/ISP/EEPROM字节编程模式命令(2)
  565.         MOV        IAP_DATA,A                ;要编程的数据先送进IAP_DATA寄存器
  566.         MOV        IAP_TRIG,#46H                ;先送46H
  567.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被触发起动
  568.         RET
  569. ;-------------------------------------------
  570. ;擦除扇区
  571. Sector_Erase:
  572.         MOV        IAP_CONTR,#ENABLE_IAP        ;打开IAP功能,设置Flash操作等待时间(83H)
  573.         MOV        IAP_CMD,#03                ;设置为IAP/ISP/EEPROM扇区擦除模式命令(3)
  574.         MOV        IAP_TRIG,#46H                ;先送46H
  575.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被触发起动
  576.         NOP
  577.         RET

  578. ;---------- 读EEPROM保存的各项设置,如果没有就设置为默认值并保存 ------------
  579. REEP:        LCALL        RE00                ;读EEPROM保存的各项设置
  580.         MOV        A,SDDS                ;装入“上电就自动设定的定时时间(小时)”
  581.         JZ        REEP0                ;如果是0就转移,退出
  582.         MOV        DSSJS,A                ;放入“定时时间(小时)”
  583.         MOV        DSSJM,#59        ;放入59到“定时时间(秒)”
  584. REEP0:        RET
  585. RE00:        MOV        IAP_ADDRH,#020H        ;从第一个扇区开始搜索,地址的高8位
  586. RE01:        MOV        IAP_ADDRL,#0        ;从第一个扇区开始搜索,地址的低8位
  587.         LCALL        Byte_Read        ;读第一个字节,返回:A=读出的数据
  588.         CJNE        A,FWBZ1,RE03        ;是否保存在当前扇区,不是就转移到RE03
  589.         INC        IAP_ADDRL        ;EEPROM字节地址增1
  590.         LCALL        Byte_Read        ;读第二个字节
  591.         CJNE        A,FWBZ2,RE03        ;第二个字节是否相符
  592.         MOV        R1,#ZRFZQ        ;相符,从ZRFZQ开始放置读出的设置值
  593.         MOV        R2,#7                ;总共7个字节
  594. RE02:        INC        IAP_ADDRL        ;EEPROM字节地址增1
  595.         LCALL        Byte_Read        ;读一个字节,返回:A=读出的数据
  596.         MOV        @R1,A                ;放到R1指向的RAM地址
  597.         INC        R1                ;RAM地址增1
  598.         DJNZ        R2,RE02                ;未读完就继续
  599.         RET                        ;读完了,退出
  600. RE03:        MOV        A,IAP_ADDRH        ;装入扇区地址的高8位
  601.         ADD        A,#2                ;扇区增1
  602.         MOV        IAP_ADDRH,A        ;放入IAP_ADDRH
  603.         CJNE        A,#30H,RE01        ;如果未搜索完最后一个扇区+2(2EH+2=30H)就转移,继续搜索
  604.         LCALL        SZMRZ                ;已经搜索全部八个扇区,未找到保存的内容,设置为默认值
  605.         MOV        R0,#8                ;总扇区数量,共8个扇区
  606.         LJMP        WSET3                ;跳转到WSET3保存设置

  607. ;------------------ 保存设置,不固定保存到某个扇区,各扇区轮流使用 ------------------
  608. WSET:        MOV        R0,#8                ;扇区总数量,共8个扇区
  609.         MOV        IAP_ADDRH,#020H        ;从第一个扇区开始搜索上次保存的设置
  610. WSET1:        MOV        IAP_ADDRL,#0        ;地址低位指向第一个字节
  611.         LCALL        Byte_Read        ;读第一个字节,返回:A=读出的数据
  612.         CJNE        A,FWBZ1,WSET7        ;如果与EEPROM数据判断标志1不相同就转移
  613.         INC        IAP_ADDRL        ;第一个字节相同,EEPROM字节地址增1
  614.         LCALL        Byte_Read        ;读第二个字节
  615.         CJNE        A,FWBZ2,WSET7        ;如果与EEPROM数据判断标志2不相同就转移
  616.         MOV        IAP_ADDRL,#0        ;是在当前扇区,地址指向扇区第一个字节
  617.         LCALL        Sector_Erase        ;擦除当前扇区,另换一个扇区保存
  618. WSET2:        MOV        A,IAP_ADDRH        ;装入扇区地址高位到寄存器A
  619.         CJNE        A,#020H,WSET3        ;当前扇区地址高位如果不是20H(第一个扇区)就转移
  620.         MOV        IAP_ADDRH,#30H        ;是20H,把IAP_ADDRH设置为最后一个扇区+2(2EH+2=30H)
  621. WSET3:        DEC        IAP_ADDRH        ;减1
  622.         DEC        IAP_ADDRH        ;再减1,指向上一个扇区首址
  623.         MOV        IAP_ADDRL,#0        ;低8位指向扇区第一个字节
  624.         LCALL        Sector_Erase        ;擦除整个扇区
  625.         MOV        R1,#FWBZ1        ;要保存的内容始址
  626.         MOV        R2,#9                ;共9个字节
  627. WSET4:        MOV        A,@R1                ;装入R1指向的RAM地址的内容到A
  628.         LCALL        Byte_Program        ;字节编程(写入EEPROM)
  629.         INC        IAP_ADDRL        ;EEPROM地址加1
  630.         INC        R1                ;RAM地址增1
  631.         DJNZ        R2,WSET4        ;未保存完就继续
  632.         MOV        IAP_ADDRL,#0        ;保存完了,扇区地址低位指向0(当前扇区首址)
  633.         LCALL        Byte_Read        ;读出来检查看是否写入成功
  634.         CJNE        A,FWBZ1,WSET5        ;如果与EEPROM数据判断标志1不相同就转移
  635.         INC        IAP_ADDRL        ;EEPROM地址加1
  636.         LCALL        Byte_Read        ;读第二个字节
  637.         CJNE        A,FWBZ2,WSET5        ;如果与EEPROM数据判断标志2不相同就转移
  638.         RET                        ;成功了,退出
  639. WSET5:        DJNZ        R0,WSET2        ;如果未试完8个扇区就转移到WSET2继续往前一个扇区写
  640.         SETB        06H                ;已经试完8个扇区,都失败了,位地址06H置为1
  641.         MOV        SSSC,#5                ;显示E1五秒
  642.         MOV        ZXM1,#0                ;消隐码
  643.         MOV        ZXM2,#079H        ;E
  644.         MOV        ZXM3,#006H        ;1
  645.         MOV        ZXM4,#0                ;消隐码
  646.         LCALL        DISP                ;显示
  647. WSET6:        MOV        A,SSSC
  648.         LCALL        WG                ;喂狗
  649.         JNZ        WSET6                ;等待SSSC为0秒
  650.         CLR        06H                ;显示结束,位地址06H置为0
  651.         RET
  652. WSET7:        MOV        A,IAP_ADDRH        ;装入扇区地址高位
  653.         ADD        A,#2                ;加2,指向下一个扇区首址
  654.         MOV        IAP_ADDRH,A        ;放回IAP_ADDRH
  655.         CJNE        A,#30H,WSET1        ;如果未到最后一个扇区地址高位+2(2EH+2=30H)就转移到WSET1继续搜索
  656.         LJMP        WSET3                ;是30H,已经搜索完所有扇区,未找到上次保存的数据,跳转到WSET3保存当前设置
  657. ;***************************************** 以上为EEPROM操作子程序 ********************************************

  658. ;-------------------------------------------------------------------
  659. ;子程序:外部中断INT0调用,根据条件控制可控硅、状态LED指示灯
  660. ;-------------------------------------------------------------------
  661. Control:MOV        A,JCGLMC1
  662.         JZ        CTL01
  663.         DEC        JCGLMC1                ;JCGLMC1不为0就减1
  664. CTL01:        SETB        LED                ;先熄灭自然风LED指示灯
  665.         JNB        07H,CTL02         ;如果位地址07H位为0(不是固定慢速状态)就转移
  666.         MOV        MSZS,MSZTZS        ;是固定慢速状态,把设置的转速放入到MSZS
  667.         LJMP        CTL03
  668. CTL02:        JNB        02H,CTL03         ;如果位地址02H为0(常速状态)就转移
  669.         CLR        LED                ;为1,自然风状态,点亮LED指示灯
  670. CTL03:        MOV        A,DSSJM                ;装入定时时间(秒)到寄存器A
  671.         JNZ        CTL05                ;不是0就转移
  672.         MOV        A,DSSJF                ;装入定时时间(分)到寄存器A
  673.         JNZ        CTL05                ;不是0就转移
  674.         MOV        A,DSSJS                ;装入定时时间(时)到寄存器A
  675.         JNZ        CTL05                ;不是0就转移
  676. CTL04:        SETB        MOC                ;定时时间为0,置MOC为高电平,断电
  677.         RET
  678. CTL05:        JB        07H,CTL07         ;如果位地址07H位为1(处于固定慢速状态)就转移
  679.         JNB        02H,CTL06         ;如果位地址02H为0(常速状态)就转移,通电
  680.         MOV        A,ZRFFS                ;装入自然风方式
  681.         JZ        CTL07                ;如果为渐慢——渐快变化方式就转移
  682.         MOV        A,SJ                ;是通/断电方式,装入自然风时电机常速通电时长
  683.         JZ        CTL04                ;如果为0就转移,断电
  684. CTL06:        CLR        MOC                ;通电
  685.         RET
  686. CTL07:        MOV        A,DDMC                ;装入断电(截止)脉冲计数
  687.         JZ        CTL08                ;如果是0就转移
  688.         SETB        MOC                ;可控硅断电
  689.         DEC        DDMC                ;计数减1
  690.         RET
  691. CTL08:        CLR        MOC                ;断电(截止)脉冲计数已经为0,可控硅通电
  692.         MOV        A,GLMC                ;装入过零信号脉冲计数
  693.         JNZ        CTL09                ;不是0就转移
  694.         MOV        GLMC,MSZS        ;是0,重新装入调速级数(过零信号脉冲计数)
  695.         MOV        DDMC,#2                ;设置断电(截止)脉冲计数
  696.         RET
  697. CTL09:        DEC        GLMC                ;过零信号脉冲计数减1
  698.         RET

  699. ;---------------------------------------------------------------------------------------------
  700. ;子程序:T0中断调用,检查过零检测脉冲,如果有故障就由本子程序控制可控硅、LED指示灯
  701. ;---------------------------------------------------------------------------------------------
  702. JCGLMC:        MOV        A,JCGLMC1
  703.         JNZ        JCGL1                ;JCGLMC1不为0就转移
  704.         MOV        JCGLMC1,#1        ;为0,过零检测正常,重新放入检查计数
  705.         MOV        JCGLMC2,#10        ;重新放入计数,检查10个周期(100毫秒)
  706.         RET
  707. JCGL1:        MOV        A,JCGLMC2
  708.         JZ        JCGL2                ;JCGLMC2是0就转移,说明已经检查了10个周期(100毫秒)
  709.         DEC        JCGLMC2                ;减1(10毫秒)
  710.         RET
  711. JCGL2:        MOV        JCGLMC2,#10        ;为0,无过零脉冲,过零检测有故障或不存在,重新放入检查计数
  712.         SETB        LED                ;先熄灭自然风LED指示灯
  713.         JNB        02H,JCGL3         ;如果位地址02H为0(常速状态)就转移
  714.         JB        07H,JCGL3         ;如果位地址07H位为1(固定慢速状态)就转移
  715.         CLR        LED                ;为自然风状态,点亮LED指示灯
  716. JCGL3:        MOV        A,DSSJM                ;装入定时时间(秒)到寄存器A
  717.         JNZ        JCGL5                ;不是0就转移
  718.         MOV        A,DSSJF                ;装入定时时间(分)到寄存器A
  719.         JNZ        JCGL5                ;不是0就转移
  720.         MOV        A,DSSJS                ;装入定时时间(时)到寄存器A
  721.         JNZ        JCGL5                ;不是0就转移
  722. JCGL4:        SETB        MOC                ;是0,置MOC为高电平,断电
  723.         RET
  724. JCGL5:        JNB        02H,JCGL6         ;如果位地址02H为0(常速状态)就转移,通电
  725.         JB        07H,JCGL6         ;如果位地址07H位为1(固定慢速状态)就转移,通电
  726.         MOV        A,SJ                ;装入自然风时电机常速通电时长
  727.         JZ        JCGL4                ;如果为0就转移,断电
  728. JCGL6:        CLR        MOC                ;通电
  729.         RET

  730. ;------------------------------------------------------------------------------------------
  731. ;子程序:T0中断调用,时间计数及倒计时处理、自然风速度渐变控制
  732. ;------------------------------------------------------------------------------------------
  733. TIME:        LCALL        TSD                ;自然风时的渐快、渐慢变化控制
  734.         MOV        A,SJJS                 ;装入(10)毫秒时间计数
  735.         JZ        TIME2                ;如果是0就转移
  736.         DEC        SJJS                ;不是0,减1
  737.         CJNE        A,#50,TIME1        ;如果不是50就转移退出
  738.         CPL        05H                ;位地址第05位取反,数字及冒号闪烁时用,每0.5秒取反一次
  739. TIME1:        RET
  740. TIME2:        CPL        05H                ;是0,位地址第05位取反,数字及冒号闪烁时用,每0.5秒取反一次
  741.         MOV        DPTR,#HMJS        ;把定义的时间计数值地址装入数据指针DPTR
  742.         MOVC        A,@A+DPTR        ;从程序存储区装入时间计数值到A寄存器
  743.         MOV        SJJS,A                ;时间计数值放入SJJS,重新计数
  744.         MOV        A,MJS                 ;装入秒计数
  745.         JZ        TIME3                ;如果是0就转移
  746.         DEC        MJS                ;不是0,减1秒
  747. TIME3:        MOV        A,SSSC                 ;装入闪烁时长秒计数
  748.         JZ        TIME4                ;如果是0就转移
  749.         DEC        SSSC                ;不是0,减1秒
  750. TIME4:        LCALL        ZRFCL                ;自然风时间处理
  751.         MOV        A,DSSJM                ;装入定时时间(秒)到寄存器A
  752.         JZ        TIME6                ;如果是0就转移
  753.         CJNE        A,#59,TIME5        ;如果不是59秒就转移
  754.         MOV        A,DSSJF                ;是59秒,检查“时”
  755.         JNZ        TIME5                ;不是0就转移
  756.         MOV        A,DSSJS                ;检查“分”
  757.         JNZ        TIME5                ;不是0就转移
  758.         MOV        DSSJM,A                ;“时、分”都是0,把“秒”也清零
  759.         RET
  760. TIME5:        DEC        DSSJM                ;不是0,减1秒
  761.         RET
  762. TIME6:        MOV        A,DSSJF                ;装入定时时间(分)到寄存器A
  763.         JZ        TIME7                ;如果是0就转移
  764.         DEC        DSSJF                ;不是0,减1分
  765.         MOV        DSSJM,#59        ;把59放入定时时间(秒)
  766.         RET
  767. TIME7:        MOV        A,DSSJS                ;装入定时时间(时)到寄存器A
  768.         JZ        TIME8                ;如果是0就转移,退出
  769.         DEC        DSSJS                ;不是0,小时减1
  770.         MOV        DSSJM,#59        ;把59放入定时时间(秒)
  771.         MOV        DSSJF,#59        ;把59放入定时时间(分)
  772. TIME8:        RET

  773. ;自然风时间处理
  774. ZRFCL:        MOV        A,SJ                ;装入自然风时电机常速通电时间到寄存器A
  775.         JZ         ZRFCL1                ;是0就转移
  776.         DEC        SJ                ;减1秒
  777. ZRFCL1:        MOV        A,ZQ                ;装入自然风变化周期时长
  778.         DEC        ZQ                ;先减1
  779.         JNZ        ZRFCL3                ;如果不是0就转移
  780.         MOV        ZQ,ZRFZQ        ;是0,重新装入设置值
  781.         MOV        SJ,ZRFSJ        ;是0,重新装入设置值
  782.         LCALL        JBJS                ;设置渐变调整的间隔计数(T0中断次数)和允许/禁止标志
  783.         MOV        MSZS,#20        ;放入最大转速级数
  784.         CLR        09H                ;位地址09H置0,渐慢调整
  785. ZRFCL2:        RET
  786. ZRFCL3:        CJNE        A,JKTZSJ,ZRFCL4        ;如果“渐快调整时间”未到就转移
  787.         LCALL        JBJS                ;设置渐变调整的间隔计数(T0中断次数)和允许/禁止标志
  788.         MOV        MSZS,MSZTZS        ;放入设置的慢速状态转速
  789.         SETB        09H                ;位地址09H置1,渐快调整
  790. ZRFCL4:        RET

  791. ;自然风时的渐快、渐慢变化控制
  792. TSD:        JB        08H,TSD1        ;如果位地址08H为1(允许渐变控制)就转移
  793.         RET
  794. TSD1:        MOV        A,MSZS
  795.         CJNE        A,#12,TSD2
  796. TSD2:        JC        TSD3                ;小于12级就转移,按设置的间隔计数(T0中断次数)调速
  797.         MOV        A,JBJS2                ;转速级数12以上调速时,变化不明显,所以每120毫秒就调一次
  798.         SUBB        A,JBJS1                ;设置的渐变调整间隔计数(T0中断次数)减已过去的时间
  799.         CJNE        A,#12,TSD3        ;不是12(120毫秒)就转移,按设置的间隔计数(T0中断次数)调速
  800.         LJMP        TSD4                ;到120毫秒了,调速。
  801. TSD3:        MOV        A,JBJS1                ;装入渐变调整间隔计数(T0中断次数)
  802.         JZ        TSD4                ;如果是0(时间到)就转移
  803.         DEC        JBJS1                ;非0,时间未到,减1
  804.         RET
  805. TSD4:        MOV        JBJS1,JBJS2        ;重新放入设置的渐变调整间隔计数(T0中断次数)到JBJS1
  806.         MOV        A,MSZS                ;装入转速级数
  807.         JB        09H,TSD6        ;如果位地址09H为1(渐快)就转移
  808.         CJNE        A,MSZTZS,TSD5        ;渐慢,如果还没减到“设置的慢速状态转速”就转移
  809.         CLR        08H                ;位地址08H置为0,渐变结束
  810.         RET
  811. TSD5:        DEC        MSZS                ;减1(渐慢)
  812.         RET
  813. TSD6:        CJNE        A,#20,TSD7        ;如果还没加到最大转速级数20就转移
  814.         CLR        08H                ;位地址08H置为0,渐变结束
  815.         RET
  816. TSD7:        INC        MSZS                ;加1(渐快)
  817.         RET

  818. ;设置渐变调整的间隔计数(T0中断次数)和标志
  819. JBJS:        JB        07H,JBJS_1         ;如果位地址07H位为1(固定慢速状态)就转移
  820.         JB        02H,JBJS_2         ;如果位地址02H为1(自然风状态)就转移
  821. JBJS_1:        CLR        08H                ;是慢速状态或常速状态,位地址08H置为0,禁止渐变控制
  822.         RET
  823. JBJS_2:        MOV        A,MSZTZS        ;装入设置的慢速状态转速
  824.         CJNE        A,#12,JBJS_3
  825. JBJS_3:        JNC        JBJS_1                ;等于或大于12就转移,变化不明显,无渐变控制必要
  826.         MOV        A,ZRFZQ                ;装入自然风变化周期(10~60秒)
  827.         MOV        B,#2
  828.         DIV        AB                ;除2
  829.         MOV        JKTZSJ,A        ;得出渐快调整的开始时间(5~30)
  830.         DEC        A                ;减1,12级以上另外调速(1秒内完成)
  831.         CJNE        A,#26,JBJS_4        ;渐变的单个方向时间长度(4~29)是否大于26
  832. JBJS_4:        JC        JBJS_5                ;小于26就转移
  833.         MOV        A,#25                ;等于或大于26,修改为25
  834. JBJS_5:        MOV        B,#10
  835.         MUL        AB                ;乘10后结果为40~250
  836.         MOV        B,A                ;放入B寄存器
  837.         MOV        A,#12                ;最大级数11+1(12级以上不进行渐变控制,所以最大为11)
  838.         SUBB        A,MSZTZS        ;减设置的慢速状态转速,得出要调整的级数数量(1~11)
  839.         XCH        A,B                ;A、B寄存器内容交换
  840.         DIV        AB                ;除级数数量(1~11)
  841.         CJNE        A,#26,JBJS_6        ;
  842. JBJS_6:        JC        JBJS_7                ;商小于26就转移
  843.         MOV        A,#25                ;商等于或大于26,修改为25
  844. JBJS_7:        XCH        A,B                ;A、B寄存器内容交换
  845.         JZ        JBJS_9                ;如果余数为0就转移
  846.         DEC        A                ;余数不为0,减1,修正误差
  847.         CJNE        A,#6,JBJS_8        ;
  848. JBJS_8:        JC        JBJS_9                ;余数小于6就转移
  849.         MOV        A,#5                ;余数等于或大于6,修改为5
  850. JBJS_9:        MOV        JBJS1,A                ;暂时放入JBJS1
  851.         XCH        A,B                ;A、B寄存器内容交换
  852.         MOV        B,#10
  853.         MUL        AB                ;商乘10
  854.         ADD        A,JBJS1                ;加上余数,得出间隔计数(T0中断次数)
  855.         MOV        JBJS2,A
  856.         SETB        08H                ;位地址08H置为0,允许渐变控制
  857.         RET

  858. ;------------------------------------------------------------------------------------------
  859. ;子程序:T0中断调用,显示定时时间及各项设置的内容
  860. ;------------------------------------------------------------------------------------------
  861. DISPLAY:JB        06H,DPYSZ1        ;如果位地址06H为1就转移退出,主程序显示88:88或E1
  862.         MOV        A,DISPL                ;装入要显示的目标
  863.         JZ        DISPL0                ;如果是0(显示定时时间)就转移
  864. DPYSZ:        PUSH        ACC
  865.         MOV        DPTR,#SEGTAB        ;查表获取字形码
  866.         MOVC        A,@A+DPTR        ;查表获取字形码
  867.         MOV        ZXM1,A                ;项目编号字形码放到待发送TM1637区1
  868.         MOV        ZXM2,#40H        ;放入“-”的字形码到待发送TM1637区2
  869.         POP        ACC
  870.         DEC        A                ;减1
  871.         PUSH        01H
  872.         MOV        R1,#ZRFZQ        ;各项设置值始址
  873.         ADD        A,R1                ;加上项目号
  874.         MOV        R1,A                ;得出设置项目的实际地址放入R1
  875.         MOV        A,@R1                ;装入设置值
  876.         POP        01H
  877.         MOV        B,A                ;放入B寄存器
  878.         CJNE        A,XSHC1,DPYSZ3        ;当前设置值与显示缓存1不相同就转移,立即显示
  879.         MOV        A,SJJS                 ;相同,装入时间计数
  880.         JNZ        DPYSZ2                ;不是0就转移,每半秒(遇到50或0)显示一次
  881.         LJMP        DPYSZ3                ;是0,显示
  882. DPYSZ1:        RET
  883. DPYSZ2:        CJNE        A,#50,DPYSZ1        ;不是50就转移退出,每半秒(遇到50或0)显示一次
  884. DPYSZ3:        MOV        XSHC1,B                ;当前设置值放入显示缓存1
  885.         JNB        04H,DPYSZ4        ;如果位地址04H为0(不闪烁)就转移
  886.         JNB        05H,DPYSZ4        ;为1,闪烁显示,如果位地址05H为0(显示)就转移
  887.         CLR        A                ;为1,处于闪烁显示中的“不显示”状态,放入消隐码
  888.         MOV        ZXM1,A                ;放入消隐码
  889.         MOV        ZXM2,A                ;放入消隐码
  890.         MOV        ZXM3,A                ;放入消隐码
  891.         MOV        ZXM4,A                ;放入消隐码
  892.         LJMP        disp                ;跳转到disp,发送4个字节数据到TM1637显示
  893. DPYSZ4:        MOV        A,B                ;当前设置值放入A寄存器
  894.         LCALL        DISPL6                ;转换并获取字形码放到待发送TM1637区3和4
  895.         LJMP        disp                ;跳转到disp,发送4个字节数据到TM1637显示
  896. DISPL0:        MOV        A,DSSJS                ;显示定时时间,装入定时时间(时)
  897.         CJNE        A,XSHC1,DISPL3        ;定时时间(时)与显示缓存1不相同就转移,显示
  898.         MOV        A,DSSJF
  899.         CJNE        A,XSHC2,DISPL3        ;定时时间(分)与显示缓存2不相同就转移,显示
  900.         MOV        A,SJJS                 ;时、分都相同,装入(10)毫秒时间计数
  901.         JNZ        DISPL2                ;不是0就转移
  902.         LJMP        DISPL3                ;是0,显示,每半秒(遇到50或0)显示一次
  903. DISPL1:        RET
  904. DISPL2:        CJNE        A,#50,DISPL1        ;不是50就转移,每半秒(遇到50或0)显示一次
  905. DISPL3:        MOV        XSHC1,DSSJS        ;当前时间放入显示缓存1
  906.         MOV        XSHC2,DSSJF        ;当前时间放入显示缓存2
  907.         MOV        A,DSSJM                ;
  908.         JNZ        DISPL4                ;检查当前定时时间是否全部为0,不是就转移
  909.         MOV        A,DSSJF                ;
  910.         JNZ        DISPL4                ;检查当前定时时间是否全部为0,不是就转移
  911.         MOV        A,DSSJS                ;
  912.         JNZ        DISPL4                ;检查当前定时时间是否全部为0,不是就转移
  913.         CLR        05H                ;定时时间为0,把位地址05H置为0,冒号不闪烁显示
  914. DISPL4:        MOV        A,DSSJS                ;装入“时”
  915.         MOV        B,#10                ;转换为BCD码
  916.         DIV        AB                ;转换为BCD码
  917.         MOV        DPTR,#SEGTAB        ;查表获取字形码
  918.         MOVC        A,@A+DPTR        ;查表获取字形码
  919.         MOV        ZXM1,A                ;字形码放入待发送TM1637区1
  920.         XCH        A,B                ;A、B寄存器内容交换
  921.         MOVC        A,@A+DPTR        ;查表获取字形码
  922.         JB        05H,DISPL5        ;如果05H为1就转移,不显示冒号
  923.         ORL        A,#10000000B        ;为0,把最高位置为1,显示冒号(字形码的最高位为1就显示冒号)
  924. DISPL5:        MOV        ZXM2,A                ;放入待发送TM1637区2
  925.         MOV        A,DSSJF                ;装入“分”
  926.         LCALL        DISPL6                ;转换并获取字形码放到待发送TM1637区3和4
  927.         LJMP        disp                ;跳转到disp,发送4个字节数据到TM1637显示
  928. DISPL6:        MOV        B,#10                ;转换为BCD码
  929.         DIV        AB                ;转换为BCD码
  930.         MOV        DPTR,#SEGTAB        ;查表获取字形码
  931.         MOVC        A,@A+DPTR        ;查表获取字形码
  932.         MOV        ZXM3,A                ;字形码放入待发送TM1637区3
  933.         XCH        A,B                ;A、B寄存器内容交换
  934.         MOVC        A,@A+DPTR        ;查表获取字形码
  935.         MOV        ZXM4,A                ;字形码放入待发送TM1637区4
  936.         RET

  937. ;------------------ 发送4个字节数据到TM1637显示,地址自动加1 ------------------
  938. disp:        LCALL        Srt
  939.         MOV          A,#040H                ;数据命令设置40H:地址自动加1,写数据到显示寄存器
  940.         LCALL        Writebyte        ;发送一个字节
  941.         LCALL        Stop
  942.         NOP
  943.         LCALL        Srt
  944.         MOV          A,#0C0H                ;地址命令设置C0H:初始地址为00H
  945.         LCALL        Writebyte        ;发送一个字节
  946.         PUSH        01H
  947.         PUSH        06H
  948.         MOV        06H,#4                ;发送4个字节数据
  949.         MOV          R1,#ZXM1        ;等待发送的字形码始址
  950. disp1:        MOV          A,@R1                ;装入要发送的字形码
  951.         LCALL        Writebyte        ;发送一个字节
  952.         INC          R1                ;地址加1
  953.         DJNZ        06H,disp1            ;如果还未发送完就继续
  954.         POP        06H
  955.         POP        01H
  956.         LCALL        Stop
  957.         LCALL        Srt
  958.         MOV        A,SMGLD                ;装入设置的数码管亮度(1~8)
  959.         ADD        A,#087H                ;加上87H后即为对应的亮度控制命令88H~8FH
  960.         LCALL        Writebyte        ;按设置的亮度开显示
  961.         LJMP         Stop

  962. ;------------------ 发送8bit(一个字节)数据到TM1637,A=要发送的数据,从低位开始 ------------------
  963. Writebyte:
  964.         PUSH        00H
  965.         MOV        00H,#8                ;发送8位数据
  966. WBY1:        CLR          CLK                ;拉低CLK
  967.         JNB          ACC.0,WBY2        ;A寄存器的低位(0位)如果为0就转移
  968.         SETB         DIO                ;为1,拉高DIO
  969.         SJMP         WBY3
  970. WBY2:        CLR          DIO                ;为0,拉低DIO
  971. WBY3:        NOP         
  972.         NOP         
  973.         NOP         
  974.         NOP         
  975.         NOP         
  976.         SETB         CLK                ;拉高CLK
  977.         CLR          C                ;进位标志清0
  978.         RRC          A                ;A寄存器内容带进位循环右移
  979.         DJNZ        00H,WBY1            ;如果还未发送完8bit数据就继续
  980. WBY4:        CLR          CLK                ;8位数据发送完了
  981.         NOP
  982.         MOV        00H,#05                ;设置等待应答信号计数值,防止万一与TM1637通讯失败而造成死循环
  983. WBY5:        DEC        00H                ;减1,正常情况下ACK应答信号很快,第一次减1就会有应答
  984.         MOV        A,00H                ;装入计数值到A
  985.         JZ        WBY6                ;如果为0就转移退出,说明与TM1637通讯失败,或TM1637不存在
  986.         JB        DIO,WBY5        ;不为0,判断TM1637发过来的ACK应答信号,未应答(为1,高电平)就转移
  987. WBY6:        POP        00H
  988.         NOP         
  989.         NOP         
  990.         NOP
  991.         SETB         CLK
  992.         NOP         
  993.         NOP         
  994.         NOP
  995.         RET         

  996. ;------------------ Start子程序 ------------------
  997. Srt:        SETB         DIO        ;拉高DIO
  998.         SETB         CLK        ;拉高CLK
  999.         NOP         
  1000.         NOP         
  1001.         NOP         
  1002.         NOP         
  1003.         NOP         
  1004.         SETB         DIO        ;拉高DIO
  1005.         NOP         
  1006.         NOP         
  1007.         NOP         
  1008.         NOP         
  1009.         NOP         
  1010.         CLR          DIO        ;拉低DIO
  1011.         NOP         
  1012.         NOP         
  1013.         NOP         
  1014.         NOP         
  1015.         NOP         
  1016.         CLR          CLK        ;拉低CLK
  1017.         RET         

  1018. ;------------------ Stop子程序 ------------------
  1019. Stop:        CLR          CLK
  1020.         NOP         
  1021.         NOP         
  1022.         NOP         
  1023.         NOP         
  1024.         NOP         
  1025.         NOP         
  1026.         NOP         
  1027.         NOP         
  1028.         NOP         
  1029.         NOP         
  1030.         CLR          DIO
  1031.         NOP         
  1032.         NOP         
  1033.         NOP         
  1034.         NOP         
  1035.         NOP         
  1036.         NOP         
  1037.         NOP         
  1038.         NOP         
  1039.         NOP         
  1040.         NOP         
  1041.         SETB         CLK
  1042.         NOP         
  1043.         NOP         
  1044.         NOP         
  1045.         NOP         
  1046.         NOP         
  1047.         NOP         
  1048.         NOP         
  1049.         NOP         
  1050.         NOP         
  1051.         NOP         
  1052.         NOP         
  1053.         NOP         
  1054.         NOP         
  1055.         NOP         
  1056.         NOP         
  1057.         SETB         DIO
  1058.         NOP         
  1059.         NOP         
  1060.         NOP         
  1061.         NOP         
  1062.         NOP         
  1063.         CLR          CLK
  1064.         CLR          DIO
  1065.         RET         

  1066. ;------------------ 字形表 ------------------
  1067. SEGTAB:
  1068.         DB  00111111B  ;0(3FH)
  1069.         DB  00000110B  ;1(06H)
  1070.         DB  01011011B  ;2(5BH)
  1071.         DB  01001111B  ;3(4FH)
  1072.         DB  01100110B  ;4(66H)
  1073.         DB  01101101B  ;5(6DH)
  1074.         DB  01111101B  ;6(7DH)
  1075.         DB  00000111B  ;7(07H)
  1076.         DB  01111111B  ;8(7FH)
  1077.         DB  01101111B  ;9(6FH)
  1078.         DB  01110111B  ;A(77H)
  1079.         DB  01111100B  ;B(7CH)
  1080.         DB  00111001B  ;C(39H)
  1081.         DB  01011110B  ;D(5EH)
  1082.         DB  01111001B  ;E(79H)
  1083.         DB  01110001B  ;F(71H)
  1084.         DB  00000000B  ;消隐码(00)

  1085. ;------------------------------------------------------------------------------------------

  1086.         END
复制代码
电风扇长定时+自然风.rar (149.27 KB, 下载次数: 13)



打赏

参与人数 6家元 +130 收起 理由
kkdkj + 20 謝謝分享
hefanghua + 10 懂汇编的都是牛人
jjbboox + 20 優秀文章
家睦 + 50
cxw0102 + 20 優秀文章
szb314 + 10 謝謝分享

查看全部打赏

发表于 2020-7-18 09:48:12 | 显示全部楼层
楼主厉害,居然用汇编,我看得头都打了:dizzy:
回复 支持 反对

使用道具 举报

发表于 2020-7-20 12:54:44 来自手机浏览器 | 显示全部楼层
为啥不直接用c呢
回复 支持 反对

使用道具 举报

发表于 2020-7-27 10:34:35 | 显示全部楼层
厉害了,居然是汇编
回复 支持 反对

使用道具 举报

发表于 2020-8-9 00:51:35 | 显示全部楼层
不能不能转成C啊
回复 支持 反对

使用道具 举报

发表于 2020-8-11 00:04:48 | 显示全部楼层
自学成才 一年编程不到一次 就写汇编:praise:
回复 支持 反对

使用道具 举报

发表于 2020-8-12 14:59:03 | 显示全部楼层
楼主是真的爱好者
回复 支持 反对

使用道具 举报

发表于 2020-8-12 22:11:57 | 显示全部楼层
楼主厉害,准备再接再厉做红外遥控版不?适合我等懒人. :lol::lol:
回复 支持 反对

使用道具 举报

发表于 2020-8-13 17:08:45 | 显示全部楼层
为楼主的精神点个赞:praise:
回复 支持 反对

使用道具 举报

发表于 2020-9-8 21:09:38 | 显示全部楼层
很实用是DIY,资料收藏备用
回复 支持 反对

使用道具 举报

发表于 2020-9-9 22:42:48 | 显示全部楼层
大佬居然用汇编语言,厉害
回复 支持 反对

使用道具 举报

发表于 2020-11-10 09:04:58 | 显示全部楼层
大佬,能否改成最大59分,59秒的,感觉这样用处更多,谢谢啦!
回复 支持 反对

使用道具 举报

发表于 2021-10-31 00:47:00 | 显示全部楼层
不错值得学习
回复 支持 反对

使用道具 举报

发表于 2022-2-22 15:00:19 | 显示全部楼层
注释写的还不错,方便今后自己或别人查看、调用。
建议:功能函数说明一下输入、输入以及使用的资源情况。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 19:02 , Processed in 0.312000 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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