当前位置:文档之家› 【精编完整版】温湿度测试系统_传感器毕业论文

【精编完整版】温湿度测试系统_传感器毕业论文

湘潭大学

课程设计

2013 年08 月日

任务书

课程传感器原理设计与应用

题目温湿度测试系统

专业测控技术与仪器姓名学号

组长组员

(1)设计目的:设计制作一个温湿度,温度测量范围为-10-50℃,湿度为0-100% 实验仪器:电烙铁,Proteus软件,Keil软件,剥线钳,万用表,温度计

主要内容:该系统主要有以下系统快构成:中央控制处理器STC89C52组成的主机系统;环境数据采集系统,输出显示与键盘控制系统等。

主要的系统电路有:电源电路,温度传感器与湿度传感器电路,显示电路,报警电路,键盘输入电路。

该系统的主要特点有:

(1)、该产品互换性好,响应速度快,抗干扰电路图,外围电路简单易懂,因此体积小。

(2)、该系统能用软件的方式控制硬件,所有用软件方式设计的系统向硬件的转换是由有关开发软件完成的,易操作。

(3)、可以从以前的组合设计转向真正的自由设计,所以设计的移植性好,效率高。

参考资料

1、《单片机原理及应用》湘潭大学出版社;

2、《单片机接口技术》(C51版)中国水利水电出版社;

3、郭天祥“十天学会单片机”视频;

4、《传感器原理设计与应用》国防科技大学出版社;

完成期限2013.08.20

2013 年08 月20日

温湿度测试系统设计

摘要:此温湿度测试系统是基于单线式温度传感器DS18B20、电容式湿度传感器HS1101、单片机STC89C52对温湿度分别测试并通过液晶显示屏1602经行显示。温度传感器DS18B20是单线式,体积超小,硬件开销超低,抗干扰能力强,精度高,附加功能强的理想单片机温度传感器,可实时根据指令给出温度数据,可读性高。HS1101是电容式空气湿度传感器,在不同的湿度环境下呈现不同的电容数值,0%-100%RH湿度范围内,电容从162变到200PF,误差为2%RH,可见精度非常之高,为了反映出其电容的变化,本系统采用555多谐振荡电路产生不同的频率,用于检测湿度。单片机采集到的两个传感器给出的数据进行处理与计算,得出当前的温度与湿度并送给液晶屏显示。本系统具有可读性高,稳定性高,反应速度快,测量值准确的特点。

关键词:单片机,温湿度,DS18B20,传感器,液晶显示器

Abstract:

Key words:microcontroller, temperature and "};

uchar code cdis2[]={"T= , C" };

uchar code cdis3[]={"shidujishiyan"} ; uchar code cdis4[]={"shidu: %"}; uchar code cdis5[]={"the system of "}; uchar code cdis6[]={" temp and (result); }

***************************

*写指令数据到LCD*

*RS=L,RW=L,E=高脉冲,D0-D7=指令码* ************

void lcd_wcmd(uchar cmd)

{

while(led_busy());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

LCD_EN=0;

}

*********************

*写数据到LCD

*RS=H,RS=L,E=高脉冲,D0-D7=数据。* *********************

void lcd_wdat(uchar dat)

{

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

delayNOP();

LCD_EN=0;

}

*LCD初始化*

*********************************

void lcd_init()

{

delay1(15);

lcd_wcmd(0x01); 清除LCD的显示内容

lcd_wcmd(0x38); 16*2显示,5*7点阵,8位数据

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c); 显示开,关光标

delay1(5);

lcd_wcmd(0x06); 移动光标

delay1(5);

lcd_wcmd(0x01); 清除LCD显示内容

delay1(5);

}

*设定显示位置*

******************************************* void lcd_pos(uchar pos)

{

lcd_wcmd(pos|0x80);数据指针=80+地址变量}

*自定义字符写入CGRAM * *************************************

void writeab()

{

unsigned char i;

lcd_wcmd(0x40);

for(i=0;i<8;i++)

lcd_wdat(mttab[i]);

}

*us级延时函数*

***************************

void Delay(unsigned int num)

{

while(--num);

}

**********************************

***********8温度测量****************

*******************************

*初始化ds1820

****************************************

Init_DDS18B20(void)

{

DQ=1; DQ复位

Delay(8); 稍作延时

DQ=0; 单片机将DQ拉低

Delay(90); 精确延时大于480us

DQ=1; 拉高总线

Delay(100);

DQ=1;

return(presence);返回信号,

0=presence,1=no presence

}

*读一个字节*

************************************ ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat=0;

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

{

DQ=0;给脉冲信号

dat>>=1;

DQ=1; 给脉冲信号

if(DQ)

dat|=0x80;

Delay(4);

}

