|
只是一个温度计程序,可是只能显示0-128度(图1),在0度以下就不能正常显示了(正95度显示图2 095.0度),比如负1度显示的是95度(如图3),要怎样修改啊??
下面是程序和仿真图
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //位定义ds引脚
sbit dula=P2^6 ;
sbit wela=P2^7 ;
uchar code table_du[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;//{0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; //
bit flag; //标志位
uint temp,num; //定义显示变量
//--------函数声明---------//
void delay(uint z);
void display(uint temp);
void delayus(uint t)//延时函数
{
while(t--) ;
}
void ds_reset()//复位函数
{
ds=1; //拉高总线
delayus(5); //延时约60us
ds=0; //拉低总线
delayus(80);//延时约700us
ds=1;
delayus(14);
if(ds==0)
flag=1; //标志位等于1表示18b20存在
else
flag=0; //标志位等于0表示18b20不存在
delayus(20);
}
//-------位读取-------//
bit ds_read_bit()
{
bit dat; //定义位变量dat
ds=0;
_nop_();
_nop_();
ds=1;
_nop_();
dat=ds;
delayus(10);
return dat;//返回变量dat;
}
//-------将读取到的位转换为字节---------//
uchar ds_read_byte()
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=ds_read_bit();
k=(j<<7)|(k>>1);
}
return k;
}
//-------写一个字节的函数-------//
void ds_write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
_nop_();
ds=dat&0x01; //保留最低位
delayus(6);
ds=1;
dat=dat>>1;
}
delayus(6);
}
//******读取温度的函数******//
uint read_temperature()
{
uchar a,b;
ds_reset();
ds_write_byte(0xcc); //跳过ROM
ds_write_byte(0xbe); //读温度
a=ds_read_byte(); // 读高八位
b=ds_read_byte(); // 读低八位
temp=b;
temp=temp<<8;
temp=temp|a ;
temp=temp*0.0625*10+0.5;//读出的数放大10倍取大于0.5的
return temp;
}
//---------主函数-------------//
void main()
{
while(1)
{
ds_reset();//复位
ds_write_byte(0xcc);//跳过ROM
ds_write_byte(0x44);//启动温度转换
// temp=256;
display(read_temperature( ));
display(temp);//
}
}
void delay(uint z)//延时函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
//*******显示****//
void display(uint temp) //显示
{ P1=table_du[temp/1000] ; // /100
dula=1;
dula=0;
delay(1);
P1=0xfe;
wela=1;
wela=0;
delay(1); // 百位
P1=0xff;
wela=1;
wela=0;
delay(5);
P1=table_du[temp/100%10]; // %100/10]|0x80
dula=1;
dula=0;
delay(1);
P1=0xfd;
wela=1;
wela=0;
delay(1); //
P1=0xff;
wela=1;
wela=0;
delay(5);
P1=table_du[temp%100/10]|0x80; //%100%10
dula=1;
dula=0;
delay(1);
P1=0xfb;
wela=1;
wela=0;
delay(1); //
P1=0xff;
wela=1;
wela=0;
delay(5);
P1=table_du[temp%100%10]; //%100%10
dula=1;
dula=0;
delay(1);
P1=0xf7;
wela=1;
wela=0;
delay(1); //
P1=0xff;
wela=1;
wela=0;
delay(5);
}
|
|