DS18B20测温度在数码管显示不出来

[复制链接]
2175|13
 楼主| 周炎33 发表于 2014-7-23 14:28 | 显示全部楼层 |阅读模式
新手学习51单片机,虽然编译没问题,可是烧到板子里没反应,不知道是哪里出了问题,求指教  #include<reg51.h>
   #include<math.h>
   #include<intrins.h>



        unsigned char code tab[]={0x3f,0x06,0x5b,
   0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39
   ,0x5e,0x79,0x71,0x00,0x40};
   sbit DQ=P3^3;
   

   unsigned char dat;
   unsigned char tempL=0;
           unsigned char tempH=0;
        float temperature;

   



void delay(unsigned int count){
unsigned int i;
i=0;
while(i<count){
i++;

}return;
}


void delay1(void){
int k;
for(k=0;k<400;k++);
}




void display(int k){
P2=0xfe;
P0=tab[k/1000];
delay1();
P2=0xfd;
P0=tab[k%1000/100];
delay1();
P2=0xfb;
P0=tab[k%100/10];
delay1();
P2=0xf7;
P0=tab[k%10];
delay1();
P2=0xff;}


void init(){
unsigned char x=0;
DQ=1;
delay(8);
DQ=0;
delay(85);
DQ=1;
delay(14);
}


unsigned char readone(){
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--){
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ){
dat|=0x80;
delay(4);
}
}return(dat);
}

void  writeone(unsigned char dat){
unsigned char i=0;
for(i=8;i>0;i--){
DQ=0;DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);}


readtem(void){
init();
writeone(0xcc);
writeone(0x44);
delay(125);
init();
writeone(0xcc);
writeone(0xbe);
tempL=readone();
tempH=readone();
temperature=((tempH*256)+tempL)*0.0625;
delay(200);
return(temperature);

}


void main(){
float i;
while(1){
i=readtemperature();
display(i);}}
ayb_ice 发表于 2014-7-23 15:57 | 显示全部楼层
编译没有错只能说明基本语法没有错而已

wangch_sh 发表于 2014-7-23 16:03 | 显示全部楼层
又是时序问题。
ayb_ice 发表于 2014-7-23 16:57 | 显示全部楼层
这种总线读一次数据需要很长时间,
读数据与显示都在主循环完成,肯定显示闪烁的,

显示必须置于定时中断中完成
qq4988 发表于 2014-7-23 17:03 | 显示全部楼层
对,放在定时器中断中进行显示
ZG11211 发表于 2014-7-23 20:30 | 显示全部楼层
等待温度转换完成的时间是否足够?请仔细看18B20的资料。
xg3469 发表于 2014-7-23 21:17 | 显示全部楼层
根据晶体振荡器的频率调整延时程序。
zyt2014 发表于 2014-7-26 08:53 | 显示全部楼层
我觉得时序有点问题,当初我写温度传感的时候也搞了很久。。
显示程序最好改一下。
liu1004010308 发表于 2014-8-3 21:16 | 显示全部楼层
wenku.baidu.com/view/55976e0a03d8ce2f00662323.html[/url]你参考下第九十例
lichenglei99 发表于 2014-8-4 23:02 | 显示全部楼层
多试试。
灯火阑珊处 发表于 2014-8-5 09:19 | 显示全部楼层
18b20确实不容易啊,找个例程好好看看
ningling_21 发表于 2014-8-5 09:59 | 显示全部楼层
灯火阑珊处 发表于 2014-8-5 09:19
18b20确实不容易啊,找个例程好好看看



可以参考这个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
junle 发表于 2014-8-5 14:27 | 显示全部楼层
temperature最好定义成unsigned float形式
你定义的变量尽量都是unsigned形式如果你没有测试零度以下的话
还有看看DS18b20的datasheet比较好!
longmaodo 发表于 2014-8-5 15:45 | 显示全部楼层
看看你的DS18B20程序吧  你这时间有点不对  
记得我调试的时候第一次初始化后需要很长时间才能回来值  得几十到一百MS
手册中好像有说 你这延时有点短呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部