基于51单片机温度检测电子设计系统DS18B20(Proteus仿真+Keil源码+设计文档+原理图等)附下载链接!
提供对应的Proteus仿真电路图,Keil程序源码(C语言),原理图,模块资料、元件清单、程序流程图等电子资料参考学习。
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接
01设计要求
设计一个基于51单片机温度检测报警系统:
1)采用51单片机搭配DS18B20温度传感器与4位数码管组成硬件系统;
2)测温量程范围-55.0~125.0摄氏度;
3)测温分辨率可达 0.1 摄氏度;
4)当温度低于设定下限或超出设定上限时,系统自动进行声光预警;
5)支持按键手动自定义设置温度上下限阈值。
02系统概述
传感器采用DS18B20,负责采集温度数据后发给单片机。显示设备采用4位共阴数码管,显示检测到的温度值。按键模块,主要是进行报警值的设置。报警模块采用蜂鸣器+LED的模式,超出报警范围则进行声光报警。
03Proteus仿真![]()
04示例代码
/* 数码管的显示值: 0 1 2 3 4 5 6 7 8 9 - */uchar code Array1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};/* 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */uchar code Array2[]={0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar Buff[4];//显示缓冲区uchar ShowID=1;//当前显示的是哪一个数码管intAlarmLow=200;//默认报警的温度下限值是20度intAlarmHig=350;//默认报警的温度上限值是35度/*********************************************************/// 毫秒级的延时函数,time是要延时的毫秒数/*********************************************************/voidDelayMs(uint time){uint i,j;for(i=0;i<time;i++)for(j=0;j<110;j++);}/*********************************************************/// 延时X*10us函数/*********************************************************/voidDelayX10us(unsignedchart){do{_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us_nop_();//延时1us}while(--t);//t先自减,然后判断t的值是否大于0}/*********************************************************/// 复位18B20/*********************************************************/bitReset18B20(){bit ack;//定义一个bit型变量DQ=0;//数据引脚拉低DelayX10us(50);//延时500usDQ=1;//数据引脚拉高DelayX10us(6);//延时60usack=DQ;//读取复位值while(!DQ);//判断是否为高电平returnack;//返回复位值}/*********************************************************/// 向18B20写数据或命令/*********************************************************/voidWrite18B20(unsignedchardat){unsignedcharmask;//定义一个mask变量for(mask=0x01;mask!=0;mask<<=1)//循环8次,从低到高依次写入{DQ=0;//初始电平为0_nop_();//延时大约为1us_nop_();//延时大约为1usif((dat&mask)==0)//判断写入的一位是否为0DQ=0;//为0,数据位为0elseDQ=1;//否则,数据位为1DelayX10us(6);//延时60usDQ=1;//拉高数据位,为下次写作准备}}/*********************************************************/// 从18B20读数据或命令/*********************************************************/unsignedcharRead18B20(){unsignedcharmask;//定义一个mask变量unsignedchardat;//定义一个dat变量,用于保存读到的数据for(mask=0x01;mask!=0;mask<<=1)//循环8次,从低到高依次读出{DQ=0;//初始电平为0_nop_();//延时大约为1us_nop_();//延时大约为1usDQ=1;//数据电平拉高_nop_();//延时大约为1us_nop_();//延时大约为1usif(DQ==0)//判读数据引脚是否为0dat&=~mask;//若为0,dat按位与上0xfe,读出0elsedat|=mask;//否则,dat按位或上0x01,读出1DelayX10us(6);//延时60us}returndat;//返回读出数据dat}/*********************************************************/// 获取18B20温度数据/*********************************************************/intGet18B20Temp(){bit ack;//定义bit型变量inttemp;//定义有符号整形变量temp,用于保存温度数据unsignedcharLSB,MSB;//定义两个无符号字符型变量,用于保存从18B20中读出的两个数据ack=Reset18B20();//获取18B20复位位if(ack==0)//判读是否复位{Write18B20(0xcc);//跳过检测ROMWrite18B20(0x44);//启动温度转换指令}ack=Reset18B20();//获取18B20复位位if(ack==0)//判读是否复位{Write18B20(0xcc);//跳过检测ROMWrite18B20(0xbe);//读取温度指令LSB=Read18B20();//先读第8位MSB=Read18B20();//再读高8位temp=((int)MSB<<8)+LSB;//高8位,第8位整合成一个有符号的整型变量,并把值保存在temp中temp=temp*0.0625*10;//合成温度值并放大10倍}returntemp;//返回读到的温度数值}/*********************************************************/// 定时器初始化/*********************************************************/voidTimerInit(){TMOD=0x01;// 使用定时器0,工作方式1TH0=248;// 给定时器0的TH0装初值,定时2msTL0=48;// 给定时器0的TL0装初值ET0=1;// 定时器0中断使能EA=1;// 打开总中断TR0=1;// 启动定时器0}05原理图![]()
注:
源码使用Keil4或Keil5打开
仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。
06资料获取
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接
