ds18b20软件编程 ds18b20 - 电脑技术中心 - 【漳州电脑网】_漳州电脑维修_漳州笔记本电脑维修_监控安装_市区上门维修

全国统一24小时服务热线:400-0000-000400-0000-000  / 1399000000

当前位置:首页 > 电脑技术中心 > 正文

ds18b20软件编程 ds18b20

发布日期:2020-10-16

摘要:DS18B20温度控制电路 我仿真过,这个你要注意,你在ds18b20的程序中肯定有延迟函数,而这个延迟在软件仿真的时候和实际硬件肯定是有区别的,如果你把程序中的delay这样的延迟函数调整一下就应该...

ds18b20软件编程

DS18B20温度控制电路

我仿真过,这个你要注意,你在ds18b20的程序中肯定有延迟函数,而这个延迟在软件仿真的时候和实际硬件肯定是有区别的,如果你把程序中的delay这样的延迟函数调整一下就应该可以成功了,不是说程序不加修改直接移植就可以成功。

还有,软仿真不出来,最好找出原因,不要一味地说不可靠。

采用proteus仿真温度传感器为DS18B20 单片机51 不知道程序怎么写 ...

//DS18B20的读写程序,数据脚P2.7 ////温度传感器18B20汇编程序,采用器件默认的12位转化 ////最大转化时间750微秒,显示温度-55到 125度,显示精度 ////为0.1度,显示采用4位LED共阳显示测温值 ////P0口为段码输入,P34~P37为位选 ///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P0 //段码输出口#define discan P2 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P1^2; //温度输入口sbit DIN=P0^7; //LED小数点控制uint h; uint temp;//////**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////*****************11us延时函数*************************///void delay(uint t){for (;t>0;t--);}///****************显示扫描函数***************************/scan(){ char k;for(k=0;k0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1位}DQ=1;delay(1);}///****************DS18B20读1字节函数************************///从总线上取1个字节uchar read_byte(void){uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}///****************读出温度函数************************///read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset(); delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的第字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp6348) // 温度值正负判断{tem=65536-tem;n=1;} // 负温度求补码,标志位置1display[4]=tem&0x0f; // 取小数部分的值display[0]=ditab[display[4]]; // 存入小数部分显示值display[4]=tem>>4; // 取中间八位,即整数部分的值display[3]=display[4]/100; // 取百位数据暂存display[1]=display[4]0; // 取后两位数据暂存display[2]=display[1]/10; // 取十位数据暂存display[1]=display[1]; /******************符号位显示判断**************************/if(!display[3]) {display[3]=0x0a; //最高位为0时不显示if(!display[2]){display[2]=0x0a; //次高位为0时不显示}}if(n){display[3]=0x0b;} //负温度时最高位显示"-"}/////****************主函数************************/main(){Disdata=0xff; //初始化端口discan=0xff;for(h=0;h<4;h ) //开机显示"0000"{display[h]=0;} ow_reset(); //开机先转换一次write_byte(0xcc); //Skip ROMwrite_byte(0x44); //发转换命令for(h=0;h<100;h ) //开机显示"0000"{scan();}while(1){work_temp(read_temp()); //处理温度数据scan(); //显示温度值}}////***********************结束**************************//可以使用mimICALL好用的软件

求用89C52单片机+DS18B20+LED灯结合的温度报警器,用keil编程c...

