单片机温度、压力信息采集与电机控制系统


第一章 系统整体概述

本次单片机温度、压力信息采集与电机控制系统实验是基于模数转换,数模转换,LCD显示,键盘扫描,脉冲控制等知识的一个综合性的实验模块。
本次实验作品主要包括温度的采集与显示,压力的采集与显示,步进电机的驱动与控制三个模块。
温度的采集采用DS18B20模块,DS18B20采集温度后将温度转换为数字量并将数字量通过串行通信的方式发送给单片机。压力的采集采用称重传感器和HX711模块,HX711可将称重传感器的小信号放大并转换为数字量,最后再通过串行通信的方式将数字量传送给单片机。单片机处理完HX711和DS18B20的数据后,将压力值和温度值显示再LCD1602上。步进电机模块采用了一个四相五线的步进电机和一个ULN2003A驱动板,单片机连接驱动板,驱动板放大单片机的脉冲信号后驱动步进电机转动。
本次实验的硬件部分主要包括单片机最小系统,LCD1602显示屏,DS18B20测温模块,步进电机和驱动板以及称重传感器和HX711模块。

第二章 硬件设计与实现

1.准备电路元器件及焊接工具:STC89C52RC芯片1个、IC插座、40p排针2个、12MHz晶振1个、30pF瓷片电容2个、10uF电解电容1个、排阻一个、电阻若干、LCD1602A显示屏1个、称重传感器1个、HX711模块1个、DS18B20模块1个、步进电机1个、ULN2003A驱动板1个、蜂鸣器1个、10*15cm洞洞板一个、电源线、杜邦线、下载器、电烙铁、焊锡丝等。
2.焊接电路板:按照设计好的原理图进行焊接。
3.调试:下载程序,将单片机系统与各个模块相连,观察LCD是否正常显示压力、温度等信息,若正常显示,说明压力,温度模块正常,按动按键,观察步进电机是否随按键控制正常转动,若转动正常,说明步进电机模块正常。

  • 焊接成果图

第三章 软件设计与编程

1.编写代码:利用keil软件进行编程,本次设计使用了汇编语言来进行编写。
2.设计仿真电路图:将电源、时钟电路、复位电路、51单片机、DS18B20模块、称重传感器模块、HX711模块及LCD1602显示屏正确连接。电源选用+5v,晶振选用12MHz,时钟电路选用30pF电容,复位电路选用10kΩ电阻、10uF电容。
3.仿真调试:用proteus进行仿真测试,将事先编好的程序导入51单片机中,以测试程序是否能达到目标要求。

  • 编程
    ORG 0000H
    //接口初始化
    DOUT EQU P2.2
    SCK EQU P2.3

RS EQU P2.5
RW EQU P2.6
E EQU P2.7

DQ EQU P2.4
GEWEI1 EQU 35H
SHIWEI1 EQU 36H

QIAN EQU 31H
BAI EQU 32H
SHI EQU 33H
GEWEI EQU 34H

FENGMING EQU P3.7
LJMP MAIN

ORG 000BH
LJMP IT00 //中断入口
ORG 0100H
MAIN:
MOV P0,#00000001B
ACALL ENABLE
MOV P0,#00111000B
ACALL ENABLE
MOV P0,#00001100B
ACALL ENABLE
MOV P0,#00000110B
ACALL ENABLE
MOV P0,#80H
ACALL ENABLE
MOV P0,#’W’
ACALL WRITELCD

MOV P0,#’E’
ACALL WRITELCD

MOV P0,#’N’
ACALL WRITELCD

MOV P0,#’D’
ACALL WRITELCD

MOV P0,#’U’
ACALL WRITELCD

MOV P0,#’:’
ACALL WRITELCD
MOV P0,#0C0H
ACALL ENABLE

MOV P0,#’Y’
ACALL WRITELCD
MOV P0,#’A’
ACALL WRITELCD
MOV P0,#’L’
ACALL WRITELCD
MOV P0,#’I’
ACALL WRITELCD
MOV P0,#’:’
ACALL WRITELCD

MOV P0,#0C9H
ACALL ENABLE

MOV P0,#’g’
ACALL WRITELCD
MOV 40H,#00H

MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0

ACALL DIANJI
LJMP MAIN
IT00:
INC 40H
MOV A,40H
CJNE A,#3AH,L11

L10: MOV 40H,#00H
ACALL AD

L11:MOV TH0,#3CH
MOV TL0,#0B0H
RETI
AD:
ACALL READTEM
ACALL YALI

ACALL XIANSHI

MOV P0,#86H
ACALL ENABLE
MOV P0,SHIWEI1
ACALL WRITELCD
MOV P0,#87H
ACALL ENABLE
MOV P0,GEWEI1
ACALL WRITELCD

CLR C
MOV A,#00H
SUBB A,GEWEI1
MOV A,#03H
SUBB A,SHIWEI1
JNC L12
CLR P3.7
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
ACALL DELAY1
SETB P3.7
L12:
MOV P0,#0C5H
ACALL ENABLE
MOV P0,QIAN
ACALL WRITELCD
MOV P0,#0C6H
ACALL ENABLE
MOV P0,BAI
ACALL WRITELCD
MOV P0,#0C7H
ACALL ENABLE
MOV P0,SHI
ACALL WRITELCD
MOV P0,#0C8H
ACALL ENABLE
MOV P0,GEWEI
ACALL WRITELCD

RET
//步进电机
DIANJI:
MOV 38H,#00H
JNB P3.0,START1
JNB P3.1,START2
JNB P3.2,START3

LJMP DIANJI
START1:
MOV DPTR,#TABLE1
LJMP LOOP
START2:
MOV DPTR,#TABLE2
LJMP LOOP
START3:
MOV DPTR,#TABLE3
LJMP LOOP
LOOP:
MOV A,38H
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY1
INC 38H
MOV A,38H
CJNE A,#08H,LOOP

JNB P3.0,L1
JNB P3.1,L1
JNB P3.2,L1
MOV 38H,#00H
LJMP LOOP
L1:
LJMP DIANJI
RET

DELAY1:MOV R5,#25 //步进电机的延时
DEL1:MOV R6,#50
DJNZ R6,$
DJNZ R5,DEL1
RET
//步进电机码表
TABLE1:
DB 02H,06H,04H,0CH,08H,09H,01H,03H
TABLE2:
DB 03h,01H,09H,08H,0CH,04H,06H,02H
TABLE3:
DB 00H,00H,00H,00H,00H,00H,00H,00H

//温度传感器

READTEM:

ACALL RST

MOV R1,#30
DJNZ R1,$
MOV A,#0CCH
ACALL WRITE
MOV A,#44H
ACALL WRITE
ACALL RST
MOV R1,#30
DJNZ R1,$
MOV A,#0CCH
ACALL WRITE
MOV A,#0BEH
ACALL WRITE

ACALL READ
MOV 30H,A ;读低八位
ACALL READ
MOV 31H,A ;读高八位

ANL 30H,#0F0H
ANL 31H,#0FH
MOV A,30H
ORL A,31H
SWAP A

MOV R3,A

MOV B,#10
DIV AB
ADD A,#30H
MOV SHIWEI1,A
MOV A,B
ADD A,#30H
MOV GEWEI1,A
RET

RST:SETB DQ ; 总线释放
NOP ; 保持高电平,延时
CLR DQ ; 总线置 0,请求响应
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ; 延时
SETB DQ ; 再释放
MOV R0,#25H
TSR2: JNB DQ,TSR3 ; 改变为 0,则代表得到对应
DJNZ R0,TSR2 ; 未得到则继续等待,判断
TSR3: ; 得到相应则标志位置 1,代表传感器正常存在
MOV R0,#06BH
TSR4: DJNZ R0,TSR4 ; 延时
SETB DQ
RET

WRITE:MOV R0,#8
LOOP1:
CLR C
CLR DQ

RRC A
MOV R1,#6
DJNZ R1,$
MOV DQ,C
MOV R1,#23
DJNZ R1,$
SETB DQ
NOP

DJNZ R0,LOOP1
SETB DQ
MOV R1,#05
DJNZ R1,$
RET

READ:;
MOV R0,#8
LOOP2:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R1,#7
DJNZ R1,$
MOV C,DQ
RRC A
MOV R1,#23
DJNZ R1,$

