单片机系统设计实验报告
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仿真工程文件可到本帖附件中下载)
单片机汇编语言源程序如下(主机):
- ;采用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)
|