基于51单片机和DS18B20的自动控温小风扇

作者:刘依哲    发布于:

起因

学完单片机课程后的一次课程设计,也算是对自己学习的知识的一个应用,以前都是用C写的代码这次尝试使用汇编语言实现

想法

使用DS18B20进行环境温度测量,使用52单片机进行数据读取
利用PWM和LM298N模块进行风扇的调速(通过温度的变化来调整风速)
使用蓝牙通信,通过上位机设定所需维持温度

DS18B20模块

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。其只需三条线即可工作

alt 文本

硬件搭建

将各个模块焊接于洞洞板上 最终效果如下

alt 文本

软件搭建

第一次使用汇编写52的代码,非常不习惯啊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
T2CON EQU 0C8H
T2MOD EQU 0C9H
TR2 EQU T2CON.2
TF2 EQU T2CON.7
TL2 EQU 0CCH
TH2 EQU 0CDH
RCAP2L EQU 0CAH
RCAP2H EQU 0CBH
T2MODE EQU 0C9H
TARGHT EQU 41H
COUNTER EQU R3
DS18DQ EQU P1.3 //P1.3与DS18DQ等同,便于理解
TEMPH EQU 29H //保存读出温度的低8位
TEMPL EQU 28H //保存读出温度的高8位
DS18FLAG EQU 40H //设置标志
ORG 0000H
;定时器0中断产生方波用
LJMP START
ORG 000BH
LJMP WAVE
START: MOV 30H,#00 //设置初始值
MOV 31H,#00
MOV 32H,#00
START1:
MOV TMOD,#21H
MOV TL1,#0F3H
MOV TH1,#0F3H
MOV PCON,#80H
CLR TI
MOV SCON,#50H

START2:
MOV TL0,#000H
MOV TH0,#0F9H
SETB TR0
SETB ET0
SETB EA;
LCALL DS18_GF //设置DS18B20的工作方式
START3:
LJMP START3

//初始化子程序
DS18_START:
PUSH 07H //保存R7的值,防止改变R7的数值
SETB DS18DQ //将数据线拉高
NOP //延时1us
CLR DS18DQ //将数据线拉低
MOV R7,#0 //延时大约512us
DJNZ R7,$
SETB DS18DQ //将数据线拉高
MOV R7,#40
DS18_START1: //延时大约160us
JNB DS18DQ,DS18_START2 //检查DS18B20是否工作正常
DJNZ R7,DS18_START1
SETB DS18FLAG //工作不正常
DS18_START2:
CLR DS18FLAG
MOV R7,#100 //延时月200us
DJNZ R7,$
POP 07H //恢复R7的值
RET
//设置DS18B20工作方式
DS18_GF:
CLR DS18FLAG //清除标志
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND //
MOV A,#4EH //向RAM写数据
LCALL DS18_SEND
MOV A,#75
LCALL DS18_SEND
MOV A,#0
LCALL DS18_SEND
MOV A,#7FH //设置工作方式
LCALL DS18_SEND
CLR DS18DQ //释放总线
LCALL DELAY500US //延时500us
RET

//输出转换温度命令
CONVERT_TEMPERATURE:
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND
MOV A,#44H //温度转换
LCALL DS18_SEND
RET
//读温度数据
GET_TEMPERATURE:
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND
MOV A,#0BEH //从RAM中的数据
LCALL DS18_SEND
LCALL DELAY60US
LCALL DS18_READ
MOV TEMPL,A //将获得数据的低八位存到TEMPL
LCALL DS18_READ
MOV TEMPH,A //将获得数据的高八位存到TEMPH
CLR DS18DQ //即复位。否则会一直读到
LCALL DELAY501US //暂存第九字节
RET

//计算获得温度值,便于现实
CAL_TEMPERATURE:
PUSH 07H //暂存,防止改变R7的数据
CLR C //进位标志清零
MOV R7,#04H //循环次数

EX2: MOV A,TEMPH // 这些语句的作用是:
RRC A // 整数位在:TEMPL中
MOV TEMPH,A //?数位在:TEMPH中的高半
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R7,EX2 //

