您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > 基于51单片机DS18B20温度可调上下限实训报告
温度上下限可调式数字温度检测显示器设计与制作1101电信19刘朋朋一、任务与计划:采用AT89C51单片机作为控制器,数字温度传感器DS18B20检测现场温度,能显示温度检测值、设定温度上限值和下限值,当温度超过设定上限时,显示“overtempH”,有红色LED闪亮警示,当温度低于设定的下限值时,显示undertempL,有黄色LED闪亮警示。将检测到的温度信息显在1602LCD液晶显示器第一行形式为“Tempxx.x℃”。第二行显示设定的温度上下限值和超限警示显示,温度上限值30+小组号,温度下限为25-学号末位数,第二行后两位显示学号。二、及电路原理图设计1、液晶显示选用1602显示环境温度以及温度上下限的值,如:图(1-1)所示。2、温度传感器DS18B20测环境温度如:图(1-2)所示。3、按键模块如图:(1-3)所示,而本次设计只需用到四个按键即可,其中K2、K1控制设定温度的上限值的加减,K4、K3控制设定温度的下限值的加减。4、8只LED模块如:图(1-4)所示,本次设计只需两只LED灯的闪烁来反映出检测的温度是否在设定的温度范围内。5、元件模块和接口一览表如:图(1-5)所示。6、运用Proteus软件绘制硬件电路如:图(1-6)所示。图1-1液晶显示图1-2DS18B20图1-3独立按键图1-4LED图1-5元件模块和接口一览表图1-6硬件电路设计三、设计、编译#includereg52.h//所包含头文件#includestdio.h#include18b20.h#include1602.h#includedelay.h#defineKeyPortP3//定义按键端口sbitled1=P1^0;//定义高温报警LEDsbitled2=P1^1;//定义低温报警LEDbitReadTempFlag;//定义读时间标志voidInit_Timer0(void);//定时器初始化unsignedcharKeyScan(void);//键盘扫描函数声明/*------------------------------------------------串口通讯初始化------------------------------------------------*/voidUART_Init(void){SCON=0x50;TMOD|=0x20;//TMOD:timer1,mode2,8-bit重装TH1=0xFD;//TH1:重装值9600波特率晶振11.0592MHzTR1=1;//TR1:timer1打开//EA=1;//打开总中断//ES=1;//打开串口中断TI=1;}/*------------------------------------------------主函数------------------------------------------------*/voidmain(void){inttemp,tempH=30,tempL=25;//给出初始化的温度上下线floattemperature;unsignedcharTempFlag=0;//定义温度标志位chardisplaytemp[16],num;//定义显示区域临时存储数组LCD_Init();//初始化液晶DelayMs(20);//延时有助于稳定LCD_Clear();//清屏Init_Timer0();UART_Init();Lcd_User_Chr();//写入自定义字符while(1)//主循环{num=KeyScan();switch(num)//调整温度上下线的按键操作{case1:if(tempH127)tempH++;break;case2:if(tempH-55)tempH--;break;case3:if(tempL127)tempL++;break;case4:if(tempL-55)tempL--;break;default:break;}switch(TempFlag)//LCD显示温度上下线以及报警时动态{case0://输出温度上限下限sprintf(displaytemp,H.%3dL.%3d,tempH,tempL);LCD_Write_String(0,1,displaytemp);//显示第二行break;case1:LCD_Write_String(0,1,overtempH19);break;case2:LCD_Write_String(0,1,undertempL19);break;default:break;}if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();temperature=temp*0.0625;temp=4;if(temptempH)//实际温度高于上线所执行的操作{led1=0;//高温LED闪亮报警led2=1;TempFlag=1;}elseif(temptempL)实际温度低于下限所执行的操作{led2=0;//低温LED闪亮报警led1=1;TempFlag=2;}else//正常显示所执行的操作{led1=1;led2=1;TempFlag=0;}//读取温度与写入温度sprintf(displaytemp,Temp%6.2f,temperature);//打印温度值LCD_Write_String(0,0,displaytemp);//显示第一行LCD_Write_Char(13,0,0x01);//写入温度右上角点LCD_Write_Char(14,0,'C');//写入字符CLCD_Write_String(0,1,displaytemp);LCD_Write_Char(13,1,'1');LCD_Write_Char(14,1,'9');}}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响//TH0=0x00;//给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/voidTimer0_isr(void)interrupt1{staticunsignedintnum;TH0=(65536-2000)/256;//送初始值定时2个毫秒TL0=(65536-2000)%256;num++;if(num==400)//{num=0;ReadTempFlag=1;//读标志位置1}}unsignedcharKeyScan(void)//按键扫描{unsignedcharkeyvalue;if(KeyPort!=0xff)//判断按键按下并返回相应的值{DelayMs(10);if(KeyPort!=0xff){keyvalue=KeyPort;while(KeyPort!=0xff);switch(keyvalue){case0xfe:return1;break;case0xfd:return2;break;case0xfb:return3;break;case0xf7:return4;break;case0xef:return5;break;case0xdf:return6;break;case0xbf:return7;break;case0x7f:return8;break;default:return0;break;}}}return0;}四、安装和调试1、高温报警时的状态(如图2-1)图(2-1)2、调低温度上限前后的比较(如图2-2)图(2-2)3、温度报警的近照(如图2-3)图(2-3)五、小结通过这次可调温度18b20的设计制作中在今天的调试中复习了按键扫描,显示程序,1602液晶显示的基本应用。理解了SWITCH语句的基本应用提高了技能,掌握模块化编程的思想。同时也提高了我的动手画图的能力处理解决问题的能力!
本文标题:基于51单片机DS18B20温度可调上下限实训报告
链接地址:https://www.777doc.com/doc-5133038 .html