温度传感器实训报告.docx
- 文档编号:24810139
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:45
- 大小:525.54KB
温度传感器实训报告.docx
《温度传感器实训报告.docx》由会员分享,可在线阅读,更多相关《温度传感器实训报告.docx(45页珍藏版)》请在冰豆网上搜索。
温度传感器实训报告
《温度传感器实训报告》
实
训
报
告
课程:
信号检测与技术
专业:
应用电子技术
班级:
应电 1131 班
小组成员:
欧阳主、王雅志、朱知荣、周玙旋、周合昱
指导老师:
宋晓虹老师
2013 年4月23日
一、实训目的
了解 18b20 温度传感器的基本原理与应用
2、实训过程
1、电路实现功能:
由电脑 USB 接口供电,也可外接 6V—16V 的直流电源。
通过温度传感器
18B20 作为温度传感器件,测出改实际温度,再由芯片为DIP封装
AT89C2051 单片机进行数据处理,通过数码管显示温度值。
温度显示(和控制)的范围为:
-55ºC 到 125ºC 之间,精度为 1ºC,也就是
显示整数。
如果你设定报警的温度为 20ºC,则当环境温度达到 21ºC 时,报警
发光二极管发光,同时继电器动作。
如果你不需要对温度控制(报警),可以
将报警温度值设置高些。
如果控制的是某局部的温度,可将 18B20 用引线引出,
但距离不宜过大,注意其引脚绝缘。
2.电路的构成
该电路有电源、按键控制模块、信号处理、驱动模块、显示模块、检测。
3.电路原理图
AN1
vcc
J3
C1
AN2
AN3
C5
104
+ C4
470UF
1
2
3
4
USB
J1
30P JZ
C2
30P
JDQ V1
1N4148
P1
P2
P3
10K
1
2
3
4
5
6
7
8
9
10
C3
10UF
IC1
RST
P3.0(RXD)
P3.1(TXD)
XTAL2
XTAL1
P3.2(INT0)
P3.3(INT1)
P3.4(T0)
P3.5(T1)
GND
AT89C2051
VCC 20
P1.7 19
P1.6 18
P1.5 17
P1.4 16
P1.3 15
P1.2 14
P1.1 13
P1.0 12
P3.7 11
VCC
R7
R8
R9
R10
R11
R12
R13
220*7
P3.7
D7
D6
D5
D4
D3
D2
D1
LED2
LED-3
8.8.8.
IC3
L7805
OUT 3
IN
8.
LED1
a 1
c
f
J2
2
1
Q1
8550
LED3 R5
2K
IC2
DS18B20
R14
470
Q2
Q3
Q4
VCC
R6
4.7K
P1
P2
R2
4.7K
R3
8550
8550
8550
P3
4.7K
R4
4.7K
VCC
4.电路仿真图
五、元件清单及功能介绍
名称
规格
编号
主要功能或作用
按钮
6X6X5
AN1、AN2、AN3
调节报警温度的值
电容
30P
C1、C2
单片机时钟振荡
电容
10UF
C3
单片机复位
电容
470UF
C4
电源滤波
电容
104
C5
电源滤波
单片机(20P 座)
AT89C2051
IC1
CPU
温度传感器
DS18B20
IC2
温度传感器
稳压块
L7805
IC3
电路工作于+5V
接线座
3P5.0
J1
外电路控制接线座
接线座
2P5.0
J2
外接电源接线
USB 电源插座
USB
J3
电脑供电插座
晶体
12M
JZ
单片机时钟振荡
一位共阳数码管
0.56
LED1
摄氏温度符号显示
三位共阳数码管
0.56
LED2
温度值显示
发光二极管
3MM
LED3
报警发光指示兼 Q1 偏置
三极管
8550
Q1、Q2、Q3、Q4
Q1:
报警时驱动继电器;Q2Q3Q4:
数码管驱动
电阻
10K
R1
单片机复位
电阻
220 和 470
R7—R13 和 R14
数码管限流,其中 R14=470
电阻
4.7K
R2、R3、R4、R6
三极管基极和温度传感器偏置
电阻
2K
R5
三极管 Q1 基极偏置
二极管
1N4148
V1
续流,保护 Q1
跳线
X1、X2
用元件引脚连
继电器
5V2A
JDQ
温度达到报警值时触点动作
PCB 板
73MMX85MM
USB 电源线
连接电脑 USB 口
6、程序:
/*-------------------------------
温度控制器 V1.5
显示为三个共阳极 LED
温度传感器用单总线 DS18B20
CPU 为 2051,四个按键,分别为 UP,DOWN,SET
温度调节上限为 125 度,下限为-55 度
只能用于单只 18B20
-------------------------------*/
#include
#include
#define Key_UPP3_0//上调温度
#define Key_DOWNP3_1//下调温度
#define Key_SETP1_7//设定键(温度设定,长按开电源)
#define RelayOutPortP3_5//继电器输出
#define LEDPortP1//LED 控制口
#define LEDOneCP3_2//LED DS1 控制(百位)
#define LEDTwoCP3_3//LED DS2 控制(十位)
#define LEDThreeCP3_4//LED DS3 控制(个位)
#define TMPortP3_7//DS1820 DataPort
unsignedcharcode
LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};//0-9 的 LED
笔划,0xFF 为空,0xF7 为负号
static unsigned char bdata StateREG; //可位寻址的状态寄存器
sbit DS1820ON = StateREG^0;//DS1820 是否存在
sbit SetTF = StateREG^1;//是否是在温度设置状态
sbit KeySETDown = StateREG^2;//是否已按过 SET 键标识
sbit PowTF = StateREG^3;//电源电源标识
sbit KeyTF = StateREG^4;//键盘是否允许
//sbit KeySETDowning = StateREG^5;//SET 是否正在按下
static unsigned char bdata TLV _at_ 0x0029;//温度变量高低位
static unsigned char bdata THV _at_ 0x0028;
static signed char TMV;//转换后的温度值
static unsigned char KeyV,TempKeyV;//键值
static signed char TMRomV _at_ 0x0027;//高温限制
static signed char TMSetV _at_ 0x0026;//温度设定值
static unsigned char KSDNum;//SET 键连按时的采集次数
static unsigned char IntNum,IntNum2,IntNum3;//中断发生次数,IntNum 用于 SET 长按检
测,IntNum2 用于设定状态时 LED 闪烁
static signed char LED_One,LED_Two,LED_Three;//LED 的显示位 LED_One 为十位,
LED_Two 为个位
static unsigned char Sign; //负号标识
void main(void)
{
void InitDS1820(void);//定义函数
void ROMDS1820(void);
void TMVDS1820(void);
void TMRDS1820(void);
void TMWDS1820(void);
void TMREDS1820(void);
void TMERDS1820(void);
void ReadDS1820(void);
void WriteDS1820(void);
void Delay_510(void);
void Delay_110(void);
void Delay_10ms(void);
void Delay_4s(void);
void V2ToV(void);
StateREG = 0;//初始化变量
SetTF = 1;
PowTF = 1;//关电源
THV = 0;
TLV = 0;
TMV = 0;
KeyV = 0;
TempKeyV = 0;
KSDNum = 0;
IntNum = 0;
IntNum2 = 0;
IntNum3 = 0;
LED_One = 0;
LED_Two= 0;
InitDS1820(); //初始化
ROMDS1820(); //跳过 ROM
TMERDS1820();//E2PRAM 中温度上限值调入 RAM
InitDS1820(); //初始化
ROMDS1820(); //跳过 ROM
TMRDS1820(); //读出温度指令
ReadDS1820(); //读出温度值和上限值
TMSetV = TMRomV;//拷贝保存在 DS18B20ROM 里的上限值到 TMSetV
EA = 1;//允许 CPU 中断
ET0 = 1;//定时器 0 中断打开
TMOD = 0x1;//设定时器 0 为模式 1,16 位模式
TH0=0xB1;
TL0=0xDF;//设定时值为 20000us(20ms)
TR0 = 1;//开始定时
while
(1);
}
//定时器 0 中断外理中键扫描和显示
void KeyAndDis_Time0(void) interrupt 1 using 2
{
TH0=0xB1;
TL0=0xDF;//设定时值为 20000us(20ms)
LEDPort = 0xFF;
if (!
Key_UP)
KeyV = 1;
if (!
Key_DOWN)
KeyV = 2;
if (!
Key_SET)
KeyV = 3;
//KeySETDowning = 0;//清除
if (KeyV !
= 0)//有键按下
{
Delay_10ms();//延时防抖按下 10ms 再测
if (!
Key_UP)
TempKeyV = 1;
if (!
Key_DOWN)
TempKeyV = 2;
if (!
Key_SET)
TempKeyV = 3;
if (KeyV == TempKeyV)//两次值相等为确定接下了键
{
if (KeyV == 3)//按下 SET 键,如在 SET 状态就退出,否则进入
{
//KeySETDowning = 1; //表明 SET 正在按下
PowTF = 0;//电源标识开
if (!
KeyTF)
if (SetTF)
{
SetTF = 0;//标识位标识退出设定
InitDS1820(); //初始化
ROMDS1820(); //跳过 ROM
TMWDS1820(); //写温度上限指令
WriteDS1820(); //写温度上限到 DS18B20ROM
WriteDS1820(); //写温度上限到 DS18B20ROM
WriteDS1820(); //写温度上限到 DS18B20ROM
InitDS1820(); //初始化
ROMDS1820(); //跳过 ROM
TMREDS1820();//温度上限值 COPY 回 E2PRAM
}
else
SetTF = 1;
if (!
KeySETDown) //没有第一次按下 SET 时,KeySETDown 标识置 1
KeySETDown = 1;
else
KSDNum = KSDNum + 1;//前一秒内有按过 SET 则开始计数
}
if (SetTF)//在 SET 状态下
{
if ((KeyV == 1) && (!
KeyTF))
TMSetV = TMSetV + 1;//上调温度
if ((KeyV == 2) && (!
KeyTF))
TMSetV = TMSetV - 1;//下调温度
if (TMSetV <= -55)//限制温度上下限
TMSetV = -55;
if (TMSetV >= 125)
TMSetV = 125;
}
if ((!
KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
}
if (KeySETDown)//在 2 秒内按下了 SET 则计中断发生次数用于长按 SET 时
计时用
IntNum = IntNum + 1;
if (IntNum > 55)//中断发生了 55 次时(大约 1.2 秒)75 为 1.5 秒左右
{
IntNum = 0;
KeySETDown = 0;
if (KSDNum == 55)//如一直长按了 SET1.2 秒左右
{
RelayOutPort = 1;//关闭继电器输出
PowTF = 1;//电源标识关
LEDOneC = 0;
LEDTwoC = 0;
LEDThreeC = 0;
LEDPort = 0xBF;//显示"--"
Delay_4s();//延时
LEDOneC = 1;
LEDTwoC = 1;//关显示
LEDThreeC = 1;
Delay_4s();
IntNum = 0;
IntNum2 = 0;
IntNum3 = 0;
}
KSDNum = 0;
}
}
KeyV = 0;
TempKeyV = 0;//清空变量准备下次键扫描
if (!
PowTF)
{
InitDS1820(); //初始化
ROMDS1820();//跳过 ROM
TMVDS1820();//温度转换指令
Delay_510();
Delay_510();//延时等待转换完成
InitDS1820(); //初始化
ROMDS1820();//跳过 ROM
TMRDS1820();//读出温度指令
ReadDS1820(); //读出温度值
V2ToV();//转换显示值
if (TMV > TMSetV)//根据采集到的温度值控制继电器
{
RelayOutPort = 0;
}
else
{
RelayOutPort = 1;
}
if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
if (IntNum2 > 50 ) IntNum2 = 0;
if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
if (IntNum3 > 25)
{
IntNum3 = 0;
KeyTF = 0;
}
if ((SetTF) && (IntNum2 < 25)) goto InitEnd;//计数在后半段时显示
LEDPort = LED_One;
LEDOneC = 0;
Delay_510();
LEDOneC = 1;//显示百位数
LEDPort = LED_Two;
LEDTwoC = 0;
Delay_510();
LEDTwoC = 1;//显示十位数
LEDPort = LED_Three;
LEDThreeC = 0;
Delay_510();
LEDThreeC = 1;//显示个位数
}
InitEnd:
;
}
void V2ToV(void)//数值转换
{
TLV = TLV >> 4;
THV = THV << 4;//读出的高低位数值移位
TMV = TLV | THV;//合并高低位放入 TM 为实际温度值
Sign = 0;
if (SetTF || !
Key_SET)
Sign = TMSetV >> 7;//取符号
else
Sign = TMV >> 7;
if (Sign)
{
if (SetTF || !
Key_SET)
{
LED_One = (~(TMSetV-1)) / 100;//SET 状态下显示设定值
LED_Two = ((~(TMSetV-1)) - LED_One * 100)/10;
LED_Three = (~(TMSetV-1)) - LED_One * 100 - LED_Two * 10;
}
else
{
LED_One = (~TMV) / 100;//转换百位值
LED_Two = ((~TMV) - LED_One * 100)/10;
LED_Three = (~TMV) - LED_One * 100 - LED_Two * 10;
}
}
else
{
if (SetTF || !
Key_SET)
{
LED_One = (TMSetV) / 100;//SET 状态下显示设定值
LED_Two = (TMSetV - LED_One * 100)/10;
LED_Three = TMSetV - LED_One * 100 - LED_Two * 10;
}
else
{
LED_One = (TMV) / 100;//转换百位值
LED_Two = (TMV - LED_One * 100)/10;
LED_Three = TMV - LED_One * 100 - LED_Two * 10;
}
}
//转 LED 字段
if (LED_One) //超过百时十位的处理
LED_Two = LEDDis[LED_Two];
else
{
if (LED_Two == 0)
LED_Two = LEDDis[10];
else
LED_Two = LEDDis[LED_Two];
}
if (Sign)
LED_One = LEDDis[11];
else
{
if (LED_One == 0)
LED_One = LEDDis[10];
else
LED_One = LEDDis[LED_One];
}
LED_Three = LEDDis[LED_Three];
}
void InitDS1820(void)//初始化 DS1820
{
TMPort = 1;//拉高 TMPort
_nop_();//保持一个周期
TMPort = 0;//拉低 TMPort
Delay_510();//延时DS1820 复位时间要 500us 的低电平
TMPort = 1;//拉高 TMPort
_nop_();//保持
_nop_();
_nop_();
Delay_110();//延时 110us 等待 DS1820 回应
if (!
TMPort)//回应信号为低电平
DS1820ON = 1;
else
DS1820ON = 0;
Delay_110();//延时
Delay_110();
TMPort = 1;//拉高 TMPort
}
void ROMDS1820(void)//跳过 ROM 匹配
{
#pragma asm
MOV A,#0CCH
MOV R2,#8
CLR C
WR1:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR1
SETB P3_7
#pragma endasm
}
void TMVDS1820(void)//温度转换指令
{
#pragma asm
MOV A,#44H
MOV R2,#8
CLR C
WR2:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR2
SETB P3_7
#pragma endasm
}
void TMRDS1820(void)//读出温度指令
{
#pragma asm
MOV A,#0BEH
MOV R2,#8
CLR C
WR3:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR3
SETB P3_7
#pragma endasm
}
void TMWDS1820(void)//写入温度限制指令
{
#pragma asm
MOV A,#04EH
MOV R2,#8
CLR C
WR13:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR13
SETB P3_7
#pragma endasm
}
void TMREDS1820(void)//COPY RAM to E2PRAM
{
#pragma asm
MOV A,#48H
MOV R2,#8
CLR C
WR33:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR33
SETB P3_7
#pragma endasm
}
void TMERDS1820(void)//COPY E2PRAM to RAM
{
#pragma asm
MOV A,#0B8H
MOV R2,#8
CLR C
WR43:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR43
SETB P3_7
#pragma endasm
}
void WriteDS1820(void) //写入温度限制值
{
#pragma asm
MOV A,26H//发出 4EH 写 ROM 指令后连发两个字节分别为上下限
MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度传感器 报告