完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
DS18B20分为高八位和低八位,高八位左移八位后||低八位 即为所得值,为小数
|
|
|
|
|
|
|
|
不需要左移8位,以下内容来源于《51单片机轻松入门 基于STC15W4K系列》,完整工程见附件
/单只DS18B20的温度检测,测温范围-55 —— +125度,1602液晶显示。 #include "STC15W4K.H" #include "DS18b20.h" #include "myfun.h" #include "LCD1602.h" bit flag; // flag=0表示正温,flag=1表示负温。 unsigned char baiw,shiw,gew; // 百位、十位、个位 ASCII码 unsigned char point_1,point_2,point_3,point_4; // 小数点后1、2、3、4位ASCII码 //****************温度数据处理函数************************/ void gettemp() //读取温度值 { unsigned int temp0,temp1,temp; // 存放小数、整数、符号,10000倍小数值 unsigned char temh,teml; // 存放原始高字节与低字节 temp=DS18B20_ReadTemperature(); // 从18B20中读取2字节原始温度值 flag=0; if ((temp&0xf800)!=0) // 如果是负温,将补码取反加1变为原码 { temp=~temp +1; flag=1; } temh=temp/256; // 高字节(5位符号+3位数据) teml=temp%256; // 低字节(4位整数+4位小数) temp0=teml&0x0F; // 4 位小数 temp1=(temh<<4)|(teml>>4); // 8 位整数(最高一位符号0不用管) baiw=temp1/100+48; // 百位ASCII码 shiw=(temp1%100)/10+48; // 十位 ASCII码 gew=(temp1%100)%10+48; // 个位 ASCII码 temp=temp0*625; // 将结果中的小数乘以分辨温度0.0625 // 扩大10000倍进行输出,不用浮点,同样可以保留4位小数精度 point_1=temp/1000+48; // 小数点后1位ASCII码 point_2=(temp%1000)/100+48; // 小数点后2位ASCII码 point_3=(temp%100)/10+48; // 小数点后3位ASCII码 point_4=temp%10+48; // 小数点后4位ASCII码 } void port_mode() // 端口模式 { P0M1=0x00; P0M0=0x001M1=0x00; P1M0=0x002M1=0x00; P2M0=0x003M1=0x00; P3M0=0x00; P4M1=0x00; P4M0=0x005M1=0x00; P5M0=0x006M1=0x00; P6M0=0x007M1=0x00; P7M0=0x00; } void main() { unsigned char xPos,yPos; unsigned char *s="Now temp is:"; port_mode(); // 所有IO口设为准双向弱上拉方式。 xPos=0; // xPos表示水平右移字符数(0-15) yPos=0; // yPos表示垂直下移字符数(0-1) delay100ms(); // 等待LCD1602上电时内部复位 LCD1602_Init(); WriteString(xPos,yPos,s); // X坐标、Y坐标、字符串,屏幕左上角为坐标原点 DS18B20_SetResolution(3); //设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置) while(1) { gettemp(); if(flag) // 负温度 { WriteChar(0,1,'-'); } if(!flag) // 正温度 { WriteChar(0,1,'+'); } WriteChar(1,1,baiw); WriteChar(2,1,shiw); WriteChar(3,1,gew); WriteChar(4,1,'.'); WriteChar(5,1,point_1); WriteChar(6,1,point_2); WriteChar(7,1,point_3); WriteChar(8,1,point_4); SetCur(NoCur); // 有显示无光标 } } |
|
|
|
不用这样麻烦,这个格式 直接就是 signed int 直接赋值就行
signed int ls; ls=(int)(temp_buff[1]*256+temp_buff[0]); ls *=10; ls /=16; ls 是 扩大10倍的温度 |
|
|
|
都是高手 新人前来学习
|
|
|
|
人家本身就是16位的,高八位左移加上第八位才能得到一个完整的
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8996 浏览 16 评论
4050 浏览 18 评论
1107浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1858浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 11:54 , Processed in 1.007878 second(s), Total 88, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号