|
我設(shè)置的溫度超過60度LED等就會亮,溫度沒超過60度時,數(shù)碼管顯示溫度值正常,但是還是有一堆的看不懂的提醒定位是ds18b20好像有問題;然后溫度超過60度后,LED燈亮,但是數(shù)碼管不顯示溫度值,調(diào)節(jié)溫度傳感器也沒有反應(yīng),而且仍然有一堆的提醒ds18b20好像有問題,求解答謝謝。!
草圖1.png (457.99 KB, 下載次數(shù): 42)
下載附件
2019-3-23 22:50 上傳
草圖2.png (455.95 KB, 下載次數(shù): 52)
下載附件
2019-3-23 22:50 上傳
單片機源程序:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit du26=P2^6;//數(shù)碼管段選
sbit we27=P2^7;//數(shù)碼管位選
sbit DS=P2^2;//溫度傳感器
sbit led1=P3^7;//led
uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數(shù)碼管段表
uchar code smgwei[]={0xfe,0xfd,0xfb}; //1~3數(shù)碼管位表
uint sum,wendu;
uint tt,y;
void delay(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void we(uchar z) //位選
{
we27=0;
P0=z;
we27=1;
we27=0;
}
void du(uchar z) //段選
{
du26=0;
P0=z;
du26=1;
du26=0;
}
void display() //三個數(shù)碼管顯示
{
static uchar wei;
switch(wei)
{
case 0:we(smgwei[wei]);du(smgdu[wendu/100]);break;
case 1:we(smgwei[wei]);du(smgdu[wendu%100/10]|0x80);break;
case 2:we(smgwei[wei]);du(smgdu[wendu%10]);break;
}
wei++;
if(wei==3)
wei=0;
}
void timer0int() interrupt 1 //定時器,定時5ms
{
static uchar num;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
num++;
display();
if(num>=200) //延時1s顯示溫度數(shù)值
{
num=0;
y=1;
}
}
void delay_us(uchar us) //延時函數(shù)
{
while(us--);
}
//單總線初始化時序
bit ds_init()
{
bit i;
DS=1;
_nop_();
DS=0;
delay_us(75);//拉低總線499.45us,總線上的溫度傳感器將會被全部復(fù)位
DS=1;//釋放總線
delay_us(4);//延時37.95us,等待溫度傳感器發(fā)回存在信號
i=DS;
delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
DS=1;
_nop_();
return (i);
}
//寫一個字節(jié)
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
_nop_(); //產(chǎn)生寫時序
DS=dat&0x01;
delay_us(12);//延時76.95us
DS=1;//釋放總線準備下一次數(shù)據(jù)的寫入
_nop_();
dat>>=1;
}
}
//讀一個字節(jié)
uchar read_byte()
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
DS=0;
_nop_();//產(chǎn)生讀時序
DS=1;
_nop_();//釋放總線
j=DS;
delay_us(12);//76.95us
DS=1;
_nop_();
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void main()
{
uint i;
uchar L,M;
EA=1;
ET0=1;
TR0=1;
TMOD=0X01;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
while(1)
{
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
delay(50);
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0xbe);//讀取溫度傳感器暫存器的值
L=read_byte();
M=read_byte();
i=M;
i<<=8;
i|=L;
i=i*0.0625*10+0.5;//將讀出來的數(shù)據(jù)合并存到i中
if(y==1)
{
y=0;
wendu=i;
}
if(wendu>=600) //溫度超過60度,LED燈亮
led1=0;
else
led1=1;
}
}
|
|