完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
先贴程序 楼下上图#include
#include typedef unsigned char uchar; typedef unsigned int uint; uchar tempL=0; //设全局变量 uchar tempH=0; uint z; //测量到的温度的整数部分 uchar p1; //小数第一位 uchar p2; //小数第二位 uchar p; //两位小数 bit flag=1; //温度正负标志 bit DS18B20_IS_OK = 1; uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //IO ***it c1=P2^0; ***it c2=P2^1; ***it en_139=P2^2; ***it DQ=P2^3;//ds18b20与单片机连接口 ***it en_573=P2^4; void delay0(uint z) { uint x,y; for(x=z;x>0;x--) for(y=80;y>0;y--); } void select(uchar i) { switch(i) { case 1:c1=0,c2=0;break; case 2:c1=1,c2=0;break; case 3:c1=0,c2=1;break; default:c1=1,c2=1;break; } } void display(uchar dat,uchar i) { select(i); P3=number[dat]; delay0(1); } void Delay(uint x) { while(--x); } /*void Init_DS18B20(void) { uchar x=0; DQ=1; //DQ先置高 delay0(8); //稍延时 DQ=0; //发送复位脉冲 delay0(80); //延时(>480us) DQ=1; //拉高数据线 delay0(5); //等待(15~60us) x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 delay0(20); }*/ uchar Init_DS18B20(void) { uchar status; DQ = 1; Delay(8); DQ = 0; Delay(90); DQ = 1; Delay(8); DQ = 1; return status; } //读一个字节 /*uchar ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号 { uchar i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期 uchar dat=0; for (i=8;i>0;i--) //一个字节有8位 { DQ=1; delay0(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay0(4); } return(dat); }*/ uchar ReadOneByte() { uchar i,dat=0; DQ = 1; _nop_(); for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; _nop_(); _nop_(); if(DQ) dat |= 0X80; Delay(30); DQ = 1; } return dat; } //写一个字节 /*void WriteOneChar(uchar dat) { uchar i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上, for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 { DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=dat&0x01; delay0(5); DQ=1; dat>>=1; } delay0(4); }*/ void WriteOneByte(uchar dat) { uchar i; for(i=0;i<8;i++) { DQ = 0; DQ = dat& 0x01; Delay(5); DQ = 1; dat >>= 1; } } //读温度值(低位放tempL;高位放tempH;) void ReadTemperature(void) { if(Init_DS18B20()==1) DS18B20_IS_OK=0; else { WriteOneByte(0xcc); WriteOneByte(0x44); Init_DS18B20(); WriteOneByte(0xcc); WriteOneByte(0xbe); tempL=ReadOneByte(); tempH=ReadOneByte(); DS18B20_IS_OK=1; if(tempH>0x7f) //最高位为1时温度是负 { tempL=~tempL; //补码转换,取反加一 tempH=~tempH+1; flag=0; //读取温度为负时flag=0 } //z=tempL/16+tempH*16; //整数部分 z=((tempL&0xf0)>>4)|((tempH&0x07)<<4); p1=(tempL&0x0f)*10/16; //小数第一位 p2=(tempL&0x0f)*100/16%10; //小数第二位 p=p1*10+p2; //小数两位 DS18B20_IS_OK=1; } } //显示函数 void display_0() { display(z/10,1); display(z%10,2); display(p1,3); display(p2,4); } void sys_init() { en_139=0; } void main() { sys_init(); ReadTemperature(); Delay(5000); Delay(5000); while(1) { if(DS18B20_IS_OK) display_0(); delay0(1); } } |
|
相关推荐
2个回答
|
|
|
|
|
|
谢谢版主 再仔细看看文档和时序
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2712 浏览 3 评论
4044 浏览 1 评论
4296 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
6011 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1166 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-22 00:13 , Processed in 0.575770 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号