return(dat);

}

*写一个字节*

*************************************

WriteOneChar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ=0;

DQ=dat&0X01;

Delay(5);

DQ=1;

dat>>=1;

}

}

*读取温度*

****************************

Read_Temperature(void)

{

Init_DS18B20();

WriteOneChar(0xcc);跳过读序列号的操作WriteOneChar(0x44);启动温度转换

Init_DS18B20();

WriteOneChar(0xcc);跳过读序列号的操作

WriteOneChar(0xbe); 读取温度寄存

temp_data[0]=ReadOneChar(); 温度低八位

temp_data[1]=ReadOneChar(); 温度高八位}

*数据转换与温度显示*

****************************

Disp_Temperature()

{

display[4]=temp_data[0]&[0]&0x0f;

display[0]=ditab[display[4]]+0x30 ;

display[4]=

((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

display[3]=display[4]100+0x30;

display[1]=display[4]%100;

display[2]=display[1]10+0x30;

display[1]=display[1]%10+0x30;

display[2]=0x20;

if(display[3]==0x30) 高位为0,不显示

{

display[3]=0x20;

if(display[2]==0x30) 次高位为0,不显示

display[2]=0x20;

}

lcd_pos(ox48);

lcd_wdat(display[3]); 百位显示

lcd_pos(0x49);

lcd_wdat(display[2]); 十位显示

lcd_pos(ox4a);

lcd_wdat(display[1]); 个位显示

lcd_pos(ox4c);

lcd_wdat(display[0]); 小数位显示

}

报警

void baojing()

{

if(display[2]>=0x32&&display[1]>=0x31)

{

BEEP=1;

}

else

{

BEEP=0;

}

}

********************************************* ****

******************湿度测量

***********************

********************************************* *****

软件延时

void delay(unsigned int cnt)

{

while(--cnt);

}

定时

定时器0初始化

void init_t0(void)

{

TMOD=(TMOD&0xf0)||0x01;

TH0=0x4c;

TL0=0x00;

}

定时器1初始化

void init_t1(void)

{

TMOD=(TMOD&0x0f)||0x50;

TH1=0x00;

TL1=0x00;

}

定时器0中断服务程序

void int_t0(void) interrupt 1 {

int_count++;

if(int_count==20)

{

TR1=0;

int_flag=1;

int_count=0x00;

}

}

定时器1中断服务程序

void int_t1(void) interrupt 3

{

T1count++;

}

void disp(void) 湿度显示函数

{

int_flag=0;

sum=TL1+TH1*256+T1count*65536;计算1秒内的脉冲个数

以下将数据格式化,转成LED可显示的BCD码

wet=100-(sum-4000)50;湿度计算公式le[0]=wet%10;最低位

wet=wet10;

le[1]=wet%10; 第二位

wet=wet10;

let[2]=wet%10 第三位

wet=wet10;

int_count=ox00;

T1count=0;

TH1=0x00;

TL1=0x00;

TR1=1;

lcd_pos(ox4a);

lcd_wdat(le[2]+48);

lcd_pos(0x4b);

lcd_wdat(le[1]+48);

lcd_pos(ox4c);

lcd_wdat(le[0]+48);

delays(100);

}

void wendu_Menu() 显示温度的菜单

{

uchar m;

lcd_pos(0); 设置显示位置为第一行第一个字符

m+0;

while(cdis1[m]!='\0')

{ 显示字符

lcd_wdat(cdis1[m]);

m++;

}

lcd_pos(0x40); 显示字符

m=0;

while(cdis4[m]!='\0')

{

lcd_wdat(cdis2[m]); 显示字符

m++;

}

writeab();

delay1(5);

lcd_pos(ox4d);

lcd_wdat(0x00); 显示自定义字符

}

void ok_menu()

{

uchar m;

lcd_pos(0); 设置显示位置为第一行第一个字符

m=0;

while(cdis5[m]!='\0')

{ 显示字符

lcd_wdat(cdis5[m]);

m++;

}

lcd_pos(0x40); 设置显示位置为第二行第一个字符

m=0;

while(cdis6[m]!='\0')

{ 显示字符

lcd_wdat(cdis6[m]);

m++;

}

}

************************************************ **********

主函数

void main()

{

EA=1;

init_t0();初始化定时器

init_t1();

TR0=1;

TR1=1;

ET0=O;

lcd_init();

ok_menu();

BEEP=0;

while(1)

{

if(key1==0)

{

lcd_init;

wendu_Menu();

do

{

Read_Temperature();

Disp_Temperature();

baojing();

}

while(key2)

}

if(key2==0)

{

lcd_init;

相关主题
文本预览
相关文档 最新文档