#include #define uchar unsigned char#define uint unsigned int sbit ds=P2^2; sbit dula=P2^6; sbit wela=P2^7; sbit beep=P2^3; uint temp; float f_temp; uint warn_11=270; uint warn_12=250; uint warn_h1=300; uint warn_h2=320; sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(uint z) //延时 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void dsreset(void) // DS18B20初始化 { uint i; ds=0; i=103; while(i>0) i--; ds=1; i=4; while(i>0) i--; } bit tempreadbit(void) //读一位数据函数 { uint i; bit dat; ds=0;i++; ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); } uchar tempread(void) //读一个字节函数 { uchar i,j,dat; dat=0; for(i=1;i { j=tempreadbit(); dat=(j>1); } return(dat); } void tempwritebyte(uchar dat) //写一个字节数据函数 { uint i; uchar j; bit testb; for(j=1;j { testb=dat&0x01; dat=dat>>1; if(testb) { ds=0; i++;i++; ds=1; i=8;while(i>0) i--; } else { ds=0; i=8;while(i>0) i--; ds=1; i++;i++; } } } void tempchange(void) //温度获取及转换 { dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0x44); } uint get_temp() { uchar a,b,templa; dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); b=tempread(); temp=b; temp temp=templa; f_temp=temp*0.0625; temp=f_temp*10+0.5; f_temp=f_temp+0.05; return temp; } void display(uchar num,uchar dat) { uchar i; dula=0; P0=table[dat]; dula=1; dula=0; wela=0; i=0xff; i=i&(~(0x01) P0=i; wela=1; wela=0; delay(1); } void dis_temp(uint t) { uchar i; i=t/100; display(0,i); i=t%100/10; display(1,i+10); i=t%100%10; display(2,i); } void warn(uint s,uint led) { uchar i;i=s; beep=0; P1=~(led); while(i--) { dis_temp(get_temp()); } beep=1; P1=0xff; i=s; while(i--) { dis_temp(get_temp()); } } void deal(uint t) { uchar i; if((t>warn_12)&&(t { warn(40,0x01); } else if(t { warn(10,0x03); } else if((t=warn_h1)) { warn(40,0x04); } else if(t>=warn_h2) { warn(10,0x0c); } else { i=40; while(i--) { dis_temp(get_temp()); } } } void init_com(void) { TMOD=0x20; PCON=0x00; SCON=0x50; TH1=0xfd; TL1=0xfd; TR1=1; } void comm(char*parr) { do { SBUF=*parr++; while(!TI); TI=0; } while(*parr); } void main() { uchar buff[4],i; dula=0; wela=0; init_com(); while(1) { tempchange(); for(i=10;i>0;i--) { dis_temp(get_temp()); } deal(temp); sprintf(buff,"%f",f_temp); for(i=10;i>0;i--) { dis_temp(get_temp()); } comm(buff); for(i=10;i>0;i--) { dis_temp(get_temp()); } } }

请问DS18B20和DS1820有什么区别

DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。

一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

DS18B20、 DS1822 “一线总线”数字化温度传感器 同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。

DS1822的精度较差为± 2°C 。

现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。

与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。

而且新一代产品更便宜,体积更小。

DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。

可选更小的封装方式,更宽的电压适用范围。

分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。

省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。

继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。

DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。

DS18B20的内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的管脚排列如下: DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。

64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。

DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。

第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。

第六、七、八个字节用于内部计算。

第九个字节是冗余检验字节。

该字节各位的意义如下: TM R1 R0 1 1 1 1 1 低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。

在DS18B20出厂时该位被设置为0,用户不要去改动。

R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位) 分辨率设置表: R1 R0 分辨率 温度最大转换时间 0 0 9位 93.75ms 0 1 10位 187.5ms 1 0 11位 375ms 1 1 12位 750ms 根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。

复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

DS1820使用中注意事项 DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题: (1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。

在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。

(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。

当单总线上所...

DS18B20温度传感器的特点有哪些呢?

晶振主要是你的读写数据的时序有关系,如果延时不够,数据不能读写,初始化就不能成功当然就做不出来了例如:void DS1302_writeB(unsigned char byte){unsigned char i;for(i=0;i {SCLK1302=0; //拉低时钟端if(byte&amp;0x01) //当前位是否是1{ DATA1302=1; //当前位是1,拉高数据端}else {DATA1302=0; //当前位是0,拉低数据端} delay_us(10); //调整时钟和脉冲宽度SCLK1302=1; //时钟上升沿(DS1302采样数据)byte&gt;&gt;=1; //数据右移1位,为送出新数据位做准备}}***********************************************************************delay_us(10); //调整时钟和脉冲宽度这个延时函数和晶振有关

上一篇:西安it软件外包公司 西安软件外包服务学院

下一篇:win10 64位摄像头软件 win7 64位摄像头软件