这个程序用数码管显示,为什么温度个位的值大于5就显示为0,十位的值大于1就显示为0,弄了好久没通明白问题出在哪里,请大家帮忙看看。
#include"reg52.h"#include"intrins.h"#include<math.h>sbit DQ=P1^3;#define uchar unsigned char#define uint unsigned intuchar flag,m[2];uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*------------reset-------------*/bit reset(){ uchar i; DQ=1;
_nop_();
DQ=0;
for(i=0;i<250;i++);
DQ=1;
for(i=0;i<15;i++);
flag=DQ;
for(i=0;i<100;i++);
return flag;}/*-----------写data------------*/void writedata(uchar dat)
//先写D0{ uchar tmp,i,j;
tmp=dat;
for(i=0;i<8;i++)
{
DQ=1;
//表示写周期开始。60~120us
for(j=0;j<3;j++);
DQ=0;
_nop_();
DQ=tmp&0x01;
for(j=0;j<10;j++);
DQ=1;
for(j=0;j<3;j++);
tmp>>=1;
}}/*-----------读data------------*/uchar readdata(){
uchar j,i,dat=0;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
dat>>=1;
_nop_();
_nop_();
DQ=1;
for(j=0;j<3;j++);
if(DQ)dat|=0x80;
for(j=0;j<3;j++);
}
return dat;}/*-----------初始化------------*/void init(){
reset();
while(flag);
writedata(0xcc); //只有一个DS18B20时可以直接跳过rom
writedata(0x4e); //往ram里写上,下限温度,后面要紧跟温度值
writedata(0x20);
writedata(0x00);
writedata(0x7f); //配置转换精度 12位
}
void delay1(){
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++);}/*-----------数码管显示------------*/void dis(){ uchar a,b,c,d,temph,templ;
uint tmp,k;
a=m[0];
b=m[1]; // float temp;
tmp=(b<<=8)|a;
k=tmp; //temp=(m[1]*256+m[0])*0.0625;
k&=0xf800;
if(k==0xf800)
{
tmp=~tmp;
tmp+=1;
}
temph=tmp>>4; //取出整数
templ=tmp&0x0f; //取出小数部分
a=temph/100;
b=temph%100/10;
c=temph%10;
d=templ*10/16;
if(k==0xf800)P0=0x40;
else P0=table[0];
P2=0;
delay1();
P0=table[a];
P2=1;
delay1();
P0=table
; P2=2; delay1();
P0=table[c]; P2=3; delay1(); P0=0x80; P2=4; delay1(); P0=table[d]; P2=5; delay1(); P0=0x39; P2=6; delay1(); }
void main(){ uchar i; init(); while(1) { reset(); writedata(0xcc); writedata(0x44); //温度转换命令 for(i=0;i<100;i++); reset(); writedata(0xcc); writedata(0xbe); for(i=0;i<2;i++) { m=readdata(); //读出来的温度缓冲区,先出低8位 } dis(); }}
此帖出自小平头技术问答
俺溜了一遍咋没见到700mS以上的延时呢
一周热门 更多>