过往历程
前期准备
1:本文使用的头文件是由stc生成
点击保存文件之后,保存至自己文件目录下方即可
2:本文使用的都是官方提供的底层驱动代码
一、DS18B20是什么?
DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
二、大概认知
1:测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°。
2:返回16位二进制温度数值
3:主机和从机通信使用单总线,即使用单线进行数据的发送和接收
4:在使用中不需要任何外围元件,独立芯片即可完成工作。
5:掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
6:每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值
7:宽电压供电,电压2.5V~5.5V
8:DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
长这样
三、流程图&注意事项
这里是用的是小蜜蜂老师的
小蜜蜂笔记
大家可以去看一下,这里我只是拿之前做笔记的图
#include<stc15f2k.h>
#include<onewire.h>
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char dula_1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,temp;
void buzz()
{
P2=((P2&0X1F)|0XA0);
P0=0X00;
P2&=0X1F;
P2=((P2&0X1F)|0X80);
P0=0XFF;
P2&=0X1F;
}
void delay(int x)
{
int i;
while(x--)
for(i=0;i<5*123;i++);
}
void din()
{
TMOD=0X10;
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
EA=1;
ET1=1;
TR1=1;
}
void display()
{
P2=((P2&0X1F)|0Xe0);
P0=0XFF;
P2&=0X1F;
P2=((P2&0X1F)|0Xc0);
P0=1<<diswela;
P2&=0X1F;
P2=((P2&0X1F)|0Xe0);
if(diswela==1)P0=dula_1[disdula[diswela]];
else P0=dula[disdula[diswela]];
P2&=0X1F;
if(++diswela>=8)diswela=0;
}
void read()
{
int LSB,MSB;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay(800);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
Init_DS18B20();
temp=0x00;
temp=MSB;
temp=(temp<<8)|LSB;
if((temp&0xf800)==0x0000)
{
temp>>=4;
temp=temp*100;
temp=temp+((LSB&0X0F)*6.25);
}
}
void display_1()
{
disdula[0]=temp/1000%10;
disdula[1]=temp/100%10;
disdula[2]=temp/10%10;
disdula[3]=temp/1%10;
disdula[4]=11;
disdula[5]=11;
disdula[6]=11;
disdula[7]=11;
}
void main()
{
buzz();
din();
while(1)
{
read();
display_1();
}
}
void qa() interrupt 3
{
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
display();
}
省赛代码传送门
第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
第八届蓝桥杯单片机省赛
第九届蓝桥杯单片机省赛
第十届蓝桥杯单片机省赛
第十一届蓝桥杯单片机省赛