手机模版网站价格,高新网站开发1年经验,常熟市住房和城乡建设部网站,谁家做电商商城网站便宜不知道该往哪走的时候#xff0c;就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚#xff0c;分别为
GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议
优点#xff1a;占用端口少#xff0c;电路设计方便 同时该协议要求通过上拉电阻… 不知道该往哪走的时候就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚分别为
GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议
优点占用端口少电路设计方便 同时该协议要求通过上拉电阻上拉到正电源该协议是总线协议可以挂载一个以上的元件
总线协议每一个元件都有一个地址根据地址就可以获得对应传感器的内部信息 DS18B20温度传感器在开发板上的位置如下图 二、访问DS18B20步骤
初始化发送地址当总线上只有一个元件就可以直接面向所有的传感器进行通信就可以了例如局域网的广播功能性命令触发温度采集读取相关命令等 功能性命令表格 第一行触发温度转换地址是0x44第二行读取温度地址是0xBE下面的功能是进行更深入的开发会用到这里暂不解释 DS18B20温度存储格式 共有16位数据结构SSIGN 代表一个符号
如果温度是正的11~15位都是0如果温度是负的11~15位都是1
0~3是小数位4~10是整数位最高到。温度传感器的精度是12bit
读取的话由于是16位的数据可以用unsigned int类型变量存储 但真正的unsigned int类型和这个是有差别的 由上图可以发现对应的两个数之间相差倍因此在读取之后想要获得真正的值就要除以16
三、模块代码
由于占用两个字节所以用两个变量存储高八位和低八位的数最后并在一起返回一个数
#include onewire.h
//
void Delay_OneWire(unsigned int t)
{unsigned char i;while(t--){for(i0;i12;i);}
}//
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i0;i8;i){DQ 0;DQ dat0x01;Delay_OneWire(5);DQ 1;dat 1;}Delay_OneWire(5);
}//
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i0;i8;i){DQ 0;dat 1;DQ 1;if(DQ){dat | 0x80;} Delay_OneWire(5);}return dat;
}//
bit init_ds18b20(void)
{bit initflag 0;DQ 1;Delay_OneWire(12);DQ 0;Delay_OneWire(80);DQ 1;Delay_OneWire(10); initflag DQ; Delay_OneWire(5);return initflag;
}unsigned int read_temperature(void)
{unsigned char low,high;init_ds18b20();//初始化Write_DS18B20(0xCC);//对所有元件进行通信Write_DS18B20(0x44);//触发温度转换init_ds18b20();//初始化Write_DS18B20(0xCC);//对所有元件进行通信Write_DS18B20(0xBE);//读取温度lowRead_DS18B20();//返回数据highRead_DS18B20();return (high8|low);
}
四、主函数代码
这里别忘记要将数据除以16才是真实数据由于传回的是整数类型所以要除以16.0最后的结果才可以保留两位小数 想让数码管的后四位不显示不要忘记敲四个空格
#include seg.h
#include tim.h
#include led.h
#include init.h
#include onewire.h
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos0;//字符数组以/0结尾所以要有9位
void Seg_Proc(void);//Timer
unsigned long ulms 0;
unsigned int uiSeg_Dly0;
//Temperature
unsigned int uiTemp0;
void main(void)
{Cls_Peripheral();Timer0Init();EA1;while(1){Seg_Proc();}}void Seg_Proc(void)
{if(uiSeg_Dly200)return;uiSeg_Dly 0;uiTemp read_temperature();sprintf(pucSeg_Buf,%.2f ,uiTemp/16.0);//将指定的内容打印到字符数组里Seg_Tran(pucSeg_Buf,pucSeg_Code);
}void Time_0(void) interrupt 1
{ulms;uiSeg_Dly;if(ulms % 20){pucSeg_Pos(pucSeg_Pos1)%8;//实现pucSeg_Pos从0-7循环的操作Seg_Disp(pucSeg_Code,pucSeg_Pos);}
}