还剩35页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
湘潭大学课程设计2013年08月日任务书课程传感器原理设计与应用题目温湿度测试系统专业测控技术与仪器姓名学号组长组员
(1)设计目的设计制作一个温湿度,温度测量范围为-10-50℃,湿度为0-100%实验仪器电烙铁,Proteus软件,Keil软件剥线钳,万用表,温度计主要内容该系统主要有以下系统快构成中央控制处理器STC89C52组成的主机系统;环境数据采集系统,输出显示与键盘控制系统等主要的系统电路有电源电路,温度传感器与湿度传感器电路,显示电路,报警电路,键盘输入电路该系统的主要特点有
(1)、该产品互换性好,响应速度快,抗干扰电路图,外围电路简单易懂,因此体积小
(2)、该系统能用软件的方式控制硬件,所有用软件方式设计的系统向硬件的转换是由有关开发软件完成的,易操作
(3)、可以从以前的组合设计转向真正的自由设计,所以设计的移植性好,效率高参考资料
1、《单片机原理及应用》湘潭大学出版社;
2、《单片机接口技术》(C51版)中国水利水电出版社;
3、郭天祥“十天学会单片机”视频;
4、《传感器原理设计与应用》国防科技大学出版社;完成期限
2013.
08.202013年08月20日温湿度测试系统设计摘要此温湿度测试系统是基于单线式温度传感器DS18B
20、电容式湿度传感器HS
1101、单片机STC89C52对温湿度分别测试并通过液晶显示屏1602经行显示温度传感器DS18B20是单线式,体积超小,硬件开销超低,抗干扰能力强,精度高,附加功能强的理想单片机温度传感器,可实时根据指令给出温度数据,可读性高HS1101是电容式空气湿度传感器,在不同的湿度环境下呈现不同的电容数值,0%-100%RH湿度范围内,电容从162变到200PF,误差为2%RH可见精度非常之高,为了反映出其电容的变化,本系统采用555多谐振荡电路产生不同的频率,用于检测湿度单片机采集到的两个传感器给出的数据进行处理与计算,得出当前的温度与湿度并送给液晶屏显示本系统具有可读性高,稳定性高,反应速度快,测量值准确的特点关键词单片机,温湿度,DS18B20,传感器,液晶显示器Abstract KeywordsmicrocontrollertemperatureandhumidityDS18B20sensorLCD引言:
二、方案设计
(1)、方案的选取DS18B20传感器;HS1101湿度传感器
(2)、显示模块的选取采用1602液晶模块显示所测数据,1602接线简单方便,同时也能满足显示需求,价格远低于12864液晶
三、.结果及原理分析根据所要实现的功能,将系统模块化设计,总体模块结构图如下图所示以下就分别就各模块功能实现进行设计
1.1602液晶显示模块电路设计1602液晶显示模块电路原理图如下所示
2.DS18B20温度检测模块如上图所示其中温度传感器DS18B20的各引脚功能如下1GND接地;2DQ输出端;3VCC电源
3.HS1101湿度检测模块555芯片外接电阻R
4、R
5、R
6、R8与HS1101,构成对HS1101的充电回路,7端通过芯片内部的晶体管对地短路实现对HS1101的放电回路,并将引脚26端相连引入片内比较器,构成多谐振荡器HS1101作为一个变化的电容器,原理图中我们用电容代替,连接2和6引脚,充电,放电时间由HS1101的技术手册可得湿度和电容的函数关系呈线性关系,因此有当时由得,空气相对湿度与555芯片输出偏绿存在一定关系,可通过微处理器采集555芯片的频率,查表即可得到相对湿度(电容不可直接测量,由555多谐振荡器检测频率,有单片机计算电容值,进而求得相对湿度)
4.电源模块系统部分电源采用的是4节
1.5伏干电池,能为系统提供稳定的5V电压
4、软件流程图
5、系统总的程序设计见附录一
6、设计过程问题解决本次设计过程很费周折,由于proteus里面缺少一些必要的元件,故实验过程中是先设计好硬件电路,焊好电路以后才进行调试的,其间的艰难可想而知也因为这样,硬件电路的错误比较多,中间一直在修改硬件电路,造成电路板修修补补不美观实验过程中遇到的困难很多,尤其是实现界面切换和返回主界面的过程,同时光标也要随着界面一起移动否则就会显示出错而在本次设计过程中,我们调用了两次显示,一次写显示温度,一次显示湿度
4.总结
1.刚开始烧了程序以后,发现LCD什么都不显示,后来发现是因为没有开背光,因为没开背光显示不明显,如果角度不对会发现什么都没显示而背光要通过可调电阻来调,在1602的背光正极接一个可调电阻,电阻的两端是接地和电源
2.能够显示以后,发现显示界面一直在刷新,显示不稳定原因是每秒随着秒刷新初始化界面一次,解决的方案是不重新调用显示,而是只给显示秒的位置刷新,其他时间随秒变化温湿度值则是有了变化就刷新
3.由于编写程序时,没有考虑到温度传感器DS18B20数据的十六进制与显示字符之间的数据处理关系,导致在液晶屏中只显示了传回的最后一个十六进制数所对应的ASCⅡ的字符,找到问题的解决关键所在后,经过数的分位与字符显示后,成功的显示了传回的温度、湿度的数据,让我们距离成功只差一小步了参考文献
1、《单片机原理及应用》湘潭大学出版社;
2、《单片机接口技术》(C51版)中国水利水电出版社;
3、郭天祥“十天学会单片机”视频;
4、《传感器原理设计与应用》国防科技大学出版社;附录一系统总程序#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^0;//定义DS18B20端口DQsbitBEEP=P2^2;//蜂鸣器驱动器bitpresence;sbitLCD_RS=P1^2;sbitLCD_RW=P1^1;sbitLCD_EN=P1^0;sbitled=P2^1;sbitkey1=P2^3;sbitkey2=P2^4;ucharcodecdis1[]={wendujishiyan};ucharcodecdis2[]={T=C};ucharcodecdis3[]={shidujishiyan};ucharcodecdis4[]={shidu:%};ucharcodecdis5[]={thesystemof};ucharcodecdis6[]={tempandhum};unsignedchardatatemp_data
[2]={0x000x00};unsignedchardatadisp
[5]={0x000x000x000x000x00};unsignedcodeditab
[16]={0x000x010x010x020x030x040x040x050x060x060x070x080x080x090x09};voidbeep;unsignedcharcodemytb
[8]={0x0c0x120x120x0c0x000x000x000x00};bitint_flag;//定时器01S到标志位unsignedcharvolatileint_count;//定时器0中断次unsignedcharvolatileT1count;//定时器1中断次unsignedlongsumwet;//1s内脉冲个数unsignedcharle
[16];//LED显示缓存#definedelayNOP;{_nop_;_nop_;_nop_:_nop_;};/************************************************/voiddelay1intms{unsignedchary;whilems--{fory=0;y250;y++{_nop_;_nop_;_nop_;_nop_;}}}/********//*检查LCD忙状态*//*lcd_busy为1时,忙,等待lcd_busy为0时,闲,可写指令与数据*//********/bitlcd_busy{bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP;result=bitP00X80;LCD_EN=0;returnresult;}/***************************//*写指令数据到LCD*//*RS=LRW=LE=高脉冲,D0-D7=指令码*//************/voidlcd_wcmducharcmd{whileled_busy;LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_;_nop_;P0=cmd;delayNOP;LCD_EN=0;}/*********************//*写数据到LCD/*RS=HRS=LE=高脉冲,D0-D7=数据*//*********************/voidlcd_wdatuchardat{LCD_RS=1;LCD_RW=0;LCD_EN=0;delayNOP;LCD_EN=0;}/*LCD初始化*//*********************************/voidlcd_init{delay115;lcd_wcmd0x01;//清除LCD的显示内容lcd_wcmd0x38;//16*2显示,5*7点阵,8位数据delay15;lcd_wcmd0x38;delay15;lcd_wcmd0x38;delay15;lcd_wcmd0x0c;//显示开,关光标delay15;lcd_wcmd0x06;//移动光标delay15;lcd_wcmd0x01;//清除LCD显示内容delay15;}/*设定显示位置*//*******************************************/voidlcd_posucharpos{lcd_wcmdpos|0x80;//数据指针=80+地址变量}/*自定义字符写入CGRAM*//*************************************/voidwriteab{unsignedchari;lcd_wcmd0x40;fori=0;i8;i++lcd_wdatmttab[i];}/*us级延时函数*//***************************/voidDelayunsignedintnum{while--num;}/**********************************//***********8温度测量****************//*******************************//*初始化ds1820/****************************************/Init_DDS18B20void{DQ=1;//DQ复位Delay8;//稍作延时DQ=0;//单片机将DQ拉低Delay90;//精确延时大于480usDQ=1;//拉高总线Delay100;DQ=1;returnpresence;//返回信号,0=presence1=nopresence}/*读一个字节*//************************************/ReadOneCharvoid{unsignedchari=0;unsignedchardat=0;fori=8;i0;i--{DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号ifDQdat|=0x80;Delay4;}returndat;}/*写一个字节*//*************************************/WriteOneCharunsignedchardat{unsignedchari=0;fori=8;i0;i--{DQ=0;DQ=dat0X01;Delay5;DQ=1;dat=1;}}/*读取温度*//****************************/Read_Temperaturevoid{Init_DS18B20;WriteOneChar0xcc;//跳过读序列号的操作WriteOneChar0x44;//启动温度转换Init_DS18B20;WriteOneChar0xcc;//跳过读序列号的操作WriteOneChar0xbe;//读取温度寄存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]0xf04|temp_data
[1]0x0f4;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;ifdisplay
[3]==0x30//高位为0,不显示{display
[3]=0x20;ifdisplay
[2]==0x30//次高位为0,不显示display
[2]=0x20;}lcd_posox48;lcd_wdatdisplay
[3];//百位显示lcd_pos0x49;lcd_wdatdisplay
[2];//十位显示lcd_posox4a;lcd_wdatdisplay
[1];//个位显示lcd_posox4c;lcd_wdatdisplay
[0];//小数位显示}//报警voidbaojing{ifdisplay
[2]=0x32display
[1]=0x31{BEEP=1;}else{BEEP=0;}}/*************************************************//******************湿度测量***********************//**************************************************///软件延时voiddelayunsignedintcnt{while--cnt;}//定时//定时器0初始化voidinit_t0void{TMOD=TMOD0xf0||0x01;TH0=0x4c;TL0=0x00;}//定时器1初始化voidinit_t1void{TMOD=TMOD0x0f||0x50;TH1=0x00;TL1=0x00;}//定时器0中断服务程序voidint_t0voidinterrupt1{TH0=65535-50000/256;TL0=65535-50000%256;int_count++;ifint_count==20{TR1=0;int_flag=1;int_count=0x00;}}//定时器1中断服务程序voidint_t1voidinterrupt3{T1count++;}voiddispvoid//湿度显示函数{int_flag=0;sum=TL1+TH1*256+T1count*65536;//计算1秒内的脉冲个数//以下将数据格式化,转成LED可显示的BCD码wet=100-sum-4000/50;//湿度计算公式le
[0]=wet%10;//最低位wet=wet/10;le
[1]=wet%10;//第二位wet=wet/10;let
[2]=wet%10//第三位wet=wet/10;int_count=ox00;T1count=0;TH1=0x00;TL1=0x00;TR1=1;lcd_posox4a;lcd_wdatle
[2]+48;lcd_pos0x4b;lcd_wdatle
[1]+48;lcd_posox4c;lcd_wdatle
[0]+48;delays100;}voidwendu_Menu//显示温度的菜单{ucharm;lcd_pos0;//设置显示位置为第一行第一个字符m+0;whilecdis1[m]!=\0{//显示字符lcd_wdatcdis1[m];m++;}lcd_pos0x40;//显示字符m=0;whilecdis4[m]!=\0{lcd_wdatcdis2[m];//显示字符m++;}writeab;delay15;lcd_posox4d;lcd_wdat0x00;//显示自定义字符}voidok_menu{ucharm;lcd_pos0;//设置显示位置为第一行第一个字符m=0;whilecdis5[m]!=\0{//显示字符lcd_wdatcdis5[m];m++;}lcd_pos0x40;//设置显示位置为第二行第一个字符m=0;whilecdis6[m]!=\0{//显示字符lcd_wdatcdis6[m];m++;}}/**********************************************************///主函数voidmain{EA=1;init_t0;//初始化定时器init_t1;TR0=1;TR1=1;ET0=O;lcd_init;ok_menu;BEEP=0;while1{ifkey1==0{lcd_init;wendu_Menu;do{Read_Temperature;Disp_Temperature;baojing;}whilekey2}ifkey2==0{lcd_init;shidu_Menu;do{ifint_flag==1{disp;}}whilekey1}}}课程传感器题目温湿度测试系统院系材料与光电物理学院专业班级测控技术与仪器学生姓名学生学号指导教师。