找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4410|回复: 2
收起左侧

单片机主机通过DS18B20测温,从机接收并且实时显示温度(汇编程序与仿真)

[复制链接]
ID:401743 发表于 2018-9-24 10:43 | 显示全部楼层 |阅读模式
单片机系统设计实验报告

0 实验任务
所设计的主从式多级通信系统有一个主机和两个从机,其中1#从机的地址设为01H,2#从机的地址设为02H。
主机的RXD和从机的TXD相连,TXD和从机的主机的RXD相连,主机的P1口接2个按钮开关,一个代表1#从机,另一个代表2#从机,主机根据开关的状态,发送要访问的从机的地址,地址相符的从机则点亮发光二极管以示和主机进行通信,然后主机向从机发送数据,从机将接收到的数据进行显示。当按下从机1#的按钮的时候,主机会将实时温度发送给从机,从机通过LCD 1602显示温度。P2.4引脚上的发光二极管指示和主机的通信状态。
主机和从机串口都设置为方式3,波特率为9600。主机发送地址时,TB8为1,主机发送数据时,TB8为0。从机在监听状态时SM2设置为1,接收到的地址若和本机地址相符,点亮P2.0引脚上的发光二极管以示和主机联络成功,并置SM2为0,准备接收数据,否则SM2仍维持为1不变,不接收数据。从机接收完数据后,将接收到的数据送显示,然后从机将SM2设置为1,返回到监听状态。主机根据按钮开关的状态,和相应的从机进行通信。
1 系统方案
1.1 系统分析
根据系统功能要求,可将系统组成结构分为四大部分。单片机控制中心、DS18B20测温模块、LCD 1602显示模块、中断触发模块。
其中,单片机控制中心是核心。DS18B20测温模块是数据输入的主要来源,可以实时测温;LCD 1602显示模块是将温度实时显示,用于显示测量地点的温度;报警模块是监视测量地点的温度有没有超出可接受范围,如果超出,报警模块会以声音方式报警。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机汇编语言源程序如下(主机):
  1.         ;采用11.0592MHZ晶振
  2.         ;++++++++++++执行DJNZ需要两个时间周期+++++++++++++
  3.         ;T0定时器 方式1 16位计数
  4.         ;1.init
  5.         ;2.skip        rom
  6.         ;3.convert-t
  7.         ;4.init
  8.         ;5.skip-rom
  9.         ;6.read
  10.         ;7.receive-data
  11.         ;8.cal
  12.         ;9.display

  13.         DAT        BIT        P3.7                        ;定义P3.7口为DQ线
  14.         WDLSB        DATA        30H                ;定义读出温度低字节,将温度低字节放在30H
  15.         WDMSB        DATA        31H                ;定义读出温度高字节,将温度高字节放在31H

  16.         ORG        0000H
  17.         LJMP        MAIN
  18.         ORG        0003H                                
  19.         LJMP        INT_EXT0                ;外部中断0入口
  20.         ORG        0013H                                
  21.         LJMP        INT_EXT1                ;外部中断1入口
  22.         ORG        0100H
  23. MAIN:
  24.         MOV        SP,#60H                                ;设置堆栈指针

  25.         SETB        EX0                                ;允许外部中断0产生中断
  26.         SETB        IT0                                ;外部中断0为跳沿触发方式
  27.         SETB        EX1                                ;允许外部中断1产生中断
  28.         SETB        IT1                                ;外部中断1为跳沿触发方式
  29.         SETB        EA                                ;总中断打开
  30.         MOV        IP,#01H
  31.         ;---DS18B20测温子程序---
  32.         LCALL        DS18B20_TP                ;调用DS18B20测温子程序

  33. HERE:
  34.         LJMP        HERE
  35.         ;----外部中断0子程序
  36. INT_EXT0:                                        ;外部中断子程序
  37.         CLR        EA                                        ;CPU关中断
  38.         PUSH        PSW                                ;现场保护
  39.         PUSH        ACC
  40.         SETB        EA                                ;总中断允许位
  41.         MOV        TMOD,#20H                        ;选择定时器T1,波特率是9600
  42.         MOV        TH1,#0FDH
  43.         MOV        TL1,#0FDH
  44.         SETB        TR1                                ;运行定时器T1        
  45.         MOV        SCON,#0D8H                        ;设置串口通信为方式3,SM2=0,RE=1,TB8=1
  46.         MOV        PCON,#00H                        ;*****SMOD=0        
  47.         MOV        IE,#00H
  48. MT1:
  49.         MOV        SBUF,#01H                        ;发送1#从机地址,呼叫1#从机
  50.                
  51. LT1:        
  52.         JBC        TI,LT2                                ;判TI?TI=1,跳转L2,并将TI=0;否则往下执行
  53.         LJMP        LT1
  54. LT2:
  55.         
  56.         JBC        RI,ST1                                ;等待从机应答,如果接收完成,RI=1,转S1,RI=0;
  57.                                                         ;如果RI=0,往下执行
  58.         LJMP        LT2                                ;未接收完成,跳转L2继续等待
  59. ST1:        
  60.         MOV        A,SBUF                                ;取出应答地址
  61.         XRL        A,#01H                                ;判断是否1#从机应答
  62.         JZ        RIGHTT                                ;是从机1#应答,转发送数据
  63.         LJMP        MT1                                ;如果不是1#从机应答,重新呼叫
  64. RIGHTT:
  65.         CLR        TB8                                        ;联络成功,清TB8,发送数据
  66.         ;---启动发送个位温度数据
  67.         MOV        SBUF,43H                        ;启动发送个位温度数据
  68. TRANS_L:
  69.         JBC        TI,OK                                ;TI=1,发送完成,并且清零TI,转NEXT
  70.                                                         ;TI=0,转WAIT继续等待
  71.         LJMP        TRANS_L
  72.         ;---接收从机发送过来的确认信息#0FFH
  73. OK:
  74.         JBC        RI,RECEIVE_OK                ;主机等待从机应答,如果接受完毕,RI=1,并且转RECEIVE_OK
  75.         LJMP        OK
  76. RECEIVE_OK:
  77.         MOV        A,SBUF
  78.         XRL        A,#0FFH
  79.         JZ        TRANS_H
  80.         LJMP        MT1        
  81.         ;---启动发送十位温度数据        
  82. TRANS_H:
  83.         MOV        SBUF,42H                        ;---启动发送十位温度数据
  84.         ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  85.         MOV        A,42H
  86.         MOV      DPTR,#TAB      ;翻译子程序,将段码表首地址放入DPTR
  87.         MOVC     A,@A+DPTR      ;查表后将键号对应的段码送入ACC
  88.         MOV      P2,A           ;将ACC值送入P2孔
  89.                
  90. WAIT_H:        
  91.         JBC        TI,NEXTT                        ;RI=1,发送完成,并且清零RI,转NEXT
  92.                                                         ;RI=0,转WAIT继续等待
  93.         LJMP        WAIT_H                        ;启动发送十位温度数据
  94. NEXTT:
  95.         CLR        EA                                        ;关中断               
  96.         POP        ACC                                        ;现场恢复
  97.         POP        PSW
  98.         SETB        EA                                ;打开中断
  99.         RETI
  100.         ;----外部中断1子程序
  101. INT_EXT1:
  102.         CLR        EA                                        ;CPU关中断
  103.         PUSH        PSW                                ;现场保护
  104.         PUSH        ACC
  105.         SETB        EA                                ;总中断允许位        
  106.         MOV        TMOD,#20H                        ;选择定时器T1,波特率是9600
  107.         MOV        TH1,#0FDH
  108.         MOV        TL1,#0FDH
  109.         SETB        TR1                                ;运行定时器T1        
  110.         MOV        SCON,#0D8H                        ;设置串口通信为方式3,SM2=0,RE=1,TB8=1
  111.         MOV        PCON,#00H                        ;*****SMOD=0        
  112.         MOV        IE,#00H
  113. M1:
  114.         MOV        SBUF,#02H                        ;发送2#从机地址,呼叫2#从机
  115.                
  116. L1:
  117.         JBC        TI,L2                                ;判TI?TI=1,跳转L2,并将TI=0;否则往下执行
  118.         LJMP        L1
  119. L2:        
  120.         JBC        RI,S1                                ;等待从机应答,如果接收完成,RI=1,转S1,RI=0;
  121.                                                         ;如果RI=0,往下执行
  122.         LJMP        L2                                ;未接收完成,跳转L2继续等待
  123. S1:        
  124.         MOV        A,SBUF                                ;取出应答地址
  125.         XRL        A,#02H                                ;判断是否1#从机应答
  126.         JZ        RIGHT                                ;是从机1#应答,转发送数据
  127.         LJMP        M1                                ;如果不是1#从机应答,重新呼叫
  128. RIGHT:
  129.         CLR        TB8                                        ;联络成功,清TB8,发送数据
  130.         ;---发送数据发送
  131.         MOV        SBUF,#02H                        ;启动发送数据发送
  132. WAIT:
  133.         JBC        TI,NEXT                                ;RI=1,发送完成,并且清零RI,转NEXT
  134.                                                         ;RI=0,转WAIT继续等待
  135.         LJMP        WAIT
  136. NEXT:
  137.         CLR        EA                                        ;关中断               
  138.         POP        ACC                                        ;现场恢复
  139.         POP        PSW
  140.         SETB        EA                                ;打开中断
  141.         RETI

  142.         ;---DS18B20测温程序---
  143. DS18B20_TP:
  144.         PUSH        PSW                                ;现场保护
  145.         PUSH        ACC               
  146.         ;---清两个显示缓冲单元41H
  147.         MOV        R2,#3                                ;清两个显示缓冲单元42H(保存温度值的十位),43H(保存温度值的个位)
  148.         MOV        R0,#41H
  149. OVER:
  150.         MOV        @R0,#00H
  151.         INC        R0                                        ;指针R0执行42H
  152.         DJNZ        R2,OVER        
  153. LOOP:
  154.         ;---读写DS18B20子程序
  155.         LCALL        DSWD                        ;调用读写DS18B20子程序
  156.         LJMP        LOOP                        ;循环读芯片的温度
  157. DSWD:
  158.         ;关中断
  159.         CLR        EA                                       
  160.         ;---复位子程序(初始化)
  161.         LCALL        RSTSNR                        ;调用复位子程序(INIT)
  162.         ;---写跳过ROM命令
  163.         JNB        F0,KEND                                ;如果DS18B20没有应答,跳KEND
  164.         MOV        R0,#0CCH                        ;跳过ROM匹配命令
  165.         LCALL        SEND_BYTE                ;发送一字节的跳过ROM匹配命令
  166.         ;---温度转换命令
  167.         MOV        R0,#44H                                ;温度转换命令
  168.         LCALL        SEND_BYTE                ;发送一字节的温度转换命令
  169.         ;打开中断
  170.         SETB        EA
  171.         MOV        48H,#1                                ;延时75ms以上准备读数据
  172. SS2:
  173.         MOV        49H,#255
  174. SS1:
  175.         MOV        4AH,#255
  176. SS0:
  177.         DJNZ        4AH,SS0
  178.         DJNZ        49H,SS1
  179.         DJNZ        48H,SS2
  180.         CLR        EA                                       
  181.         LCALL        RSTSNR                        ;复位程序(init)
  182.         JNB        F0,KEND
  183.         MOV        R0,#0CCH                        ;skip-rom指令
  184.         LCALL        SEND_BYTE                ;发送一字节的跳过ROM指令
  185.         MOV        R0,#0BEH                        ;读DS18B20温度指令
  186.         LCALL        SEND_BYTE                ;发送一字节的温度转化指令
  187.         LCALL        READ_BYTE                ;读一个字节的温度值
  188.         MOV        WDLSB,A                                ;读一字节定位温度值(低字节)
  189.         LCALL        READ_BYTE                ;读一个字节的温度值
  190.         MOV        WDMSB,A                                ;读一字节定位温度值(高字节)
  191.         LCALL        TRANS                        ;调用温度转换子程序,以便显示温度
  192. KEND:
  193.         SETB        EA                                ;打开中断
  194.         RET
  195.         ;---主程序完成---**************************************


  196.         ;---复位子程序**************************************
  197. RSTSNR:
  198.         SETB        DAT                                ;拉高DQ总线↑
  199.         NOP
  200.         NOP
  201.         CLR        DAT                                        ;拉低DQ总线↓
  202.         ;---延时500μm
  203.         MOV        R6,#250
  204.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;250*2=500us        DJNZ需要两个时间周期
  205.         SETB        DAT                                ;DQ=1↑ 释放总线的控制权,IO转为输入↑
  206.         ;---延时68μm
  207.         MOV        R6,#34                                ;延时68us
  208.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       
  209.         LCALL        CHCK                        ;调用应答子程序,判断DS18B20是否可获得
  210.         ;---延时500μm
  211.         MOV        R6,#250
  212.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延时500us
  213.         SETB        DAT                                ;DQ=1↑
  214.         RET                                                        

  215. CHCK:
  216.         MOV        C,DAT                                ;读出DQ数据        
  217.         MOV        P1.7,C                        
  218.         JC        RST0                                ;如果DQ=0说明DS18B20可获得,DQ=1,DS18B20不可获得
  219.         SETB        F0                                ;标志位F0=1,DS18B20存在
  220.         LJMP        CHCK0                        ;子程序返回
  221. RST0:        
  222.         CLR        F0                                        ;标志位F0=1,DS18B20不存在
  223. CHCK0:
  224.         RET
  225.         ;---复位子程序完成**************************************


  226.         ;---发送一字节的跳过ROM匹配命令子程序**************************************
  227. SEND_BYTE:
  228.         MOV        A,R0                                ;发送一字节的子程序
  229.         MOV        R5,#8                                ;循环发送8次
  230. SEND:
  231.         CLR        C
  232.         RRC        A
  233.         JC        SEN1
  234.         LCALL        WRITE_0
  235.         LJMP        SEN2
  236. SEN1:
  237.         LCALL        WRITE_1
  238. SEN2:
  239.         DJNZ        R5,SEND
  240.         RET
  241.         ;---写0子程序---
  242. WRITE_0:
  243.         CLR                DAT                                ;DQ=0↓
  244.         ;---延时68μm
  245.         MOV        R6,#34
  246.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延时68us,34*2=68us
  247.         SETB        DAT                                ;释放总线控制权
  248.         NOP
  249.         NOP
  250.         RET
  251.         ;---写1子程序---
  252. WRITE_1:
  253.         CLR                DAT                                ;DQ=0↓
  254.         NOP
  255.         NOP
  256.         SETB        DAT                                ;DQ=1↑
  257.         ;---延时68μm
  258.         MOV        R6,#34
  259.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延时68us
  260.         NOP
  261.         NOP        
  262.         RET
  263.         ;---发送一字节的跳过ROM匹配命令子程序完成**************************************

  264.         
  265.         ;---读一个字节的温度子程序--*******************************
  266. READ_BYTE:
  267.         MOV        R5,#8
  268. READ1:
  269.         LCALL        READ                        
  270.         RRC                A
  271.         DJNZ        R5,READ1
  272.         MOV        R0,A                                ;把温度值保存在R0中
  273.         RET

  274. READ:
  275.         CLR        DAT                                        ;DQ=0↓
  276.         NOP
  277.         NOP
  278.         SETB        DAT                                ;DQ=1↑ 准备接收数据
  279.         NOP
  280.         NOP
  281.         MOV        C,DAT                                ;单片机读数据。C中保存DS18B20发送过来的数据
  282.         ;---延时68μm
  283.         MOV        R6,#34
  284.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延时68um        
  285.         RET                                       
  286.         ;---读一个字节的温度子程序完成--*******************************


  287.         ;---温度转换子程序---*************************************
  288. TRANS:
  289.         MOV        A,30H                                ;温度转换程序(只取整数),30H=LSM,31H,MSB(加入收到温度是125 A=0000 0111 1101 0000)
  290.         ANL        A,#0F0H                                ;保留低八位的整数位        A=1101 0000
  291.         MOV        3AH,A
  292.         MOV        A,31H
  293.         ANL        A,#0FH                                ;保留高八位的正数位 A=0000 0111
  294.         ORL        A,3AH                                   ;取出八位正整数
  295.         SWAP        A
  296.         MOV        B,#10
  297.         DIV        AB
  298.         MOV        43H,B                                ;41H保存着个位数
  299.         MOV        B,#10
  300.         DIV        AB               
  301.         MOV        42H,B                                ;42H保存着十位数
  302.         MOV        41H,A                            ;43H保存着百位数
  303.         RET
  304.         ;---温度转换子程序---*************************************
  305.         POP        ACC                                        ;现场恢复
  306.         POP        PSW
  307.         
  308.         RET
  309.         
  310. TAB:        DB        0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H   ;共阳极段码表
  311.         ;---程序结束---
  312.         END
  313.         
复制代码

所有资料51hei提供下载:
05主机测温发送给从机显示温度(LCD版).rar (149.73 KB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:576088 发表于 2020-7-30 11:07 | 显示全部楼层
你好,我想问下,这个仿真电路图里 从机1的P1.0,P1.1,P1.2口我没有找到连接了什么元件。主机的P1口也没有接按钮开关,是INT1和INT0连接的按钮开关呀。
回复

使用道具 举报

ID:105782 发表于 2021-3-22 21:20 | 显示全部楼层
楼上的,连上了,总线的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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