《温度循环监测系统的设计与制作(共22页).doc》由会员分享,可在线阅读,更多相关《温度循环监测系统的设计与制作(共22页).doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上摘要系统以AT89C51单片机为主控制器,设计并制作了一款红外遥控温度报警器,可实时显示温度值,还可以通过红外遥控修改温度报警上限和下限,温度显示在12864上,本设计的创新点是增加了用VC6.0开发的上位机,在计算机上显示出温度计和视频界面,构成友好的人机界面,具有很高的实用价值。关键词:AT89C51;红外遥控;温度报警;上位机AbstractAT89C51 microcontroller-based control system, designed and produced an infrared remote temperature alarm, real-t
2、ime display temperature, infrared remote control can also be modified through the upper and lower temperature alarm, temperature display in the 12,864 on the innovation of this design is to increase the development of the host computer using VC6.0, a thermometer in the computer and video display int
3、erface, form-friendly interface, with high practical valueKey words: AT89C51; infrared remote control; temperature alarm; PC 目录 专心-专注-专业绪论为了提高对传感器的认识和了解,尤其是对温度传感器对深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合传感器技术而开发设计了这一温度检测系统,传感器理论与单片机实际应用有机结合。设计应用性强,课题主要任务是完成环境温度检测,利用单片机实现温度调节并通过计算机实施温度监控,设计后的系统具有操
4、作方便,控制灵活等优点。1 系统的硬件组成与设计1.1 系统硬件组成本系统主要由控制器模块、红外遥控模块、温度报警模块、显示模块及串口模块等部分组成。如图1图11.2 模块介绍1.2.1 控制器模块采用ATMEL公司的AT89C51作为系统控制器。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且其功耗低、体积小、技术成熟和成本低等优点。由AT89C51作为控制核心,对温度的显示及调整进行控制。1.2.2 显示模块采用12864液晶显示。其内置8192个16*16点汉字,和128个16*8点ASCII字符集,可以直观地显示出较多内容,利用该模块灵活的接口方式
5、和简单、方便的操作指令,可构成全中文人机交互图形界面,使得显示内容丰富,易于人机交流,并且节约了I/O口资源。本设计中采用12864作为显示模块,可以同时显示温度及时间,不仅能达到设计要求,还具有明显的优越性。1.2.3 温度采集模块采用数字温度传感器DS18B20。DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据,电路简单。DS18B20能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更
6、趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果。2 硬件设计选择及功能介绍2.1 控制器部分本设计采用AT89C51单片机为核心控制器件,通过单片编程控制红外遥控,温度芯片18B20,,从而实现红外遥控温度报警,原理图如图2.1所示。图2.1 单片机最小系统电路图2.2 温度采集部分系统温度检测是由数字温度传感器Ds18B20实现的。Ds18b20具有测温系统简单、测温精度高、连接方便、占用口线少等优点,特别适用于多点测温。硬件接口电路如图2.2所示。 图2.2 Ds18B20的硬件接口电路(1) DSI8B20的测温功能的实现其测温电路的实现是依靠单片
7、机软件的编程上。 当DSI8B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0062 5LSB形式表示。温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若TTH或T RoM操作命令 - 存储器操作命令- 处理数据 初始化 单总线上的所有处理均从初始化开始 ROM操作命令 总线
8、主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如表2.2.2所示表2.2.2 ROM操作命令表指令代码Read ROM(读ROM)33HMatch ROM(匹配ROM)55HSkip ROM(跳过ROMCCHSearch ROM(搜索ROM)F0HAlarm search(告警搜索)ECH 存储器操作命令如表2.2.3所示表2.2.3 存储器操作命令表指令代码Write Scratchpad (写暂存存储器) 4EHRead Scratchpad (读暂存存储器) BEHCopy Scratchpad (复制暂存存储器)48HConvert Temperature (温度变换
9、) 44HRecall EPROM (重新调出) B8HRead Power supply (读电源)B4H(3)温度转换算法及分析由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 bit10)。其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 bit 3)。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,
10、保留一位小数即可。也就说,本系统的温度精确到了0.1度。算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。23 报警电路555集成定时器是一种模拟和数字电路相混合等集成电路,它结构简单,使用灵活,用途十分广泛,可以组成多种波形发生器、多谢振荡器、定时延时电路、报警电路、检测电路、射频变换电路等。图2.3 555定时器引脚图图2.4 报警电路图2.4
11、红外遥控部分遥控接收使用红外接收模块1838,该接收模块是一个三端元件,具有功耗低、抗干扰能力强、输入灵敏度高的特点。如图2.4所示,1838接AT89C2051的P3.2(外中断0).当1838V接收到遥控信号时产生中断,处理遥控数据处理完后返回。图2.4 1838硬件接口电路图2.5 显示部分本设计采用12864液晶显示器,它是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864, 内置8192个16*16点汉字,和128个16*8点ASCII字符集,利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中
12、文人机交互图形界面。可以显示84行1616点阵的汉字,还可完成图形显示,低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多。通过单片机控制,同时显示出温度。图2.5 显示控制电路图2.6 串口部分用于上位机显示的串口电路图如图2.6所示图2.6 串口接线图3 程序设计程序:#include#include#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifsbit IR_GET = P32;
13、 /红外接收数据输入端sbit BEEP=P35 ; /蜂鸣器驱动线 /*/uchar RXDDATA=0x00,0x00,0x00,0x00; /存放接收到的四组红外编码bit ircodeflag=0;volatile bit kong=1; /全局变量,用于数码管上的两杠进行闪烁volatile uchar workcode; /经过处理返回的纯数字红外编码uchar uart_num17=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-;uchar xdata olddisptimes14=1,1,1,1,1,1,1,1,1,1,1,1,1,1;#include ua
14、rt.h#include ds1302.h#include ds18b20.h#include LCD12864P.C/* 函数声明专区 */void DelayUS(uint num);void delay100us(uchar x);void beep();uchar workIRcode(uchar *pp);void sendircode(); void displaytime();void set1616pic(uchar x,uchar y,uchar sign,uchar tt);void set1616num(uchar curr,uchar *ptime);void gudi
15、disptemp(uchar *tempc);uchar checktemp(uchar *pp);uchar time_compare();/*/void main()bit one_sign;bit onealarmflag=0;uchar run_sign,tempdata,timenum,timelcdxy,we;uchar i,curr_menu_id,checkflag;uchar *pmenu;uchar stimetopc;uchar outflag;delayms(500);TMOD|=0X01; /选择定时器0工作在模式1,即16位定时器TH0=(65536-49000)/
16、256; /装49ms的初值TL0=(65536-49000)%256;ET0=1;/开定时器0中断EX0= 1;/使能 INT0 外部中断IT0 =1; /外中断0下降沿触发IR_GET=1; /I/O口初始化UART_Init(); /初始化串口EA=1;/开总中断UART_Send_Str($初始化中.n);UART_Send_Str(*); /上位机的结束标识init_12864();init_1302();Clean_12864_GDRAM();/settime_1302(inittime);gettime_1302(times);for(i=0;i6;i+)olddisptimes
17、i=disptimesi+65; /为了使下面出现比较不合,写入首次的所有图形/write_12864_cmd(0x30); /非常重要!上面关显示是扩展指令,再写成基本指令 /delayms(5);/photodisplay(Photo2); /显示图片Photo2-/ delayms(2000); /显示图片2SClean_12864_GDRAM();UART_Send_Str($初始化完成n);UART_Send_Str(*); /上位机的结束标识/TR0=1;/启动定时器0while(1) gettime_1302(times);worktime_1302(disptimes,time
18、s);EA=0;read_temp(); /读出DS18B20温度数据work_temp(); /处理温度数据EA=1;sendircode();displaytime(); /显示非绘图的温度。for(i=0;i10) stimetopc=0;UART_Send_Byte(T);for(i=0;i14;i+) UART_Send_Byte(uart_numdisptimesi);UART_Send_Byte(uart_numdisptimes+i);UART_Send_Byte(*); /上位机的结束标识 /*/ /进入菜单选择if(workcode=12) outflag=1; UART_
19、Send_Str($进入菜单设置n);UART_Send_Str(*); /上位机的结束标识 workcode=14;Clean_12864_GDRAM(); /先清完所有显示,再把菜单项目显示出来供选择。Clean_12864();write_12864_cmd(0x80);for(i=0;i12;i+)write_12864_data(initmenui);write_12864_cmd(0x90);for(i=48;i60;i+)write_12864_data(sonmenu1i);write_12864_cmd(0x88);for(i=48;i60;i+)write_12864_da
20、ta(sonmenu2i);write_12864_cmd(0x98);for(i=48;i60;i+)write_12864_data(sonmenu3i);setrowbkcolor(2,1);/初始是第二行反白curr_menu_id=2;while(outflag=1) /选择父菜单if(workcode=16)workcode=14;if(curr_menu_id2) setrowbkcolor(curr_menu_id,0);curr_menu_id-;setrowbkcolor(curr_menu_id,1);if(workcode=13)/选择之后进入outflag=0;wor
21、kcode=14;outflag=1;switch(curr_menu_id) /由选择父的菜单进行调用相应子菜单进行调整 case 2: pmenu=sonmenu1; UART_Send_Str($进入调整时间n);UART_Send_Str(*); /上位机的结束标识 break;case 3: pmenu=sonmenu2; UART_Send_Str($进入报警温度n);UART_Send_Str(*); /上位机的结束标识break;Clean_12864_GDRAM(); /先清完所有显示再把相应的内容显示出来Clean_12864();write_12864_cmd(0x80)
22、;for(i=48;i60;i+)write_12864_data(pmenui);setrowbkcolor(1,1);/第一行为父菜单名称,反白处理。write_12864_cmd(0x30);write_12864_cmd(0x90);for(i=0;i16;i+)write_12864_data(pmenui);write_12864_cmd(0x88);for(i=16;i31;i+)write_12864_data(pmenui);write_12864_cmd(0x98);for(i=32;i48;i+)write_12864_data(pmenui);if(curr_menu_
23、id=2)write_1302(0x8e,0x00); /关写保护,可以写write_1302(0x80,0x80); /让1302停震gettime_1302(times);worktime_1302(disptimes,times);one_sign=1;run_sign=1;while(outflag=1)/设置菜单/*/ /选择的是报警温度菜单项 if(curr_menu_id=3) TR0=1;switch(run_sign)if(one_sign=1) one_sign=0;gudidisptemp(alarm_temp);write_12864_cmd(timelcdxy); i
24、f(kong)write_12864_data(alarm_temptimenum/10+0x30); write_12864_data(0+alarm_temptimenum%10); /else write_12864_data( );write_12864_data( );if(workcode=11) workcode=14;tempdata+;one_sign=1;if(workcode=10) workcode=14;tempdata-;one_sign=1;alarm_temptimenum=tempdata;/再把设置好的报警值存起来if(workcode=13)if(run_
25、sign=2)/说明已经全部设置完成,可以退出了。outflag=0;/退出标记TR0=0;/关闭定时器0Clean_12864_GDRAM();Clean_12864();UART_Send_Str($设置完成n);UART_Send_Str(*); /上位机的结束标识 for(i=0;i6;i+)olddisptimesi=disptimesi+65;/为了使下面出现比较不合,写入首次的所有图形elseworkcode=14; run_sign+; write_12864_cmd(timelcdxy); write_12864_data(alarm_temptimenum/10+0x30)
26、;/if(workcode=13) 在此完了 /报警温度菜单项设置完成/*/*/*checkflag=checktemp(alarm_temp);/检查报警标志if(alarmflag&(checkflag=1)UART_Send_Str($低温警报:温度超下限值!n);UART_Send_Str(*); /上位机的结束标识if(alarmflag&(checkflag=2)UART_Send_Str($高温警报:温度超上限值!n);UART_Send_Str(*); /上位机的结束if(alarmflag&checkflag)alarmbeep();checkflag=time_compar
27、e();/检查报警标志if(alarmflag&checkflag)UART_Send_Str(*); /上位机的结束标识if(alarmflag&(checkflag=1)alarmbeep();/* us 级延时函数 /蜂鸣器使用 /*void DelayUS(uint num)while(-num); /* 约0.1ms延时函数(11.0592MHZ)*/void delay100us(uchar x) unsigned char i;while(x-)for (i = 0; i10; i+);/* 蜂鸣器响一声 /*void beep()uchar y; for (y=0;y50;y+
28、)DelayUS(50);BEEP=0; /有源蜂鸣器给电就响 BEEP=1; /关闭蜂鸣器DelayUS(90)/* 温度报警检查函数超过限制值就返回1,温度正常则返回0;*/uchar checktemp(uchar *pp)uchar aa;aa=temp_check1*10+temp_check0; /先取出当前温度值if(pp1=aa) /比较,成立则超过下限return 1; /返回1return 0; /返回0/* 红外编码数据处理函数函数 */uchar workIRcode(uchar *pp) uchar result;beep();switch(pp2) case 0x0
29、0: result=0; break; /0case 0x01: result=1; break; /1case 0x02: result=2; break; /2case 0x03: result=3; break; /3case 0x04: result=4; break; /4case 0x05: result=5; break; /5case 0x06: result=6; break; /6case 0x07: result=7; break; /7case 0x08: result=8; break; /8case 0x09: result=9; break; /9case 0x0
30、F: result=10; break; /-case 0x0E: result=11; break; /+case 0x13: result=12; break; /菜单case 0x48: result=13; break; /OKcase 0x0A: result=15; break; /上case 0x0B: result=16; break; /下case 0x1a: result=17; break; /丽音default: result=14; break; /别的键按下返回14return result;/*/ / 以下显示温度在第4行write_12864_cmd(0x9c)
31、; /温度显示的坐标write_12864_data( ); /补上空格write_12864_data(tempdisdata3); /显示温度的最高位:百位write_12864_data(tempdisdata2); /显示温度的十位 write_12864_data(tempdisdata1); /显示温度的个位write_12864_data(.); /显示小数点write_12864_data(tempdisdata0); /显示温度值小数位write_12864_data(0xa1); /温度的符号“C”write_12864_data(0xe6); /*/void gudidi
32、sptemp(uchar *tempc) write_12864_cmd(0x94); /液晶坐标定位write_12864_data(0+(tempc1&0xf0)4); write_12864_data(0+(tempc1&0x0f); /写入上限值write_12864_cmd(0x8c); /液晶坐标定位write_12864_data(0+(tempc0&0xf0)4); write_12864_data(0+(tempc0&0x0f); /写入下限值void gudidispclock(uchar *clock) write_12864_cmd(0x8a); /液晶坐标定位writ
33、e_12864_data(0+clock0/10); write_12864_cmd(0x8c); /液晶坐标定位/* 外部中断0服务函数*/void intt_0() interrupt 0 /下降沿触发:接收不到红外时OUT高电平,接收到红外时OUT低电平。 uchar four,one,num=0;EX0 = 0; /关中断0使能,防止处理过程中再接收红外信号delayms(2); /稍延时2ms,防干扰if (IR_GET) /再检测红外接收脚(9ms的前导低电平),为高电平说明是干扰 EX0 =1; /使能中断0return; /退出中断程序 while(!IR_GET); /等IR变为高电平,跳过9ms的前导低电平信号。while (IR_GET); /等 IR 变为低电平,跳过4.5ms的前导高电平信号。for (four=0;four4;four+) /四组数据 for (one=0;one=20)/17*0.1ms=1.7ms /数据“1”的时长最长也就1.685ms,计数超过则数据错误,退出中断EX0=1;/使能中断0return;/退出中断
限制150内