搜索
您的当前位置:首页正文

温控传感器应用

来源:好土汽车网


传感器技术及应用(作业)

题 目 温度监控系统系统设计

姓 名 ***

专业班级 ***

学 院 信息科学与工程学院

指导老师 ***

完成日期 2016年4月13日

目 录

第1章

1.1 1.2 1.3 第2章

2.1 2.2

概述和原理 ....................................................................................................................................... 1 温度传感器 ....................................................................................................................................... 1 LCD1602显示模块 .......................................................................................................................... 2 直流电动机驱动模块 ....................................................................................................................... 3 设计过程 ........................................................................................................................................... 1 protues 原理图的设计 ...................................................................................................................... 1 代码解释 ........................................................................................................................................... 1 2.2.1 Lcd显示子程序 ......................................................................................................................... 1 2.2.2 系统显示子函数 ........................................................................................................................ 8 2.2.3 DS18B20函数 .......................................................................................................................... 10 2.2.4 电机转动程序 .......................................................................................................................... 15

第3章 第4章

设计结果 ........................................................................................................................................... 1 总结 ................................................................................................................................................... 1

参考文献 ................................................................................................................................................................ 1 附 录 电路或者源代码 ...................................................................................................................................... 1

第1章 概述和原理

1.1

温度传感器

DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解 18B20的内部存储器资源。18B20 共有2种形态的存储器资源,它们分别是:

(1) ROM 只读存储器,用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H) ,后面48 位是芯片唯一的序列号,最后 8位是以上 56的

位的 CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20 共 64 位 ROM。

(2) RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共9 个字节 RAM,每个字节为 8 位。第1、2 个字节是温度转换后的数据值信息,第 3、4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、7、8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8个字节的 CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据, DS18B20共3位EEPROM,并在 RAM 都存在镜像,以方便用户操作。

(3) 对应温度的计算:当符号位C=0时,表示测得的温度值为正值,可直接将温度值转换为十进制数;当符号位C=1时,表示测得的温度值为负值,温度值是以补码的形式存在,

1

则先将补码变为原码,再转换成十进制数。

图 1 温度传感器

1.2 LCD1602显示模块

LCD显示模块程序有LCD显示初始界面程序和温度显示程序两部分组成。

(1)LCD显示初始界面,即在LCD1602的第一行显示”T MONITOR”。

(2)LCD温度显示,即温度值显示在LCD1602的第二行。

2

图 2 LCD1602显示模块

1.3 直流电动机驱动模块

控制16引脚和17引脚的电平就可以控制直流电动机的正转、反转和停转。在16引脚电平确定(高或低)的情况下,若17引脚的信号是脉冲信号,则可以通过脉冲信号的占空比控制电动机的转速。占空比越大。电动机的速度越快。

3

图 3 直流电动机驱动模块

4

第2章 设计过程

2.1

protues 原理图的设计

如图4,在protues 中设计原理图。

图 4 原理图

2.2 代码解释

2.2.1 Lcd显示子程序

void delay_20ms(void)

{

1

uchar i, temp;

for(i = 20; i > 0; i--)

{

temp = 248;

while(--temp);

temp = 248;

while(--temp);

}

}

void delay_38us(void)

{ uchar temp;

temp = 18;

while(--temp);

2

}

void delay_1520us(void)

{ uchar i, temp;

for(i = 3; i > 0; i--)

{

temp = 252;

while(--temp);

}

}

uchar lcd_rd_status()

{

uchar tmp_sts;

lcd_data = 0xff;

3

lcd_RW = 1;

lcd_RS = 0;

lcd_EN = 1;

tmp_sts = lcd_data;

lcd_EN = 0;

lcd_RW = 0;

return tmp_sts;

}

void lcd_wr_com(uchar command)

{

while(0x80&lcd_rd_status());

lcd_RW = 0;

lcd_RS = 0;

4

lcd_data = command;

lcd_EN = 1;

lcd_EN = 0;

}

void lcd_wr_data(uchar sjdata )

{

while(0x80&lcd_rd_status());

lcd_RW = 0;

lcd_RS = 1;

lcd_data = sjdata ;

lcd_EN = 1;

lcd_EN = 0;

lcd_RS = 0;

5

}

void Init_lcd(void)

{

delay_20ms();

lcd_wr_com(0x38);

delay_38us();

lcd_wr_com(0x0c);

delay_38us();

lcd_wr_com(0x01);

delay_1520us();

lcd_wr_com(0x06);

}

void GotoXY(uchar x, uchar y)

6

{

if(y==0)

lcd_wr_com(0x80|x);

if(y==1)

lcd_wr_com(0xc0|x);

}

