




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/ds18b20模块/DS18B20是美国DALLAS半导体公司生产的可组网的一线式数字温度传感器,由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。以下是常见的DS18B20的测温程序,其正确性笔者已经通过仿真实验和实际电路验证过。在程序设计时,只要将ds18b20.c和主程序放在同一个工程中,且在主程序中包含头文件ds18b20.h即可。DS18B20头文件:ds18b20.h#ifndef _DS18B20_H_#define _DS18B20_H_void delay_18B20(unsigned int i);Init_DS18B20(void) ; ReadOneChar(void); WriteOneChar(unsigned char dat); ReadTemperature(void); #endif测温C程序:ds18b20.c#include sbit DQ = P10; /定义通信端口unsigned char sign;void delay_18B20(unsigned int i)while(i-);/初始化函数Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/读一个字节ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/写一个字节WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1;/读取温度ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned int t=0,temp=0;Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar();b=ReadOneChar();Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换/传感器返回值除16得实际温度值/为了得到2位小数位,先乘100,再除16,考虑整型数据长度,/技巧处理后先乘25,再除4,除4用右移实现temp=b&0xf0; if(temp=0xf0) sign=0x40; a=a; b=b; else sign=0x3f; b=b&0x0f;t = (b*256+a)*25/4;return(sign,t);/网上程序/就算是用软件的方式提高精度也只是虚拟的温度,18B20精度就是0.0625度,符合你的要求了,下面是我写的程序,有兴趣你可以参考一下。带报警设置#include #define uchar unsigned char#define uint unsigned intuchar code table= 0xc0,0xf9,0xa4,0xb0, /0,1,2,3共阳 0x99,0x92,0x82,0xf8, /4,5,6,7 0x80,0x90,0x88,0x83, /8,9,A,B 0xc6,0xa1,0x86,0x8e, /C,D,E,F 0xbf,0xff, ;sbit w1=P00;sbit w2=P01;sbit w3=P02;sbit w4=P03;sbit w5=P04;sbit w6=P05;sbit w7=P06;sbit w8=P07;sbit DQ=P37;/定义18B20数据线sbit beep=P36;/sbit beep=P30;bit sflag;/正负标志位uchar timecount;/中断次数变量uchar readdata2;/保存温度数值数组uchar ROM8;uchar ICROM28;uchar temperature22;/读两个18B20存放温度数组uchar test,test0,test1;/保存温度数值中间变量uchar yi,er,san,shi,wu,liu,qi,ba;/定义数码管显示数变量/*数码管扫描程序*/delayms(uint t)uchar tt;for(;t0;t-) for(tt=50;tt0;tt-);void display(uchar yi,uchar er,uchar san,uchar shi,uchar wu,uchar liu,uchar qi,uchar ba)w8=1; 2=tableyi;delayms(5);w8=0;delayms(1);w7=1; 2=tableer;delayms(5);w7=0;delayms(1);w6=1; 2=tablesan;delayms(5);w6=0;delayms(1);w5=1; 2=tableshi;delayms(5);w5=0;delayms(1);w4=1; 2=tablewu;delayms(5);w4=0;delayms(1);w3=1; 2=tableliu;delayms(5);w3=0;delayms(1);w2=1; 2=tableqi;delayms(5);w2=0;delayms(1);w1=1; 2=tableba;delayms(5);w1=0;delayms(1);/*/*18B20程序*/void delay18b20(uint i)for(;i0;i-);reset (void)/复位18B20uchar x=0;DQ=1;delay18b20(8);DQ=0;delay18b20(80);DQ=1;delay18b20(14);x=DQ;delay18b20(20);void writebyte_18b20(uchar command)/写字节到18B20uchar i=0;for(i=8;i0;i-)DQ=0; DQ=command&0x01; delay18b20(5); DQ=1; command=command1;uchar readbyte_18b20()/从18b20读出字节uchar i=0;uchar temp=0;for(i=8;i0;i-) DQ=0; temp=1; DQ=1; if(DQ) temp|=0x80; delay18b20(5);return(temp);/*/uchar readROM()/读18B20的ROMuchar i;reset();writebyte_18b20(0x33);for(i=0;i8;i+)ROM=readbyte_18b20();return(ROM);uchar writeROM()/匹配ROM并读出温度存到temperature22数组uchar i,j;for(j=0;j2;j+) reset(); writebyte_18b20(0x55); for(i=0;i255)/如果低八位的值转为原码后大于11111111(255),向高八位进1 readdata1+; test0=readdata0; test1=readdata1; test=(readdata1*256)+readdata0)/16;/把高位与低位的值转成10进制 test0=(test0&0x0f);/取小数位,低四位 switch (test0)/判断小数位的值,也可以用取表方式,精确度为0.0625度 case 0x00: liu=0;qi=6;break; case 0x01: liu=1;qi=2;break; case 0x02: liu=1;qi=8;break; case 0x03: liu=2;qi=5;break; case 0x04: liu=3;qi=1;break; case 0x05: liu=3;qi=7;break; case 0x06: liu=4;qi=3;break; case 0x07: liu=5;qi=0;break; case 0x08: liu=5;qi=6;break; case 0x09: liu=6;qi=2;break; case 0x0a: liu=6;qi=8;break; case 0x0b: liu=7;qi=5;break; case 0x0c: liu=8;qi=1;break; case 0x0d: liu=8;qi=7;break; case 0x0e: liu=9;qi=3;break; case 0x0f: liu=9;qi=9;break; er=test/100;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年风电场风力发电机组安装与定期检修服务合同范本
- 2025年战略咨询与并购整合服务合同书
- 2025年绿色建筑钢结构项目投资预算及全程施工监督合同
- 2025高端养老机构入住权益保障与个性化健康管理合同
- 2025年生态农业创新成果专利申请代理合同范本
- 2025年企业级IT培训课程推广与顾问服务合同范本
- 2025年生态环保型自建房装修材料采购与配送合同
- 2025年餐饮服务业员工劳动合同及离职补偿协议书
- 尾矿资源化与生态修复技术:2025年应用前景与挑战分析报告
- 旅游地产项目2025年乡村旅游规划与可持续发展研究分析报告
- 2025年公安局招聘警务辅助人员考试笔试试题(含答案)
- 工厂车间设备维修维护管理手册
- 开学食品安全知识培训课件
- 奶茶店安全知识培训课件
- 高中英语定语从句超全解析
- 肥胖儿童的运动干预 4
- 2025年秋招:数据分析师笔试真题及答案
- 2025年安徽省界首市辅警招聘考试试题题库及答案详解(新)
- 现浇梁劳务分包合同
- 人教版八年级下册英语单词表默写版(直接打印)
- Q∕GDW 12070-2020 配电网工程标准化设计图元规范
评论
0/150
提交评论