MOV A,TEMPH //
RLC A //这些语句的作用是:
RLC A //把TEMPH得高半移到低四位中
RLC A
RLC A //
ANL A,#0FH //屏蔽高四位,保留低四位
MOV DPTR,#TAB_TEMP //赋带?数点的数值表的表首地址
MOVC A,@A+DPTR
MOV 30H,A //暂存该值,用于显示
MOV A,TEMPL
CLR C
MOV B,#0AH
DIV AB //分离整数位的高低四位
MOV 32H,A //暂存十位
MOV A,B
ADD A,#10H
MOV 31H,A //暂存个位
POP 07H //恢复R7的值
RET
//写数据子程序
DS18_SEND:
PUSH 06H //保护Rn的值
PUSH 07H
//以下语句是"写 笔毙虻脑?
SETB DS18DQ //写时序是有DS18DQ的下降沿决定
NOP //延时1us
MOV R6,#08H //循环次数,一个字节
DS18_SEND1:
CLR DS18DQ //拉低,产生下降沿
MOV R7,#07 //延时大约15us
DJNZ R7,$
RRC A //把要写入得数据的高位移到C中
MOV DS18DQ,C //再把C的值赋给DS18DQ
MOV R7,#30 //延时时间约为60us,只要大约45us即可
DJNZ R7,$
SETB DS18DQ //拉高准备,下次产生下降沿
DJNZ R6,DS18_SEND1 //判断循环次数够了没
POP 07H //恢复Rn的数据
POP 06H
RET
//读数据子程序
DS18_READ:
PUSH 06H // 保护Rn的值
PUSH 07H
//以下为 岸?钡氖毙?
SETB DS18DQ //拉高,准备产生下降沿
MOV R6,#08H //循环次数
CLR A //A清零,准备装值
DS18_READ1:
CLR DS18DQ //拉低,产生下降沿
NOP //延时2us,其实有没有都没有什么关系
NOP
SETB DS18DQ //释放总线
MOV R7,#07H //等待15us
DJNZ R7,$
MOV C,DS18DQ //获?数据
RRC A //将获得数据存到A中
MOV R7,#30 //延时60us
DJNZ R7,$
SETB DS18DQ //拉高,准备下次产生下降沿
DJNZ R6,DS18_READ1
POP 07H //恢复Rn的
POP 06H
RET

DISPLAY:
XCH A,R1
MOV A,#0AH
MOV B,32H
MUL AB
ADD A,31H
MOV 33H,A
MOV TARGHT,33H
XCH A,R1
RET
WAVE:
CLR EA
LCALL CONVERT_TEMPERATURE //调用转子程序
MOV R5,#80
LOOP1: LCALL DISPLAY //调用显示防止掉显,同时等待转换完成
DJNZ R5,LOOP1
LCALL GET_TEMPERATURE //获?转换值
LCALL CAL_TEMPERATURE //计算温度值

MOV SBUF,R1;发送温度到串口4800
JNB TI,$
CLR TI
CJNE COUNTER,#30H, ZGENGSHU
MOV COUNTER,#25H
CLR TF0
MOV TL0,#000H
MOV TH0,#0D9H
SETB EA
RETI
FUSHU:
SETB P2.0
CLR TF0
MOV TL0,#000H
MOV TH0,#0D9H
SETB EA
RETI
ZGENGSHU:
INC COUNTER
MOV A,COUNTER
SUBB A,TARGHT
JB ACC.7, FUSHU
CLR P2.0
CLR TF0
MOV TL0,#000H
MOV TH0,#0D9H
SETB EA
RETI

最后完成这次课设,模拟了大棚的调温系统,但是这只是简单的模拟,和真正的控温系统差的还是很远…..

format_list_numbered

(无)

  1. 1. 起因
  2. 2. 想法
  3. 3. DS18B20模块
  4. 4. 硬件搭建
  5. 5. 软件搭建
vertical_align_top

Copyright © 2017 欢迎来到我的博客

Powered by Hexo && Theme - Vateral