#include<reg52.h>
#include<intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit dq=P3^7;
sbit dq1=P3^6;
sbit dq2=P3^5;
sbit beep=P2^0;//报警蜂鸣器
uint8 smgduan[11]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F,0x80};// 段选
uint8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位选
uint8 code shu[10]="0123456789";
uint8 code fuhao[]="-+.°C ";
uint8 code dd[30]="NO1 tempertury IS TOO HIGHT !";
uint8 code dd1[30]="NO2 tempertury IS TOO HIGHT !";
uint8 code dd2[30]="NO3 tempertury IS TOO HIGHT !";
uint8 a,a1,a2,a4,c1,c2,c,temp,temp1,temp2;
float dio,dio1,dio2;
uint16 k,k1,k2;
uint8 num[7];
uint8 tempdata[11];
void delay(uint16 i)
{
while(i--);
}
//第一个DS18B20检测温度
void ds18b20init() //18b20的初始化
{
dq=1;
delay(1);
dq=0;
delay(80);
dq=1;
delay(5);
dq=0;
delay(20);
dq=1;
delay(35);
}
void ds18b20wr(uint8 dat) //18b20写数据
{
uint8 i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
dat>>=1;
delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us
dq=1;
delay(1);
}
}
uint8 ds18b20rd() //18b20读数据
{
uint8 value,i;
for(i=0;i<8;i++)
{
dq=0;
value>>=1;
dq=1;
if(dq==1)value|=0x80;
delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us
}
return value;
}
uint8 readtemp() //读取温度内需要复位的
{
uint8 b;
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0x44); //发送温度转换指令
delay(100);
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0xbe); //发读暂存器指令
a=ds18b20rd(); //温度的低八位
b=ds18b20rd(); //温度的高八位
b<<=4; //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数
c=b&0x80; //温度正负标志位确认
b+=(a&0xf0)>>4;
a=a&0x0f; //温度的小数部分
return b;
}
//第二个DS18B20检测温度
void ds18b20init1() //18b20的初始化
{
dq1=1;
delay(1);
dq1=0;
delay(80);
dq1=1;
delay(5);
dq1=0;
delay(20);
dq1=1;
delay(35);
}
void ds18b20wr1(uint8 dat) //18b20写数据
{
uint8 i;
for(i=0;i<8;i++)
{
dq1=0;
dq1=dat&0x01;
dat>>=1;
delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us
dq1=1;
delay(1);
}
}
uint8 ds18b20rd1() //18b20读数据
{
uint8 value,i;
for(i=0;i<8;i++)
{
dq1=0;
value>>=1;
dq1=1;
if(dq1==1)value|=0x80;
delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us
}
return value;
}
uint8 readtemp1() //读取温度内需要复位的
{
uint8 b;
ds18b20init1(); //初始化
ds18b20wr1(0xcc); //发送忽略ROM指令
ds18b20wr1(0x44); //发送温度转换指令
delay(100);
ds18b20init1(); //初始化
ds18b20wr1(0xcc); //发送忽略ROM指令
ds18b20wr1(0xbe); //发读暂存器指令
a1=ds18b20rd1(); //温度的低八位
b=ds18b20rd1(); //温度的高八位
b<<=4; //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数
c1=b&0x80; //温度正负标志位确认
b+=(a1&0xf0)>>4;
a1=a1&0x0f; //温度的小数部分
return b;
}
//第三个DS18B20检测温度
void ds18b20init2() //18b20的初始化
{
dq2=1;
delay(1);
dq2=0;
delay(80);
dq2=1;
delay(5);
dq2=0;
delay(20);
dq2=1;
delay(35);
}
void ds18b20wr2(uint8 dat) //18b20写数据
{
uint8 i;
for(i=0;i<8;i++)
{
dq2=0;
dq2=dat&0x01;
dat>>=1;
delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us
dq2=1;
delay(1);
}
}
uint8 ds18b20rd2() //18b20读数据
{
uint8 value,i;
for(i=0;i<8;i++)
{
dq2=0;
value>>=1;
dq2=1;
if(dq2==1)value|=0x80;
delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us
}
return value;
}
uint8 readtemp2() //读取温度内需要复位的
{
uint8 b;
ds18b20init2(); //初始化
ds18b20wr2(0xcc); //发送忽略ROM指令
ds18b20wr2(0x44); //发送温度转换指令
delay(100);
ds18b20init2(); //初始化
ds18b20wr2(0xcc); //发送忽略ROM指令
ds18b20wr2(0xbe); //发读暂存器指令
a2=ds18b20rd2(); //温度的低八位
b=ds18b20rd2(); //温度的高八位
b<<=4; //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数
c2=b&0x80; //温度正负标志位确认
b+=(a2&0xf0)>>4;
a2=a2&0x0f; //温度的小数部分
return b;
}
void datapros()
{
dio=a*0.0625;
k=dio*10000;//取小数点后两位有效数字
num[0]=smgduan[1];
num[1]=smgduan[10];
num[2]=smgduan[temp/100];
num[3]=smgduan[temp%100/10];
num[4]=smgduan[temp%100%10]|0x80; //小数点处理
num[5]=smgduan[k/1000];
num[6]=smgduan[k%1000/100];
}
void temppros()
{
if(c==0x80) //读取到负温度即为补码,要将其转换成源码
{
tempdata[0]=fuhao[0];
temp=temp-1;
temp=(~temp)|0x80;//负数的补码即为反码+1;而负数的反码为其源码取反,除了符号位;正数的补码等于正数的反码等于正数的源码
}
else
{
tempdata[0]=fuhao[1];
temp=(temp);
}
tempdata[1]=shu[temp/100];
tempdata[2]=shu[temp%100/10];
tempdata[3]=shu[temp%100%10];
tempdata[4]=fuhao[2];
tempdata[5]=shu[k/1000];
tempdata[6]=shu[k%1000/100];
tempdata[7]=fuhao[3]; //°
tempdata[8]=fuhao[4];
tempdata[9]=fuhao[5];
tempdata[10]=fuhao[6];
}
void datapros1()
{
dio1=a1*0.0625;
k1=dio1*10000;//取小数点后两位有效数字
num[0]=smgduan[2];
num[1]=smgduan[10];
num[2]=smgduan[temp1/100];
num[3]=smgduan[temp1%100/10];
num[4]=smgduan[temp1%100%10]|0x80; //小数点处理
num[5]=smgduan[k1/1000];
num[6]=smgduan[k1%1000/100];
}
void temppros1()
{
if(c1==0x80) //读取到负温度即为补码,要将其转换成源码
{
tempdata[0]=fuhao[0];
temp1=temp1-1;
temp1=(~temp1)|0x80;//负数的补码即为反码+1;而负数的反码为其源码取反,除了符号位;正数的补码等于正数的反码等于正数的源码
}
else
{
tempdata[0]=fuhao[1];
temp1=(temp1);
}
tempdata[1]=shu[temp1/100];
tempdata[2]=shu[temp1%100/10];
tempdata[3]=shu[temp1%100%10];
tempdata[4]=fuhao[2];
tempdata[5]=shu[k1/1000];
tempdata[6]=shu[k1%1000/100];
tempdata[7]=fuhao[3]; //°
tempdata[8]=fuhao[4];
tempdata[9]=fuhao[5];
tempdata[10]=fuhao[6];
}
void datapros2()
{
dio2=a2*0.0625;
k2=dio2*10000;//取小数点后两位有效数字
num[0]=smgduan[3];
num[1]=smgduan[10];
num[2]=smgduan[temp2/100];
num[3]=smgduan[temp2%100/10];
num[4]=smgduan[temp2%100%10]|0x80; //小数点处理
num[5]=smgduan[k2/1000];
num[6]=smgduan[k2%1000/100];
}
void temppros2()
{
if(c2==0x80) //读取到负温度即为补码,要将其转换成源码
{
tempdata[0]=fuhao[0];
temp2=temp2-1;
temp2=(~temp2)|0x80;//负数的补码即为反码+1;而负数的反码为其源码取反,除了符号位;正数的补码等于正数的反码等于正数的源码
}
else
{
tempdata[0]=fuhao[1];
temp2=(temp2);
}
tempdata[1]=shu[temp2/100];
tempdata[2]=shu[temp2%100/10];
tempdata[3]=shu[temp2%100%10];
tempdata[4]=fuhao[2];
tempdata[5]=shu[k2/1000];
tempdata[6]=shu[k2%1000/100];
tempdata[7]=fuhao[3]; //°
tempdata[8]=fuhao[4];
tempdata[9]=fuhao[5];
tempdata[10]=fuhao[6];
}
void display()
{
uint8 i;
for(i=0;i<7;i++)
{
P2=smgwei[i];
delay(10);
P0=num[i];
delay(100);
}
}
void display1()
{
uint8 i;
for(i=0;i<7;i++)
{
P2=smgwei[i];
delay(10);
P0=num[i];
delay(100);
}
}
void display2()
{
uint8 i;
for(i=0;i<7;i++)
{
P2=smgwei[i];
delay(10);
P0=num[i];
delay(100);
}
}
void uartinit()
{
TMOD=0x20; //选择方式2,自动装载模式
SCON=0x50;
TH1=0xF3; //波特率取的是4800;所以在串口调试助手上面波特率选择2400.如果选择4800的话,结果就是乱码。但可以在初始化的时候加一条倍频语句。PCON=0x80;
TL1=0xF3;
TR1=1; //这个一定要打开
}
void sound() //报警程序
{
uint16 i=1000;
while(i--)
{
beep=~beep;
delay(100);
}
}
void main()
{
uint16 i,j;
uartinit();
while(1)
{
temp=readtemp();
if(temp>30)
{
sound();
for(j=0;j<31;j++) //将报警信息传给PC机显示。
{
SBUF=dd[j];
while(!TI); //数据发送完成后硬件自动置一
TI=0; //需要软件清零
}
}
for(i=0;i<100;i++) //显示第一个DS18B20温度
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机+DS18B20设计的多点测温数码管显示的软硬件源码及设计文档资料.zip
共45个文件
jpg:12个
pcb:5个
sch:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 6 下载量 58 浏览量
2022-04-19
06:30:28
上传
评论 3
收藏 17.6MB ZIP 举报
温馨提示
基于51单片机+DS18B20设计的多点测温数码管显示的软硬件源码及设计文档资料,硬件采用PROTEL设计,包括原理图及PCB工程文件。 本设计成功,在温度测量系统中,实际温度值由DS18B20温度传感器设计的电路进行测量。通过温度传感器测量的温度数据送入单片机STC90C516RD+;对采样数据进行变换处理后送给数码管显示,并且通过单片机串口把温度数据传送给PC机,通过PC机串口调试助手实时显示测试温度数据值。这样一来,整个系统就可以在数码管、PC机串口调试助手进行多方的控制显示了,本系统的控制功能由单片机STC90C516RD+ 的程序来实现。 整体设计框图如图
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机+DS18B20设计的多点测温数码管显示的软硬件源码及设计文档资料.zip (45个子文件)
MM9H904IOP6TQ4F`%H[@JJR.jpg 1.08MB
S(YF@(254OR3(2A9V8PD930.jpg 720KB
protel99se设计板
Backup of 基于单片机设计的粮仓多点测温系统.PcbPreview 97KB
BACKUP~1.DDB 846KB
Backup of 基于单片机设计的多点测温系统.Pcb 284KB
Previous Backup of 基于单片机设计的多点测温系统.Sch 27KB
Previous Backup of 基于单片机设计的粮仓多点测温系统.Sch 26KB
基于单片机设计的粮仓多点测温系统.ddb 6.27MB
Previous Backup of 基于单片机设计的粮仓多点测温系统.Pcb 329KB
Previous Backup of 基于单片机设计的多点测温系统.Pcb 284KB
Backup of 基于单片机设计的粮仓多点测温系统.Sch 26KB
Backup of 基于单片机设计的多点测温系统.Sch 27KB
Backup of 基于单片机设计的粮仓多点测温系统.Pcb 329KB
Backup of BACKUP~1.PCB 329KB
W(VQMY5%J}N_{[EPG4[W_7A.jpg 674KB
CE%`IPP`Z4{B}ZD])~IT50R.jpg 1.26MB
DZ9JCPO3CWLSFYL7LM34L{6.jpg 1.48MB
未命名2.bmp 957KB
M7P]LTY3NFP0R_EK0[~5]@6.jpg 812KB
ZM}L3~UUIVR1NACD(YYMVEL.jpg 674KB
1.bmp 957KB
未命3.bmp 957KB
基于单片机设计的多点测温系统程序
数码管显示
基于单片机设计的多点测温系统 22KB
基于单片机设计的多点测温系统.hex 8KB
基于单片机设计的多点测温系统_uvproj.bak 0B
基于单片机设计的多点测温系统.plg 1KB
基于单片机设计的多点测温系统.uvopt 54KB
基于单片机设计的多点测温系统.uvproj 13KB
基于单片机设计的多点测温系统_uvopt.bak 54KB
基于单片机设计的多点测温系统.M51 31KB
基于单片机设计的多点测温系统.OBJ 27KB
基于单片机设计的多点测温系统.c 9KB
基于单片机设计的多点测温系统.LST 21KB
基于单片机设计的多点测温系统.lnp 88B
未命名.bmp 957KB
BVSK2I$7U6AN44{I{YEJ7%5.jpg 804KB
}[$%U%DS{_MHJVY1F}GOM[9.jpg 875KB
FJQ%JWPXXQO74H`SD6O%ZWE.jpg 1.44MB
Proteus仿真图
数码管显示温度.pdsprj 28KB
数码管显示温度.pdsprj.SVL5MBPHQOHMRTK.Administrator.workspace 5KB
Backup Of 数码管显示温度.pdsbak 28KB
数码管显示温度.pdsprj.G8RCRD0CRI4NSGX.Administrator.workspace 4KB
KI]@XI28)}OW]88%6)0]36X.jpg 823KB
RGORCHVG~WSY{S(BP$N6`TM.jpg 824KB
论文
基于单片机设计的多点测温系统.docx 6.79MB
共 45 条
- 1
资源评论
- swwxa2023-03-15资源内容总结的很到位,内容详实,很受用,学到了~
- su_per12022-05-06用户下载后在一定时间内未进行评价,系统默认好评。
- 摸鱼cv2023-07-01资源很实用,内容详细,值得借鉴的内容很多,感谢分享。
- liushenxue2023-06-25资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- 2301_780989362023-05-18资源很实用,内容详细,值得借鉴的内容很多,感谢分享。
探索者我有我路向
- 粉丝: 274
- 资源: 1815
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功