void Print(uchar *str)

{

while(*str!='\\0')

{

lcd_wr_data(*str);

str++;

}

7

}

void LCD_Print(uchar x, uchar y, uchar *str)

{

GotoXY(x, y);

Print(str);

}

2.2.2 系统显示子函数

void covert1()

{

uchar x=0x00;

if(t[1]>0x07)

{

TempBuffer1[0]=0x2d;

8

t[1]=~t[1];

t[0]=~t[0];

x=t[0]+1;

t[0]=x;

if(x>255)

t[1]++;

}

else

TempBuffer1[0]=0x2b;

t[1]<<=4;

t[1]=t[1]&0x70;

x=t[0];

x>>=4;

9

x=x&0x0f;

t[1]=t[1]|x;

temperature=t[1];

TempBuffer1[1]=t[1]/100+0x30;

if(TempBuffer1[1]==0x30)

TempBuffer1[1]=0xfe;

TempBuffer1[2]=(t[1]%100)/10+0x30;

TempBuffer1[3]=(t[1]%100)%10+0x30;

}

2.2.3 DS18B20函数

void delay_18B20(uint i)

{

while(i--);

10

}

void Init_DS18B20(void)

{

uchar x=0;

DQ = 1;

delay_18B20(8);

DQ = 0;

delay_18B20(80);

DQ = 1;

delay_18B20(14);

x=DQ;

delay_18B20(20);

}

11

uchar ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat0 = 0;

for (i=8; i>0; i--)

{

DQ = 0;

dat0>>=1;

DQ = 1;

if(DQ)

dat0|=0x80;

delay_18B20(4);

}

12

return(dat0);

}

void WriteOneChar(uchar dat1)

{

uchar i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat1&0x01;

delay_18B20(5);

DQ = 1;

dat1>>=1;

}

13

}

void ReadTemperature()

{

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0x44);

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0xBE);

delay_18B20(80);

t[0]=ReadOneChar();

14

t[1]=ReadOneChar();

}

void delay_motor(uchar i)

{

uchar j, k;

for(j=i;j>0;j--)

for(k=200;k>0;k--);

}

2.2.4 电机转动程序

void motor(uchar tmp)

{

uchar x;

if(TempBuffer1[0]==0x2b)

15

{

if(tmp<25)

{

D=0;

PWM=0;

}

else if(tmp>50)

{

D=0;

PWM=1;

x=250;

delay_motor(x);

PWM=0;

16

x=5;

delay_motor(x);

}

else

{

D=0;

PWM=1;

x=5*tmp;

delay_motor(x);

PWM=0;

x=255-5*tmp;

delay_motor(x);

}

17

}

else if (TempBuffer1[0]==0x2d)

{

D=1;

PWM=0;

x=5*tmp;

delay_motor(x);

PWM=1;

x=255-5*tmp;

delay_motor(x);

}

}

void delay(unsigned int x)

18

{

unsigned char i;

while(x--)

{

for(i=0; i<123; i++){;}

}

}

19

第3章 设计结果

1、如图5,当温度在零下时的结果。

图 5 电动机反转,将温度提高

2、如图6,当温度在0~25℃时的结果。

1

图 6 电动机不转,温度随着环境改变

3、如图7,当温度在50℃以上时的结果。

2

图 7 电动机正转,将温度提高

3

第4章 总结

通过这次对温度监控系统系统设计,我对传感器有了初步的认识,其中对温度传感器的工作原理和应用有了较为深刻的了解。

1

参考文献

[1]

李林功.传感器技术及应用.北京:科学出版社,2015.

附 录 电路或者源代码

1、电路:

2、源代码:

#include

#include

#define uchar unsigned char

1

#define uint unsigned int

#define lcd_data P0

sbit DQ =P1^7;

sbit lcd_RS=P2^0;

sbit lcd_RW=P2^1;

sbit lcd_EN=P2^2;

sbit PWM=P3^7;

sbit D=P3^6;

uchar t[2], speed, temperature;

uchar DS18B20_is_ok;

uchar TempBuffer1[12]={0x20, 0x20, 0x20, 0x20, 0xdf, 0x43, '\\0'};

uchar tab[16]={0x20, 0x20, 0x20, 0x54, 0x20, 0x4d, 0x6f, 0x6e, 0x69,

0x74, 0x6f, 0x72, '\\0'};

2

void delay_20ms(void)

{

uchar i, temp;

for(i = 20; i > 0; i--)

{

temp = 248;

while(--temp);

temp = 248;

while(--temp);

}

}

void delay_38us(void)

{ uchar temp;

3

temp = 18;

while(--temp);

}

