完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uint unsigned int #define uchar unsigned char uchar code lednum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//数码管字0~9 uint temp; uchar g,s,b,q; //个十百千位 //uchar data disdata[5]; uint Tvalue; //温度值 uchar Tflag; //温度正负标志 ***it P34=P3^4; ***it P35=P3^5; ***it P36=P3^6; ***it DQ=P3^7;//ds18b20与单片机连接口 ***it P17=P1^7; ***it P24=P2^4; /*****************延时函数********************/ void delay(uint x) { uchar k; while(x--) for(k=0;k<200;k++) ; } /*****************数码管扫描********************/ void ledscan(void) { uchar k; for(k=0;k<150;k++) { //显示DS18B20 小数点一位,含负温度显示 P1=lednum[g];P2=0x0e;delay(1);P1=0x00; P1=lednum[s];P17=1;P2=0x0d;delay(1);P1=0x00; P1=lednum[b];P2=0x0b;delay(1);P1=0x00; P1=lednum[q];P2=0x07;delay(1);P1=0x00; } } /******************************DS18B20程序(定义开始)***************************************/ void delay_18B20(unsigned int i)//延时2微秒 { while(i--); } /*****************ds1820复位****************/ void DS18B20_RST() { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //延时 DQ = 0; //DQ拉低 delay_18B20(80); //精确延时大于480us DQ = 1; //拉高 delay_18B20(14); x=DQ; delay_18B20(20); } /*****************读数据*******************/ uchar DS18B20_RD() { unsigned char i=0; unsigned char R_data= 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 R_data>>=1; // DQ = 1; //给脉冲信号 if(DQ) R_data|=0x80; delay_18B20(4); } return(R_data); } /*******************写数据*******************/ void DS18B20_WR(uchar W_data) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = W_data&0x01; delay_18B20(5); DQ = 1; W_data>>=1; // } delay_18B20(4); } /****************读取温度值并转换***************/ read_temp() { uchar a,b; DS18B20_RST(); DS18B20_WR(0xcc); //*跳过读序列号*/ DS18B20_WR(0x44); //*启动温度转换*/ DS18B20_RST(); DS18B20_WR(0xcc); //*跳过读序列号*/ DS18B20_WR(0xbe); //*读取温度*/ a=DS18B20_RD(); b=DS18B20_RD(); Tvalue=b; Tvalue<<=8; // Tvalue=Tvalue|a; if(Tvalue<0x0fff) Tflag=0; else { Tvalue=~Tvalue+1; Tflag=1; } Tvalue=Tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(Tvalue); } /****************温度值显示***************/ void DS1820disp() { b=Tvalue/100%10;//十位数 s=Tvalue/10%10; //个位数 g=Tvalue%10; //小数位 if(Tflag==0) q=Tvalue/1000; //正温度不显示符号,显示百位数 else q=10;//负温度显示负号:- } /******************************DS18B20程序(定义结束)***************************************/ /*****************主函数********************/ void main() { while(1) { read_temp(); DS1820disp(); ledscan(); } } |
|
相关推荐
6个回答
|
|
查看ds18b20的手册,把返回的温度数据拆分成整数和小数部分,两部分分开计算,ds18b20能到125度,你现在的程序也只能到温度的十位数,看看手册,也找找例程,参考例程修改一下,既然能正确显示温度,那问题就是在数据转换上了
最佳答案
|
|
|
|
回帖奖励 +1 分积分
参数改一下就好了啊
|
|
|
|
1 0 0 2 9 2 5 0 9 4
|
|
|
|
|
|
|
|
我帮你改 加Q752810181
|
|
|
|
多次求平均值,然后显示的时候,把显示值和上一次值 求平均,这样就波动小!!!!!!!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11790 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 18:08 , Processed in 0.675838 second(s), Total 83, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号