基于51单片机温度检测电子设计系统DS18B20(Proteus仿真+Keil源码+设计文档+原理图等)附下载链接!

基于51单片机温度检测电子设计系统DS18B20(Proteus仿真+Keil源码+设计文档+原理图等)附下载链接! 提供对应的Proteus仿真电路图Keil程序源码C语言原理图模块资料、元件清单、程序流程图等电子资料参考学习。1项目完整资料获取链接下载链接2Keil、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 ShowID1;//当前显示的是哪一个数码管intAlarmLow200;//默认报警的温度下限值是20度intAlarmHig350;//默认报警的温度上限值是35度/*********************************************************/// 毫秒级的延时函数time是要延时的毫秒数/*********************************************************/voidDelayMs(uint time){uint i,j;for(i0;itime;i)for(j0;j110;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型变量DQ0;//数据引脚拉低DelayX10us(50);//延时500usDQ1;//数据引脚拉高DelayX10us(6);//延时60usackDQ;//读取复位值while(!DQ);//判断是否为高电平returnack;//返回复位值}/*********************************************************/// 向18B20写数据或命令/*********************************************************/voidWrite18B20(unsignedchardat){unsignedcharmask;//定义一个mask变量for(mask0x01;mask!0;mask1)//循环8次从低到高依次写入{DQ0;//初始电平为0_nop_();//延时大约为1us_nop_();//延时大约为1usif((datmask)0)//判断写入的一位是否为0DQ0;//为0数据位为0elseDQ1;//否则数据位为1DelayX10us(6);//延时60usDQ1;//拉高数据位为下次写作准备}}/*********************************************************/// 从18B20读数据或命令/*********************************************************/unsignedcharRead18B20(){unsignedcharmask;//定义一个mask变量unsignedchardat;//定义一个dat变量,用于保存读到的数据for(mask0x01;mask!0;mask1)//循环8次从低到高依次读出{DQ0;//初始电平为0_nop_();//延时大约为1us_nop_();//延时大约为1usDQ1;//数据电平拉高_nop_();//延时大约为1us_nop_();//延时大约为1usif(DQ0)//判读数据引脚是否为0dat~mask;//若为0dat按位与上0xfe,读出0elsedat|mask;//否则dat按位或上0x01,读出1DelayX10us(6);//延时60us}returndat;//返回读出数据dat}/*********************************************************/// 获取18B20温度数据/*********************************************************/intGet18B20Temp(){bit ack;//定义bit型变量inttemp;//定义有符号整形变量temp,用于保存温度数据unsignedcharLSB,MSB;//定义两个无符号字符型变量用于保存从18B20中读出的两个数据ackReset18B20();//获取18B20复位位if(ack0)//判读是否复位{Write18B20(0xcc);//跳过检测ROMWrite18B20(0x44);//启动温度转换指令}ackReset18B20();//获取18B20复位位if(ack0)//判读是否复位{Write18B20(0xcc);//跳过检测ROMWrite18B20(0xbe);//读取温度指令LSBRead18B20();//先读第8位MSBRead18B20();//再读高8位temp((int)MSB8)LSB;//高8位第8位整合成一个有符号的整型变量并把值保存在temp中temptemp*0.0625*10;//合成温度值并放大10倍}returntemp;//返回读到的温度数值}/*********************************************************/// 定时器初始化/*********************************************************/voidTimerInit(){TMOD0x01;// 使用定时器0工作方式1TH0248;// 给定时器0的TH0装初值定时2msTL048;// 给定时器0的TL0装初值ET01;// 定时器0中断使能EA1;// 打开总中断TR01;// 启动定时器0}05原理图注源码使用Keil4或Keil5打开仿真使用的是Proteus8.13及以上版本版本过低可能会打不开。06资料获取1项目完整资料获取链接下载链接2Keil、Proteus各个版本安装包 下载链接