完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
`/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst() //ds1820复位 { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd() //读数据 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata) //写数据 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp() //读取温度值并转换 { uchar a,b; ds1820rst(); ds1820wr(0xcc); //跳过读序列号 ds1820wr(0x44); //启动温度转换 ds1820rst(); ds1820wr(0xcc); //跳过读序列号 ds1820wr(0xbe);//读取温度 a=ds1820rd(); b=ds1820rd(); 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 ds1820 disp() //温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30; //百位数 disdata[1]=tvalue%1000/100+0x30; //十位数 disdata[2]=tvalue%100/10+0x30; //个位数 disdata[3]=tvalue%10+0x30; //小数位 if(tflag==0) flagdat=0x20; //正温度不显示符号 else flagdat=0x2d; //负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20; //如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20; //如果百位为0,十位为0也不显示 } } write_add(0x80+0x40+8); write_date(flagdat); //显示符号位 write_add(0x80+0x40+9); write_date(disdata[0]); //显示百位 write_add(0x80+0x40+10); write_date(disdata[1]); //显示十位 write_add(0x80+0x40+11); write_date(disdata[2]); //显示个位 write_add(0x80+0x40+12); write_date(0x2e); //显示小数点 write_add(0x80+0x40+13); write_date(disdata[3]); //显示小数位 write_add(0x80+0x40+14); write_date(0xdf); //显示"。" write_add(0x80+0x40+15); write_date(0x63); //显示"c" } void init_info(void) { write_add(0x80+0x00+0); for(i=0;i<14;i++) { write_date(stuinfo1[i]); delay(5); } write_add(0x80+0x40+0); for(i=0;i<14;i++) { write_date(stuinfo2[i]); delay(5); } } ` |
|
相关推荐
12个回答
|
|
|
|
|
|
回帖奖励 +10 分积分
复位主机拉低的时间太短了
|
|
|
|
时序错误,你可以试一下这个程序
晶振22.1184M,,,如果你的晶振是11M的话就把延时都除以2 /************************************************/ //延时函数 /************************************************/ void delay(unsigned int k) { while(k--); } /************************************************/ //复位 /************************************************/ void DS18B20_res(void) { DQ=1; delay(1); DQ=0; delay(660); DQ=1; while(DQ); delay(660); DQ=1; } /************************************************/ //读一个字节 /************************************************/ ReadOneChar(void) { unsigned char i,dat; DQ=1; delay(1); for(i=8;i>0;i--) { DQ=0; delay(1); DQ=1; dat>>=1; delay(11); if(DQ) dat|=0x80; delay(68); DQ=1; delay(1); } return(dat); } /************************************************/ //写一个字节 /************************************************/ void WriteOneChar(unsigned char dat) { unsigned int a=0; for(a=8;a>0;a--) { DQ=0; DQ=dat&0x01; delay(74); DQ=1; dat>>=1; delay(1); } delay(65); } 评分 |
|
|
|
正在学习中.......................
|
|
|
|
|
|
|
|
仿真时也能成功,在基本模块上测试也能正常显示,我们的程序应该没什么错误,用的是11M的晶振 |
|
|
|
|
|
|
|
你看我附带的那张图在1602上温度显示的是0.0℃,但是硬件电路什么的应该怎么处理? |
|
|
|
楼主用示波器看看,
|
|
|
|
另外,楼主研究过你的延迟函数没有,准确吗?这玩意对时序要求也满高的
|
|
|
|
受益了,一直调试不出来,还以为是硬件问题. |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
489 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
498 浏览 0 评论
655 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1329 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
558 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11753 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 23:17 , Processed in 0.897635 second(s), Total 95, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号