标题:
单片机DS18B20温度上下限报警源代码和Proteus仿真原理图
[打印本页]
作者:
51黑电子happy
时间:
2017-4-5 04:04
标题:
单片机DS18B20温度上下限报警源代码和Proteus仿真原理图
51单片机DS18B20温度上下限报警的仿真原理图,用74ls245驱动数码管显示(proteus仿真工程文件可到本帖附件下载):
0.png
(30.26 KB, 下载次数: 77)
下载附件
2017-4-5 04:00 上传
51单片机DS18B20温度上下限报警源代码:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIO=P1^7;
uchar data dis_buf[6]; //显示缓冲区
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //显示的代码表
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
void dl_1ms( ) //延时1ms
{ data unsigned int d;
for(d=0;d<120;d++);
}
void display( ) //显示函数
{ data uchar bitcode, i;
bitcode=0xfe;
for(i=0;i<6;i++)
{ P2=table[dis_buf[i]];
P3=bitcode;
dl_1ms( );
P3=0xff;
bitcode=bitcode<<1;
bitcode=bitcode|0x01;
}
}
void delay_5us(uchar y) //(2.17*y+5)微妙延时
{ while(--y);
}
void delay() //延时1000ms
{ uchar i;
for(i=0;i<140;i++)
{ display();
}
}
void OneWireWByte(uchar x) //向总线写一个字节x
{ uchar i;
for(i=0;i<8;i++)
{ DIO=0; //拉低总线
_nop_(); //要求大于1微妙,但不超过15微妙
_nop_();
if(0x01&x)
{ DIO=1; //如果最低位为1,则将总线拉高
}
delay_5us(30); //延时60--120微妙
DIO=1; //释放总线
_nop_(); //要求大于1微妙
x=x>>1; //移位,准备发送下一位
}
}
uchar OneWireRByte(void) //从一总线上读一个字节,返回读到的内容
{ uchar i,j;
j=0;
for(i=0;i<8;i++)
{ j=j>>1;
DIO=0; //拉低总线
_nop_(); //要求大于1微妙,但不超过15微妙
_nop_();
DIO=1; //释放总线
_nop_();
_nop_();
if(DIO==1) //如果搞电平
{ j=j|0X80;
}
delay_5us(30); //延时60--120微妙
DIO=1; //释放总线
_nop_(); //要求大于1微妙
}
return j;
}
void DS18B20_int(void) //初始化DS18B20
{ DIO=0;
delay_5us(255); // 延时480--960微妙
DIO=1; //释放总线
delay_5us(30); //延时60--120微妙
if(DIO==0)
{ delay_5us(200); //要求释放总线后480微妙内结束复位
DIO=1; //释放总线
OneWireWByte(0xcc); //发送Skip ROM命令
OneWireWByte(0x4e); //发送写暂存RAM命令
OneWireWByte(0x00); //温度报警上限设为0
OneWireWByte(0x00); //温度报警下限设为0
OneWireWByte(0x7f); //将DS18B20设为12位,精度为0.25
DIO=0;
delay_5us(255); // 延时480--960微妙
DIO=1; //释放总线
delay_5us(240); //要求释放总线后480微妙内结束复位
DIO=1; //释放总线
}
}
uint DS18B20_readtemp() //读DS18B20的温度值
{ uint temp;
uchar DS18B20_temp[2]; //温度数据
DIO=0;
delay_5us(255); // 延时480--960微妙
DIO=1; //释放总线
delay_5us(30); //延时60--120微妙
if(DIO==0)
{ delay_5us(200); //要求释放总线后480微妙内结束复位
DIO=1;
OneWireWByte(0xcc); //发送Skip ROM命令
OneWireWByte(0x44); //发送温度转换命令
DIO=1;
delay( ); //延时1000ms
DIO=0;
delay_5us(255); // 延时480--960微妙
DIO=1;
delay_5us(30); //延时60--120微妙
if(DIO==0)
{ delay_5us(200); //要求释放总线后480微妙内结束复位
DIO=1;
OneWireWByte(0xcc); //发送Skip ROM命令
OneWireWByte(0xbe); //发送读暂存RAM命令
DS18B20_temp[0]=OneWireRByte(); //读温度的低字节
DS18B20_temp[1]=OneWireRByte(); //读温度的高字节
temp=256*DS18B20_temp[1]+DS18B20_temp[0];
temp=temp/16;
DIO=0;
delay_5us(255); //// 延时480--960微妙
DIO=1;
delay_5us(240); //要求释放总线后480微妙内结束复位
DIO=1;
}
return temp;
}
}
void main( ) //主函数
{ uint temp;
DS18B20_int();
dis_buf[0]=16; dis_buf[1]=16;
dis_buf[2]=0; dis_buf[3]=0;
dis_buf[4]=0; dis_buf[5]=0;
display( );
while(1)
{ temp=DS18B20_readtemp();
dis_buf[2]=temp/1000;
dis_buf[3]=(temp%1000)/100;
复制代码
0.png
(61.23 KB, 下载次数: 70)
下载附件
2017-4-5 03:59 上传
该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共几十个项目):
http://www.51hei.com/bbs/dpj-80575-1.html
本例程下载(含proteus仿真工程文件与源码):
单片机DS18B20温度上下限报警.rar
(54.79 KB, 下载次数: 63)
2017-4-5 04:03 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
风散炊烟
时间:
2017-4-10 13:08
程序无法仿真。
作者:
毛毛123love
时间:
2017-4-27 10:48
怎么下载?
作者:
tranhunga
时间:
2017-5-3 19:26
没有黑色钱下载
作者:
jiaojunh
时间:
2021-5-2 11:49
程序没有上下限报警功能
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1