关于汇编语言与步伐筹划——单总线温度采集与显示的应用 ...

打印 上一主题 下一主题

主题 1763|帖子 1763|积分 5289

一、实验要求


(1)握码管的使用方式
(2)掌握DS18B20温度传感器的工作原理
(3)掌握单总线通信方式实现 MCU与DS18B20数据传输
二、筹划思路


1.整体思路
  通过编写数码管显示步伐和单总线温度采集步伐,结合温度传感报警,利用手指触碰传感器,当温度高出阈值时开启蜂鸣器报警。
2.流程图

3.主要模块筹划思路及分析
1判断温度是否达到阈值

(2)蜂鸣器子步伐

三、 实现效果

室温时显示26度

当升温至30度则会报警

四、总结


在这次实验中,我学习了怎样通过DS18B20温度传感器来采集和显示温度。我了解到,DS18B20是一种常用的数字温度传感器,它可以通过单总线通信方式与MCU进行数据传输。这种方式相比于传统的模拟温度传感器,具有更高的精度和可靠性。
在实验过程中,我碰到了一些困难,例如怎样正确地毗连编码器和DS18B20传感器,以及怎样编写相应的步伐来读取和显示温度。最开始当达到设置的阈值时,蜂鸣器不会报警相应,在询问同学后我添加了一个DEL子步伐来控制蜂鸣子步伐的相应。
附录:
  1. DAT                BIT                P3.7  ;定义DQ线
  2. swpH        EQU                0D2H       
  3. swpL        EQU                0EFH       
  4. WDLSB        DATA        30H                ;定义温度低字节
  5. WDMSB        DATA        31H                ;定义温度高字节
  6. ORG                0000H
  7. LJMP        MAIN
  8. ORG                000BH
  9. LJMP        T0_INT
  10. ORG                0100H
  11. VALUE:       
  12.         DB 3FH, 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;共阴极
  13. T0_INT:
  14.     MOV        TH0, #swpH
  15.         MOV        TL0, #swpL
  16.         PUSH ACC                  ;A进栈保护
  17.         LCALL ALARM                  ;判断是否达到温度阈值
  18.         JB        21H,dsl          ;判断输出温度高位还是低位
  19.         MOV        R1,42H                 ;高位温度放至R1
  20.         MOV DPTR, #100H
  21.         LCALL LOOP2          ;循环,使DPTR变为相应温度位的值,再通过查表形式获得对应温度段码
  22.         MOV A, #0H
  23.         MOVC A, @A+DPTR
  24.         MOV P0, A                 ;将高位温度传至P0
  25.         MOV P2, #1CH
  26.         POP ACC                  ;出栈ACC完成对ACC的保护
  27.         SJMP kkk
  28. dsl:
  29.         MOV R1,43H                 ;低位温度放至R1
  30.         MOV DPTR, #100H
  31.         LCALL LOOP2
  32.         MOV A, #0H
  33.         MOVC A, @A+DPTR
  34.         MOV P0, A                 ;低位温度传至R2
  35.         MOV P2, #18H
  36.         POP ACC                
  37. LOOP2:                                 ;将DPTR变至响应温度的值
  38.         DEC R1
  39.         INC DPTR
  40.         CJNE R1, #0FFH, LOOP2
  41.         RET
  42. kkk:
  43.         CPL        21H                         ;21H取反
  44.         RETI                                 ;中断返回
  45. MAIN:
  46.         CLR EA                                ;关中断
  47.         MOV TMOD,#01H                ;设置T0初始化
  48.         MOV TH0,#swpH                ;装入定时器10ms中断的定时常数
  49.         MOV TL0,#swpL                ;
  50.         SETB EA                                  ;开中断
  51.         SETB ET0                          ;允许定时器T0中断
  52.         SETB TR0                          ;启动定时器T0计数
  53.         MOV R2,#2                        ;
  54.         MOV R0,#42H                        ;2个显示缓冲单元42H和43H清0
  55. OVER:                          
  56.         MOV @R0,#00H               
  57.         INC R0                                ;指针R0指向43H
  58.         DJNZ R2,OVER
  59. LOOP:                               
  60.         LCALL DSWD                        ;调用读出温度子程序
  61.         SJMP LOOP
  62. DSWD:
  63.         LCALL RSTSNR                ;调用复位子程序
  64.         JNB F0,KEND                        ;未应答则跳转KEND
  65.         MOV R0,#0CCH                   ;跳过ROM匹配指令
  66.         LCALL SEND_BYTE                 ;发送一字节跳过ROM匹配命令
  67.         MOV R0,#44H                           ;温度转换命令
  68.         LCALL SEND_BYTE                ;发送一字节温度转换指令
  69.         SETB EA
  70.         MOV 48H,#1                         ;延时75ms以上准备读
  71. SS2:
  72.         MOV 49H,#255
  73. SS1:
  74.         MOV 4AH,#255
  75. SS0:
  76.         DJNZ 4AH,SS0               
  77.         DJNZ 49H,SS1
  78.         DJNZ 48H,SS2
  79.         CLR EA
  80.         LCALL RSTSNR
  81.         JNB F0,KEND
  82.         MOV R0,#0CCH                 ;跳过ROM匹配命令
  83.         LCALL SEND_BYTE
  84.         MOV R0,#0BEH                  ;温度命令BEH
  85.         LCALL SEND_BYTE                 ;发出一字节读温度命令
  86.         LCALL READ_BYTE                  ;读一字节的温度值
  87.         MOV WDLSB,A                         ;读一字节的温度值(低字节)
  88.         LCALL READ_BYTE                  ;读一字节的温度值
  89.         MOV WDMSB,A                         ;读一字节的温度值(高字节)
  90.         LCALL TRANS12                  ;调用温度转换子程序
  91. KEND:
  92.         SETB EA
  93.         RET
  94. TRANS12:                  
  95.         MOV A,30H                         ;温度转换子程序
  96.         ANL A,#0F0H
  97.         MOV 3AH,A
  98.         MOV A,31H
  99.         ANL A,#0FH
  100.         ORL A,3AH
  101.         SWAP A
  102.         MOV B,#10
  103.         DIV AB
  104.         MOV 43H,B
  105.         MOV B,#10
  106.         DIV AB
  107.         MOV 42H,B
  108.         MOV 41H,A
  109.         RET
  110. SEND_BYTE:
  111.         MOV A,R0                         ;发送一个字节的子程序
  112.         MOV R5,#8
  113. SEN3:
  114.         CLR C
  115.         RRC A
  116.         JC SEN1
  117.         LCALL WRITE_0
  118.         SJMP SEN2
  119. SEN1:
  120.         LCALL WRITE_1
  121. SEN2:
  122.         DJNZ R5,SEN3                 ;循环八次发送一个字节
  123.         RET
  124. READ_BYTE:
  125.         MOV R5,#8                         ;读一个字节的子程序
  126. READ1:
  127.         LCALL READ
  128.         RRC A
  129.         DJNZ R5,READ1                 ;循环八次读一个字节
  130.         MOV R0,A
  131.         RET
  132. RSTSNR:
  133.         SETB DAT                         ;复位程序
  134.         NOP
  135.         NOP
  136.         CLR DAT
  137.         MOV R6,#250                         
  138.         DJNZ R6,$
  139.         MOV R6,#50
  140.         DJNZ R6,$
  141.         SETB DAT                         ;主机释放总线,IO口改为输入
  142.         MOV R6,#15
  143.         DJNZ R6,$
  144.         CALL CHCK                         ;调用应答子程序
  145.         MOV R6,#60
  146.         DJNZ R6,$
  147.         SETB DAT
  148.         RET
  149. CHCK:
  150.         MOV C,DAT
  151.         JC RST0
  152.         SETB F0                                 ;检测到信号置为F0
  153.         SJMP CHCK0
  154. RST0:
  155.         CLR F0                                 
  156. CHCK0:
  157.         RET
  158. WRITE_0:
  159.         CLR DAT                                 ;写0子程序
  160.         MOV R6,#30
  161.         DJNZ R6,$
  162.         SETB DAT
  163.         RET
  164. WRITE_1:                                 ;写1子程序
  165.         CLR DAT
  166.         NOP
  167.         NOP
  168.         NOP
  169.         NOP
  170.         NOP
  171.         SETB DAT
  172.         MOV R6,#30
  173.         DJNZ R6,$
  174.         RET
  175. READ:                                         ;读一位数据子程序
  176.         SETB DAT
  177.         NOP
  178.         NOP
  179.         CLR DAT
  180.         NOP
  181.         NOP
  182.         SETB DAT                         ;置位DAT准备接收数据
  183.         NOP
  184.         NOP
  185.         NOP
  186.         NOP
  187.         NOP
  188.         NOP
  189.         NOP
  190.         MOV C,DAT
  191.         MOV R6,#23
  192.         DJNZ R6,$
  193.         RET
  194. ALARM:                                        ;判断温度是否达到阈值,设置温度阈值为30
  195.         MOV A, 43H
  196.         SUBB A, #00H
  197.         MOV A, 42H
  198.         SUBB A, #03H          
  199.         JNC BUZZER                        
  200.         CLR C
  201.         RET
  202. BUZZER:                                 ;蜂鸣器响应子程序
  203.          MOV R1,#0FFH
  204.      CPL P2.5
  205.      LCALL DEL
  206.      RET
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

滴水恩情

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表