|
只是一個溫度計程序,可是只能顯示0-128度(圖1),在0度以下就不能正常顯示了(正95度顯示圖2 095.0度),比如負1度顯示的是95度(如圖3),要怎樣修改啊??
下面是程序和仿真圖
QQ截圖20141125143946.jpg (765.94 KB, 下載次數: 176)
下載附件
2014-11-25 14:39 上傳
QQ截圖20141125143334.jpg (628.15 KB, 下載次數: 164)
下載附件
2014-11-25 14:40 上傳
QQ截圖20141125143421.jpg (657.95 KB, 下載次數: 173)
下載附件
2014-11-25 14:40 上傳
#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);
}
|
|