DJNZ R0,LOOP2
RET

ENABLE:CLR RS
CLR RW
CLR E
ACALL DELAY2
SETB E
RET
WRITELCD:SETB RS
CLR RW
CLR E
ACALL DELAY2
SETB E
RET

DELAY2:
MOV R4,#200
D1:MOV R5,#200
D2:DJNZ R5,D2
DJNZ R4,D1
RET

//压力传感器
YALI:

CLR SCK
JB DOUT,$
MOV R0,#24
LOOP3:
SETB SCK
NOP
CLR SCK
MOV C,DOUT

XCH A,R4
RLC A
XCH A,R4 //低八位
XCH A,R3
RLC A
XCH A,R3 //中八位
XCH A,R2
RLC A
XCH A,R2 //高八位

DJNZ R0,LOOP3

SETB SCK
NOP
CLR SCK ;采集部分到此结束

RET

ZHUANHUAN:
NDIV31:
MOV A,R2
MOV B,R7
DIV AB
PUSH ACC
MOV R2,B
MOV B,#10H
NDV311:
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312:
MOV R2,A
INC R4
NDV313:
DJNZ B,NDV311
POP ACC
;CLR OV
JZ NDV314
;SETB OV
NDV314:
XCH A,R2
MOV R7,A
RET

XIANSHI:
MOV A,R2
XRL A,#80H
MOV R2,A

MOV R7,#40
LCALL ZHUANHUAN

MOV R7,#10
LCALL ZHUANHUAN//到此温度转换结束

//去皮,减去初始重量
MOV R0,#04H
L3:CLR C
MOV A,R4
SUBB A,#208
MOV R4,A
JC JIAN
LJMP L2
JIAN:DEC R3
L2:DJNZ R0,L3

MOV R7,#10
LCALL ZHUANHUAN
MOV A,R7
ADD A,#30H
MOV GEWEI,A

MOV R7,#10
LCALL ZHUANHUAN
MOV A,R7
ADD A,#30H
MOV SHI,A

MOV R7,#10
LCALL ZHUANHUAN
MOV A,R7
ADD A,#30H
MOV BAI,A

MOV R7,#10
LCALL ZHUANHUAN
MOV A,R7
ADD A,#30H
MOV QIAN,A

RET

END

*Proteus 仿真电路图

第四章 作品调试与分析

相比于之前的几次实验,这次的实验难度明显要高出一个数量级。从拿到实验方案开始,每一步都充满了许多问题,光是确立实验的基本方案和实验器件的选取就花费了好长时间。经过反复的筛选、比较,温度传感器选择了12位精度的DS18B20,蜂鸣器选择了有源的蜂鸣器,最麻烦的还是压力传感器的选取了,在反复查找信息之后,我简单地罗列出了三套方案:
1.使用压片传感器加上一个电压转换模块和ADC0809来完成压力的测试。压片传感器将压力值转换为电阻值,电压转换模块再将电阻值转换为电压值,最后再由ADC0809将电压值转换为数字量,送交单片机处理。
2.使用称重传感器和小信号放大芯片以及ADC0809芯片来实现。称重传感器将压力值转换为一个电压值,信号放大芯片将这个电压值放大到ADC0809可以处理的状态,最后由ADC0809将数字量送交给单片机。
3.使用称重传感器加上一个HX711芯片来实现。HX711是一个自带增益的AD芯片,可以放大称重传感器产生的电压值并将它转换为数字量,最后HX711通过串行通信的方式将数字量传送给单片机。
反复考虑各个方案的实用性,精度,稳定性以及可实现性之后,我选择了第三个方案,通过HX711来实现本次的压力测量。
本次实验模块在硬件的焊接上并没有遇到太大的问题,最大的难点还是在程序的编写和仿真的实现上。
相对来说,步进电机的程序编写还是比较简单的,通过调制脉冲来驱动步进电机的转动,仿真的演示也没有遇到什么困难。但在进行实物制作的时候还是遇到了一些问题,明明仿真可以执行的程序,但在实物里步进电机就是无法转动,经过反复排查,发现原来是程序的延时存在问题,修改了延时之后,步进电机终于开始了转动。
DS18B20是一个具有12位精度的温度采集模块,DS18B20的时序相对来说比较复杂,在编写汇编程序的时候,我上网查找了很多资料,分析了好多时序图,也在这个过程中认识到了时序对于单片机程序的重要性。在DS18B20的实物实现时,也遇到了仿真时没有遇到的问题,后来发现原来是晶振的问题,更换晶振之后,DS18B20也终于正常读取显示了温度。
最麻烦的还是HX711模块的使用了,HX711模块是一个高精度的24位的自带增益的AD模块,可以将模拟量转换为数字量之后以串行通信的方式发送给单片机。由于51单片机一次只能处理8位数据,所以24位的数据必须读取到3个寄存器中来处理,而且HX711读取的的数值必须要做一个除法才能得到压力值,这样就特别的麻烦,我花时间最长的地方也是在这里,经过反复地查找资料,不断修改自己的程序,最后通过移位相减的方法把HX711的数据给处理了。最后做出的实物总有一个不为零的初始值,经过反复考虑,我觉得是传感器本身所造成的,最后通过把所有的压力值都减去这一个初始值,获得了真实的重量。

