基于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; //当前显示的是哪一个数码管
int AlarmLow = 200; //默认报警的温度下限值是20度
int AlarmHig = 350; //默认报警的温度上限值是35度
/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
/*********************************************************/
// 延时X*10us函数
/*********************************************************/
void DelayX10us(unsigned char t)
{
do{
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
}while(--t); //t先自减,然后判断t的值是否大于0
}
/*********************************************************/
// 复位18B20
/*********************************************************/
bit Reset18B20()
{
bit ack; //定义一个bit型变量
DQ = 0; //数据引脚拉低
DelayX10us(50); //延时500us
DQ = 1; //数据引脚拉高
DelayX10us(6); //延时60us
ack = DQ; //读取复位值
while(!DQ); //判断是否为高电平
return ack; //返回复位值
}
/*********************************************************/
// 向18B20写数据或命令
/*********************************************************/
void Write18B20(unsigned char dat)
{
unsigned char mask; //定义一个mask变量
for(mask=0x01; mask!=0; mask<<=1) //循环8次,从低到高依次写入
{
DQ = 0; //初始电平为0
_nop_(); //延时大约为1us
_nop_(); //延时大约为1us
if((dat & mask) == 0) //判断写入的一位是否为0
DQ = 0; //为0,数据位为0
else
DQ = 1; //否则,数据位为1
DelayX10us(6); //延时60us
DQ = 1; //拉高数据位,为下次写作准备
}
}
/*********************************************************/
// 从18B20读数据或命令
/*********************************************************/
unsigned char Read18B20()
{
unsigned char mask; //定义一个mask变量
unsigned char dat; //定义一个dat变量,用于保存读到的数据
for(mask=0x01; mask!=0; mask<<=1) //循环8次,从低到高依次读出
{
DQ = 0; //初始电平为0
_nop_(); //延时大约为1us
_nop_(); //延时大约为1us
DQ = 1; //数据电平拉高
_nop_(); //延时大约为1us
_nop_(); //延时大约为1us
if(DQ == 0) //判读数据引脚是否为0
dat &= ~mask; //若为0,dat按位与上0xfe,读出0
else
dat |= mask; //否则,dat按位或上0x01,读出1
DelayX10us(6); //延时60us
}
return dat; //返回读出数据dat
}
/*********************************************************/
// 获取18B20温度数据
/*********************************************************/
int Get18B20Temp()
{
bit ack; //定义bit型变量
int temp; //定义有符号整形变量temp,用于保存温度数据
unsigned char LSB, MSB; //定义两个无符号字符型变量,用于保存从18B20中读出的两个数据
ack = Reset18B20(); //获取18B20复位位
if(ack == 0) //判读是否复位
{
Write18B20(0xcc); //跳过检测ROM
Write18B20(0x44); //启动温度转换指令
}
ack = Reset18B20(); //获取18B20复位位
if(ack == 0) //判读是否复位
{
Write18B20(0xcc); //跳过检测ROM
Write18B20(0xbe); //读取温度指令
LSB = Read18B20(); //先读第8位
MSB = Read18B20(); //再读高8位
temp = ((int)MSB<<8) + LSB; //高8位,第8位整合成一个有符号的整型变量,并把值保存在temp中
temp = temp * 0.0625 * 10; //合成温度值并放大10倍
}
return temp; //返回读到的温度数值
}
/*********************************************************/
// 定时器初始化
/*********************************************************/
void TimerInit()
{
TMOD = 0x01; // 使用定时器0,工作方式1
TH0 = 248; // 给定时器0的TH0装初值,定时2ms
TL0 = 48; // 给定时器0的TL0装初值
ET0 = 1; // 定时器0中断使能
EA = 1; // 打开总中断
TR0 = 1; // 启动定时器0
}
05原理图![在这里插入图片描述]()
注:
源码使用Keil4或Keil5打开
仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。
06资料获取
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接



浙公网安备 33010602011771号