标题:
单片机主机通过DS18B20测温,从机接收并且实时显示温度(汇编程序与仿真)
[打印本页]
作者:
oreooooo
时间:
2018-9-24 10:43
标题:
单片机主机通过DS18B20测温,从机接收并且实时显示温度(汇编程序与仿真)
单片机系统设计实验报告
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
(36.13 KB, 下载次数: 39)
下载附件
2018-9-25 02:10 上传
0.png
(7.32 KB, 下载次数: 34)
下载附件
2018-9-25 02:09 上传
单片机汇编语言源程序如下(主机):
;采用11.0592MHZ晶振
;++++++++++++执行DJNZ需要两个时间周期+++++++++++++
;T0定时器 方式1 16位计数
;1.init
;2.skip rom
;3.convert-t
;4.init
;5.skip-rom
;6.read
;7.receive-data
;8.cal
;9.display
DAT BIT P3.7 ;定义P3.7口为DQ线
WDLSB DATA 30H ;定义读出温度低字节,将温度低字节放在30H
WDMSB DATA 31H ;定义读出温度高字节,将温度高字节放在31H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_EXT0 ;外部中断0入口
ORG 0013H
LJMP INT_EXT1 ;外部中断1入口
ORG 0100H
MAIN:
MOV SP,#60H ;设置堆栈指针
SETB EX0 ;允许外部中断0产生中断
SETB IT0 ;外部中断0为跳沿触发方式
SETB EX1 ;允许外部中断1产生中断
SETB IT1 ;外部中断1为跳沿触发方式
SETB EA ;总中断打开
MOV IP,#01H
;---DS18B20测温子程序---
LCALL DS18B20_TP ;调用DS18B20测温子程序
HERE:
LJMP HERE
;----外部中断0子程序
INT_EXT0: ;外部中断子程序
CLR EA ;CPU关中断
PUSH PSW ;现场保护
PUSH ACC
SETB EA ;总中断允许位
MOV TMOD,#20H ;选择定时器T1,波特率是9600
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1 ;运行定时器T1
MOV SCON,#0D8H ;设置串口通信为方式3,SM2=0,RE=1,TB8=1
MOV PCON,#00H ;*****SMOD=0
MOV IE,#00H
MT1:
MOV SBUF,#01H ;发送1#从机地址,呼叫1#从机
LT1:
JBC TI,LT2 ;判TI?TI=1,跳转L2,并将TI=0;否则往下执行
LJMP LT1
LT2:
JBC RI,ST1 ;等待从机应答,如果接收完成,RI=1,转S1,RI=0;
;如果RI=0,往下执行
LJMP LT2 ;未接收完成,跳转L2继续等待
ST1:
MOV A,SBUF ;取出应答地址
XRL A,#01H ;判断是否1#从机应答
JZ RIGHTT ;是从机1#应答,转发送数据
LJMP MT1 ;如果不是1#从机应答,重新呼叫
RIGHTT:
CLR TB8 ;联络成功,清TB8,发送数据
;---启动发送个位温度数据
MOV SBUF,43H ;启动发送个位温度数据
TRANS_L:
JBC TI,OK ;TI=1,发送完成,并且清零TI,转NEXT
;TI=0,转WAIT继续等待
LJMP TRANS_L
;---接收从机发送过来的确认信息#0FFH
OK:
JBC RI,RECEIVE_OK ;主机等待从机应答,如果接受完毕,RI=1,并且转RECEIVE_OK
LJMP OK
RECEIVE_OK:
MOV A,SBUF
XRL A,#0FFH
JZ TRANS_H
LJMP MT1
;---启动发送十位温度数据
TRANS_H:
MOV SBUF,42H ;---启动发送十位温度数据
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MOV A,42H
MOV DPTR,#TAB ;翻译子程序,将段码表首地址放入DPTR
MOVC A,@A+DPTR ;查表后将键号对应的段码送入ACC
MOV P2,A ;将ACC值送入P2孔
WAIT_H:
JBC TI,NEXTT ;RI=1,发送完成,并且清零RI,转NEXT
;RI=0,转WAIT继续等待
LJMP WAIT_H ;启动发送十位温度数据
NEXTT:
CLR EA ;关中断
POP ACC ;现场恢复
POP PSW
SETB EA ;打开中断
RETI
;----外部中断1子程序
INT_EXT1:
CLR EA ;CPU关中断
PUSH PSW ;现场保护
PUSH ACC
SETB EA ;总中断允许位
MOV TMOD,#20H ;选择定时器T1,波特率是9600
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1 ;运行定时器T1
MOV SCON,#0D8H ;设置串口通信为方式3,SM2=0,RE=1,TB8=1
MOV PCON,#00H ;*****SMOD=0
MOV IE,#00H
M1:
MOV SBUF,#02H ;发送2#从机地址,呼叫2#从机
L1:
JBC TI,L2 ;判TI?TI=1,跳转L2,并将TI=0;否则往下执行
LJMP L1
L2:
JBC RI,S1 ;等待从机应答,如果接收完成,RI=1,转S1,RI=0;
;如果RI=0,往下执行
LJMP L2 ;未接收完成,跳转L2继续等待
S1:
MOV A,SBUF ;取出应答地址
XRL A,#02H ;判断是否1#从机应答
JZ RIGHT ;是从机1#应答,转发送数据
LJMP M1 ;如果不是1#从机应答,重新呼叫
RIGHT:
CLR TB8 ;联络成功,清TB8,发送数据
;---发送数据发送
MOV SBUF,#02H ;启动发送数据发送
WAIT:
JBC TI,NEXT ;RI=1,发送完成,并且清零RI,转NEXT
;RI=0,转WAIT继续等待
LJMP WAIT
NEXT:
CLR EA ;关中断
POP ACC ;现场恢复
POP PSW
SETB EA ;打开中断
RETI
;---DS18B20测温程序---
DS18B20_TP:
PUSH PSW ;现场保护
PUSH ACC
;---清两个显示缓冲单元41H
MOV R2,#3 ;清两个显示缓冲单元42H(保存温度值的十位),43H(保存温度值的个位)
MOV R0,#41H
OVER:
MOV @R0,#00H
INC R0 ;指针R0执行42H
DJNZ R2,OVER
LOOP:
;---读写DS18B20子程序
LCALL DSWD ;调用读写DS18B20子程序
LJMP LOOP ;循环读芯片的温度
DSWD:
;关中断
CLR EA
;---复位子程序(初始化)
LCALL RSTSNR ;调用复位子程序(INIT)
;---写跳过ROM命令
JNB F0,KEND ;如果DS18B20没有应答,跳KEND
MOV R0,#0CCH ;跳过ROM匹配命令
LCALL SEND_BYTE ;发送一字节的跳过ROM匹配命令
;---温度转换命令
MOV R0,#44H ;温度转换命令
LCALL SEND_BYTE ;发送一字节的温度转换命令
;打开中断
SETB EA
MOV 48H,#1 ;延时75ms以上准备读数据
SS2:
MOV 49H,#255
SS1:
MOV 4AH,#255
SS0:
DJNZ 4AH,SS0
DJNZ 49H,SS1
DJNZ 48H,SS2
CLR EA
LCALL RSTSNR ;复位程序(init)
JNB F0,KEND
MOV R0,#0CCH ;skip-rom指令
LCALL SEND_BYTE ;发送一字节的跳过ROM指令
MOV R0,#0BEH ;读DS18B20温度指令
LCALL SEND_BYTE ;发送一字节的温度转化指令
LCALL READ_BYTE ;读一个字节的温度值
MOV WDLSB,A ;读一字节定位温度值(低字节)
LCALL READ_BYTE ;读一个字节的温度值
MOV WDMSB,A ;读一字节定位温度值(高字节)
LCALL TRANS ;调用温度转换子程序,以便显示温度
KEND:
SETB EA ;打开中断
RET
;---主程序完成---**************************************
;---复位子程序**************************************
RSTSNR:
SETB DAT ;拉高DQ总线↑
NOP
NOP
CLR DAT ;拉低DQ总线↓
;---延时500μm
MOV R6,#250
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;250*2=500us DJNZ需要两个时间周期
SETB DAT ;DQ=1↑ 释放总线的控制权,IO转为输入↑
;---延时68μm
MOV R6,#34 ;延时68us
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp;
LCALL CHCK ;调用应答子程序,判断DS18B20是否可获得
;---延时500μm
MOV R6,#250
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延时500us
SETB DAT ;DQ=1↑
RET
CHCK:
MOV C,DAT ;读出DQ数据
MOV P1.7,C
JC RST0 ;如果DQ=0说明DS18B20可获得,DQ=1,DS18B20不可获得
SETB F0 ;标志位F0=1,DS18B20存在
LJMP CHCK0 ;子程序返回
RST0:
CLR F0 ;标志位F0=1,DS18B20不存在
CHCK0:
RET
;---复位子程序完成**************************************
;---发送一字节的跳过ROM匹配命令子程序**************************************
SEND_BYTE:
MOV A,R0 ;发送一字节的子程序
MOV R5,#8 ;循环发送8次
SEND:
CLR C
RRC A
JC SEN1
LCALL WRITE_0
LJMP SEN2
SEN1:
LCALL WRITE_1
SEN2:
DJNZ R5,SEND
RET
;---写0子程序---
WRITE_0:
CLR DAT ;DQ=0↓
;---延时68μm
MOV R6,#34
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延时68us,34*2=68us
SETB DAT ;释放总线控制权
NOP
NOP
RET
;---写1子程序---
WRITE_1:
CLR DAT ;DQ=0↓
NOP
NOP
SETB DAT ;DQ=1↑
;---延时68μm
MOV R6,#34
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延时68us
NOP
NOP
RET
;---发送一字节的跳过ROM匹配命令子程序完成**************************************
;---读一个字节的温度子程序--*******************************
READ_BYTE:
MOV R5,#8
READ1:
LCALL READ
RRC A
DJNZ R5,READ1
MOV R0,A ;把温度值保存在R0中
RET
READ:
CLR DAT ;DQ=0↓
NOP
NOP
SETB DAT ;DQ=1↑ 准备接收数据
NOP
NOP
MOV C,DAT ;单片机读数据。C中保存DS18B20发送过来的数据
;---延时68μm
MOV R6,#34
DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延时68um
RET
;---读一个字节的温度子程序完成--*******************************
;---温度转换子程序---*************************************
TRANS:
MOV A,30H ;温度转换程序(只取整数),30H=LSM,31H,MSB(加入收到温度是125 A=0000 0111 1101 0000)
ANL A,#0F0H ;保留低八位的整数位 A=1101 0000
MOV 3AH,A
MOV A,31H
ANL A,#0FH ;保留高八位的正数位 A=0000 0111
ORL A,3AH ;取出八位正整数
SWAP A
MOV B,#10
DIV AB
MOV 43H,B ;41H保存着个位数
MOV B,#10
DIV AB
MOV 42H,B ;42H保存着十位数
MOV 41H,A ;43H保存着百位数
RET
;---温度转换子程序---*************************************
POP ACC ;现场恢复
POP PSW
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳极段码表
;---程序结束---
END
复制代码
所有资料51hei提供下载:
05主机测温发送给从机显示温度(LCD版).rar
(149.73 KB, 下载次数: 40)
2018-9-25 02:11 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
979856362dlut
时间:
2020-7-30 11:07
你好,我想问下,这个仿真电路图里 从机1的P1.0,P1.1,P1.2口我没有找到连接了什么元件。主机的P1口也没有接按钮开关,是INT1和INT0连接的按钮开关呀。
作者:
黑天科技
时间:
2021-3-22 21:20
楼上的,连上了,总线的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1