找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2548|回复: 1
打印 上一主题 下一主题
收起左侧

可燃气体报警器设计 单片机汇编源码

[复制链接]
跳转到指定楼层
楼主
ID:306549 发表于 2018-4-12 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. 软件设计源程序
  2. ;30H:存放旧浓度地址                  31H:现在浓度值(A/D转换后换算取得的新浓度)
  3. ;40H:初始调零值=0                     32H:A/D转换后的值   33H:A/D转换完成(中断完成)标志
  4. ;50H:初始预警值=50                 55H:存放BCD转换中的百位数
  5. ;56H:存放BCD转换中的十位数           60H:转换完的个位存放地址
  6. ;61H:转换完的十位存放地址          62H:转换完的百位存放地址
  7. ;63H:存放转换完的压缩BCD码供显示用        R1:BCD转换中存放的百位数(可做百位报警)
  8. ;R2:BCD转换中存放十位数>60H R3:当前浓度值保存
  9. ;R4:设置改变模式延时时间            R5,R6:延时程序中用到
  10. ;SP:堆栈->#70H
  11. ;* * * * * * * * * * * * * * * * *
  12. ;    可燃气体探测报警器
  13. ;                 2008.5.20
  14. ;* * * * * * * * * * * * * * * * *
  15. ;* * * * * * * * * * * * * * * * *
  16. ;   各引脚用途及系统功能说明
  17. ;P1.4     接绿灯,指示正常
  18. ;P1.5     接黄灯,指示故障
  19. ;P1.6     接红灯,灯光报警
  20. ;P1.7     接喇叭,音乐报警
  21. ;P2.0     接ADC0809
  22. ;P2.2     接调零开关
  23. ;P2.3     接继电器,控制排气阀门
  24. ;* * * * * * * * * * * * * * * * *
  25. ;      主     程     序
  26. ;* * * * * * * * * * * * * * * * *
  27.       ORG  00H
  28.       JMP  START         ;主程序入口地址
  29.       ORG  03H
  30.       JMP  INTO          ;外中断INTO入口
  31.       ORG  0BH
  32.       JMP  ITOP        ; 定时器0中断入口
  33.       ORG 0100H
  34. START:   MOVIE,#10000001B          ;INT0中断使能
  35.          MOVIP,#00000001B           ;INT0中断优先
  36.          MOVTCON,#00000000B        ;设置INT0为电平触发
  37.          MOVSCON,#00000000B         ;串行口发送,接收标志位请0
  38.         MOV SP,#60H             ;设堆栈指针
  39.          MOV TMOD,#01H           ;设置T0为方式1
  40.          CALL PT0M0
  41. HERE:    AJMP HERE               ;自身跳转
  42. PT0M0:   MOV TL0,#0CH            ;T0中断服务程序,T0重新置初值
  43.          MOV TH0,#0FEH
  44.          SETB TR0                ;启动T0
  45.          SETB ET0                ;允许T0中断
  46.          SETB EA                 ;CPU开中断
  47.          RET
  48. ITOP:    MOV TL0,#0CH            ;T0中断服务程序,T0置初值
  49.          MOV TH0,0FEH
  50.          CPL P1.0               ;P1.0状态取反
  51.          RETI
  52.          ACALL  LED                   ;调用LED自检子程序
  53.          MOV 33H,#00H               ;设置中断完成标志为0
  54.          MOV DPTR,#0FEFFH            ;ADC0809的端口地址
  55.          MOVX @DPTR,A                 ;使BUS为高阻抗,令ADC0809开始转换
  56. WAIT:MOV A,33H                 ;等待A/D转换完成信号
  57.          JNZ INTOK
  58.          JMP WAIT               ;未完成则跳回等待
  59. INTOK:   MOV A,32H                  ;将最新的浓度值存入累加器中,(若A/D未工作,则A=0)
  60.          JNZ  L1
  61.          MOV A,30H
  62.          JMP L2
  63. L1:      MOV 30H,31H
  64.          MOV A,31H                   ;将新浓度载入累加器
  65. L2:      CALL BCD                    ;调用BCD码调整程序
  66.          CALL DISP                   ;显示当前浓度
  67.          CALL ADZERO                 ;调用零点调整子程序
  68.          CALL ALARM                  ;调用判断报警程序
  69.          CALL BCD
  70.          CALL DISP                   ;调用显示子程序
  71.          CLR A                       ;清除累加器值
  72.          JMP START                   ;返回
  73.           ; 在主程序通过对33H中数值的判断断定A/D是否转换完成
  74.           ; 当33H中为1时,转换完成,程序调用调零、报警、显示模块对输入数据进行处理。
  75. ;* * * * * * * * * * * * * * * * *
  76. ;          LED自检子程序
  77. ;* * * * * * * * * * * * * * * * *
  78. LED:      CLR P1.4             ;绿灯
  79.           CLR P1.5             ;黄灯
  80.           CLR P1.6             ;红灯
  81.           CALL DELAY2s
  82. DELAY2s:   MOV R5,#100
  83. DLY1:      MOV R6,#100
  84. DLY2:      MOV R7,#100
  85.            DJNZ R7,$
  86.            DJNZ R6,DLY2
  87.            DJNZ R5,DLY1
  88.            RET
  89.            SETB P1.4
  90.            SETB P1.5
  91.            SETB P2.6
  92.            RET
  93. ;* * * * * * * * * * * * * * * * *
  94. ;            调零子程序
  95. ;      (初始报警值为50)
  96. ;* * * * * * * * * * * * * * * * *
  97. ADZERO : CALL DELAY20ms
  98.         JB P2.2,JMP1                 ;判断调零按纽是否按下,没有则跳JMP1
  99. LOOP1:  CALL DELAY20ms
  100.         JNB P2.2,$                   ;消除抖动延时
  101.         MOV A,40H                    ;将调零预设值40H送入
  102.         CLR C                        ;清除进位标志
  103.         SUBB A,#01H                  ;调零值减1
  104.         JNC LOOP2                    ;未借位则跳LOOP2
  105.         MOV A,#05H                   ;有借位则重设调零值为5
  106. LOOP2:  MOV 40H,A                    ;将调零值送回40H保存
  107.         MOV A,R3                     ;将当前浓度值送入A
  108.         JZ XEND
  109.         DEC A                        ;当前浓度值减1(响应调整变化)
  110. XEND1:  MOV 30H,A                    ;送回30H保存
  111.         MOV 31H,A                    ;送回31H保存
  112.         CALL BCD
  113.         CALL DISP
  114.         JMP LOOP1
  115. XEND:   MOV A,#63H
  116.         JMP XEND1
  117.         JMP1: RET
  118. ;* * * * * * * * * * * * * * * * *
  119. ;  3位串行静态显示子程序
  120. ;* * * * * * * * * * * * * * * * *
  121. BCD:    MOV 55H,#00H                 ;存放BCD转换中的百位数
  122.         MOV 56H,#00H                 ;存放BCD转换中的十位数
  123.         CLR C                        ;清楚进位标志为下面的SUBB准备
  124.         MOV R2,#00H                  ;清楚R2
  125. CHAN:   SUBB A,#64H                  ;减100
  126.         JC CHAN1                     ;不能减,转
  127.         INC R1                       ;百位值
  128.         JMP CHAN                     ;循环判断百位
  129. CHAN1:  ADD A,#64H                   ;还原百位数
  130.         CLR C                        ;清楚进位标志为下面的SUBB准备
  131. CHAN2:  SUBB A,#0AH                  ;减10
  132.         JC CHAN3                     ;不够减,跳
  133.         INC R2                       ;够减十位加1
  134.         JMP CHAN2                    ;重复减10
  135. CHAN3:  ADD A,#0AH                   ;还原十位数
  136.         MOV 61H,R2                   ;把十位数放61H
  137.         MOV 60H,A                    ;把个位数放60H
  138.         MOV 62H,R1                   ;把百位数放62H
  139.         RET
  140. DISP:   MOV R7,#03H
  141.         MOV R0,#60H
  142. LED1:  MOV A,@R0
  143.         MOV DPTR,#TABLE
  144. LED2:   MOVC A,@A+DPTR
  145.         MOV SBUF,A
  146.         JNB TI,$
  147.         CLR TI
  148.         INC R0
  149.         DJNZ R7,LED1
  150.         RET
  151. DELAY20ms:  MOV R5,#40                   ;设定20毫秒
  152. D1:     MOV R6,#248
  153.         DJNZ R6,$
  154.         DJNZ R5,D1
  155.         RET
  156. ;* * * * * * * * * * * * * * * * *
  157. ;           报警子程序
  158. ;* * * * * * * * * * * * * * * * *
  159. ALARM:  MOV A,30H                    ;将当前浓度值送如累加器
  160.         CLR C                        ;清除进位标志
  161.         SUBB A,50H                   ;与预警值进行判断
  162.         JNC GOOD1                    ;若无借位,则当前浓度值高于或者等于预警值,跳GOOD1报警
  163.         SETB P1.6                  ;关闭声光报警
  164.         SETB P1.7
  165.         CLR P2.3                   ;关闭排气阀门
  166.         SETB P1.5               ;关闭黄色LED
  167.         CLR P1.4                    ;打开绿色LED(显示正常)
  168.         RET
  169.       GOOD1: CLR P1.6                ;打开声光报警(危险报警)
  170.              CLR P1.7
  171.              CLR P2.3                ;打开排气阀门
  172.              SETB P1.5               ;关闭黄色LED
  173.               SETB P1.4             ;关闭绿色LED(显示不正常?
  174.            RET
  175. ;* * * * * * * * * * * * * * * * *
  176. ;         中断取值子程序
  177. ;* * * * * * * * * * * * * * * * *
  178. INTO: PUSH ACC                    ;将累加器值压入堆栈保存
  179.         PUSH PSW                     ;将PSW值压入堆栈保存
  180.         MOVX A,@DPTR                   ;将A/D转换好的值送入累加器
  181.         MOV 32H,A                    ;将A/D读得的值存入32H保存
  182.         CLR C
  183.         SUBB A,51H                   ;判断获得的电压是否小于1V(50)
  184.         JNC OK1
  185.         MOV 32H,#00H                 ;当前A/D转换的电压小于1V,则A/D转换得的示数为00
  186.         JMP EMP1
  187.      OK1: MOV A,32H
  188.      CALL ADJUST                     ;调用ADJUST将其调整为浓度对应的16进制
  189.      CALL ADDD                       ;调用ADDD将其与调零预设值相加,得到调整后的16进制
  190.      MOV 31H,A                       ;将调整后的值送入31H保存
  191.        EMP1: MOVIE,#10000000B       ;关闭INT0中断使能,关闭中断
  192.         POP PSW                      ;至堆栈取回PSW值
  193.         POP ACC                      ;至堆栈取回ACC值
  194.        MOV 33H,#01H                  ;中断完成,设置完成标记33H为1
  195.         RETI
  196. ;* * * * * * * * * * * * * * * * *
  197. ;    调整相加子程序
  198. ;* * * * * * * * * * * * * * * * *
  199.     ADJUST: CLR C
  200.             SUBB A,#32H              ;将A/D转换的值减50再除10乘5可得当前浓度的16进制值
  201.             MOV B,#0AH
  202.             DIV AB
  203.             MOV B,#05H
  204.             MUL AB
  205.             RET
  206.      ADDD:  ADD A,40H
  207.     TABLE:
  208.         DB 0C0H,0F9H,0A4H,0B0H,99H
  209.         DB 92H, 82H, 0F8H,80H, 90H
  210.        END
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:365243 发表于 2018-7-4 23:17 来自手机 | 只看该作者
楼主这个对应的仿真图,是什么样的?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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