传感器技术及应用(作业)
题 目 温度监控系统系统设计
姓 名 ***
专业班级 ***
学 院 信息科学与工程学院
指导老师 ***
完成日期 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 因篇幅问题不能全部显示,请点此查看更多更全内容