在三个模块都各自制作完毕,没有什么问题之后,我试着把这三个模块综合起来。温度和压力模块都通过不断扫描,反复执行的方法结合在了一起,但是在结合步进电机的时候遇到了麻烦,如果把温度和压力模块直接嵌入到步进电机的程序中,步进电机的转动就会产生问题。经过反复思索后,我写了一个定时中断的程序,把步进电机的程序放在了主程序中,而把温度和压力扫描的程序放在了中断中,这样每隔一段时间,单片机就会扫描显示一次温度和压力值,而在其他时间,都在扫描按键,执行步进电机的程序。最终,通过这样一个中断,终于把几个模块完美地结合在了一起。

第五章 制作感受

本次实验模块的设计与制作相比之前的三个实验确实难了好多,自己花费的时间也长了好多,在整个模块的制作过程中前前后后遇到了好多困难,但自己在不断克服困难的过程中也得到了很大的提高与成长。
从实验方案的设计,实验器件的选取,汇编语言的编写,到仿真的演示和实物的实现,每一步充满了各种挫折和困顿。第一次自己接到一个只有题目,没有例子的方案,从零开始设计制作,每一步都比之前的实验难了很多。中间好多时候都感到很沮丧,甚至都不太想做了,整个人状态就很不好,尤其是写代码的时候,反反复复,改来改去就是得不到想要的结果,甚至有时候都不想用汇编了,想之间拿c语言把这个程序给写了。但是自己还是逐渐地调整状态,慢慢地解决了一个又一个问题,最终用汇编语言完成了整个实验模块。最终完成的时候,看着整个四五百行的汇编程序,就觉得特别有成就感。
写代码和做实物的过程中虽然遇到过很多挫败,也有过很多心情沮丧的时候,但更多的是知识的成长以及心中不断燃烧的好奇与热情,我想正是在这样的热情和兴趣下,自己才能一步步克服障碍,完成了这次实验模块的制作。 尽管每一次遇到困难都很沮丧,但当自己战胜一个又一个困难,最后完成整个实验模块的时候,就感觉之前所有的沮丧都不值一提。
通过温度压力采集及步进电机的驱动系统设计与制作,自己的的确确学到了很多。从知识方面来看,自己认识到了温度、压力传感器的使用,还对串行通信有了更加深入的认识,看到了串行通信相对于并行通信的优势。另外,自己也对汇编语言有了更加深入而细致的认识,了解到了如何使用汇编语言经行加减运算,位操作以及数据处理,看到了汇编语言相对其他语言在单片机操作上的优势,看到了汇编语言的形象化与底层化。除此之外,自己通过这个过程,也收获了更多新的技能,对单片机有了更加深入而全面的认识,为以后的理论学习和课程实践打下了一个稳健的基础。自己也十分期待在未来的学习和工作中,能够更加深入地学习单片机,并把这些知识和技能应用到未来的工作和生活中。


文章作者: pcl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 pcl !
评论
  目录