void delay_1520us(void)

{ uchar i, temp;

for(i = 3; i > 0; i--)

{

temp = 252;

while(--temp);

}

}

uchar lcd_rd_status()

{

4

uchar tmp_sts;

lcd_data = 0xff;

lcd_RW = 1;

lcd_RS = 0;

lcd_EN = 1;

tmp_sts = lcd_data;

lcd_EN = 0;

lcd_RW = 0;

return tmp_sts;

}

void lcd_wr_com(uchar command)

{

while(0x80&lcd_rd_status());

5

lcd_RW = 0;

lcd_RS = 0;

lcd_data = command;

lcd_EN = 1;

lcd_EN = 0;

}

void lcd_wr_data(uchar sjdata )

{

while(0x80&lcd_rd_status());

lcd_RW = 0;

lcd_RS = 1;

lcd_data = sjdata ;

lcd_EN = 1;

6

lcd_EN = 0;

lcd_RS = 0;

}

void Init_lcd(void)

{

delay_20ms();

lcd_wr_com(0x38);

delay_38us();

lcd_wr_com(0x0c);

delay_38us();

lcd_wr_com(0x01);

delay_1520us();

lcd_wr_com(0x06);

7

}

void GotoXY(uchar x, uchar y)

{

if(y==0)

lcd_wr_com(0x80|x);

if(y==1)

lcd_wr_com(0xc0|x);

}

void Print(uchar *str)

{

while(*str!='\\0')

{

lcd_wr_data(*str);

8

str++;

}

}

void LCD_Print(uchar x, uchar y, uchar *str)

{

GotoXY(x, y);

Print(str);

}

void covert1()

{

uchar x=0x00;

if(t[1]>0x07)

{

9

TempBuffer1[0]=0x2d;

t[1]=~t[1];

t[0]=~t[0];

x=t[0]+1;

t[0]=x;

if(x>255)

t[1]++;

}

else

TempBuffer1[0]=0x2b;

t[1]<<=4;

t[1]=t[1]&0x70;

x=t[0];

10

x>>=4;

x=x&0x0f;

t[1]=t[1]|x;

temperature=t[1];

TempBuffer1[1]=t[1]/100+0x30;

if(TempBuffer1[1]==0x30)

TempBuffer1[1]=0xfe;

TempBuffer1[2]=(t[1]%100)/10+0x30;

TempBuffer1[3]=(t[1]%100)%10+0x30;

}

void delay_18B20(uint i)

{

while(i--);

11

}

void Init_DS18B20(void)

{

uchar x=0;

DQ = 1;

delay_18B20(8);

DQ = 0;

delay_18B20(80);

DQ = 1;

delay_18B20(14);

x=DQ;

delay_18B20(20);

}

12

uchar ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat0 = 0;

for (i=8; i>0; i--)

{

DQ = 0;

dat0>>=1;

DQ = 1;

if(DQ)

dat0|=0x80;

delay_18B20(4);

}

13

return(dat0);

}

void WriteOneChar(uchar dat1)

{

uchar i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat1&0x01;

delay_18B20(5);

DQ = 1;

dat1>>=1;

}

14

}

void ReadTemperature()

{

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0x44);

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0xBE);

delay_18B20(80);

t[0]=ReadOneChar();

15

t[1]=ReadOneChar();

}

void delay_motor(uchar i)

{

uchar j, k;

for(j=i;j>0;j--)

for(k=200;k>0;k--);

}

void motor(uchar tmp)

{

uchar x;

if(TempBuffer1[0]==0x2b)

{

16

if(tmp<25)

{

D=0;

PWM=0;

}

else if(tmp>50)

{

D=0;

PWM=1;

x=250;

delay_motor(x);

PWM=0;

x=5;

17

delay_motor(x);

}

else

{

D=0;

PWM=1;

x=5*tmp;

delay_motor(x);

PWM=0;

x=255-5*tmp;

delay_motor(x);

}

}

18

else if (TempBuffer1[0]==0x2d)

{

D=1;

PWM=0;

x=5*tmp;

delay_motor(x);

PWM=1;

x=255-5*tmp;

delay_motor(x);

}

}

void delay(unsigned int x)

{

19

unsigned char i;

while(x--)

{

for(i=0; i<123; i++){;}

}

}

void main(void)

{

delay_20ms();

ReadTemperature();

Init_LCD();

LCD_Print(0, 0, tab);

delay(1000);

20

while(1)

{

ReadTemperature();

delay_18B20(100);

covert1();

LCD_Print(4, 1, TempBuffer1); motor(temperature);

}

}

21

因篇幅问题不能全部显示,请点此查看更多更全内容

Top