?? 1820.c
字號:
/*--------------------------------------------------------------------------
DS18B20,數碼管顯示,顯示格式為:零上:100.00°C
零下:-10.00°C
若不DS18B20檢測不到,蜂鳴器報警,晶振是11.0592M
----------------------------------------------------------------------------*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^4;//ds18b20 IO口
sbit beep=P2^6;//
sbit aa=P2^0; //74hc138
sbit bb=P2^1;
sbit cc=P2^2;
sbit LE1=P2^7;
uchar flag,flag1,pre;
uchar ds18b20_reset();
uchar read_byte();
void write_byte(uchar );
void read_tempt();
void display();
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x63,0x40,0x80,0x00};
//c o - 、
uchar data tempt_data[2]; //溫度暫存 內部RAM低128字節
uchar data ddata[6]; //顯示暫存 內部RAM低128字節
void delay_50us(uint t) //12M,延時50us
{
while( --t );
}
void init() //初始化
{
P0=0xff;
P2=0xff;
flag=0;
flag1=0;
LE1=0;
}
void main() //主函數
{
init();
while(1)
{
read_tempt();
if(flag1==0)
{
display();
}
else
{
P0=0x00;
}
}
}
uchar ds18b20_reset() // ds18b20 復位
{
uchar pre;
DQ=1; //增加穩定性
delay_50us(1);
DQ=0;
delay_50us(90); //
DQ=1;
delay_50us(8);
pre=DQ;
delay_50us(100);
DQ=1;
return(pre);
}
uchar read_byte() //讀ds18b20一個字節
{
uchar i;
uchar data_t=0;
for(i=8;i>0;i--)
{
DQ=0;
data_t>>=1;
_nop_();
DQ=1;
if(DQ)
data_t|=0x80;
delay_50us(4);
}
return(data_t);
}
void write_byte(uchar dat) //向ds18b20 寫一個字節
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
_nop_(); //使其時隙大于1us小于15us
delay_50us(5);
DQ=1;
dat>>=1;
}
}
void read_tempt() //讀ds18b20 的溫度值,把它放到內部RAM低128字節種
{
uchar i;
if(pre==1) //ds18b20不響應,蜂鳴器報警
{
for(i=10;i>0;i--)
{
beep=~beep;
delay_50us(5);
}
flag1=1;
beep=1;
}
else
{
ds18b20_reset();
write_byte(0xcc);
write_byte(0x44);
ds18b20_reset();
write_byte(0xcc);
write_byte(0xbe);
for(i=0;i<2;i++)
{
tempt_data[i]=read_byte();
}
ds18b20_reset();
}
}
void display() //數碼管顯示
{
uchar temp,temp_1;
temp=tempt_data[1]&0xf0;
if(temp==0xf0) //溫度是否小于零
{
flag=1;
if(tempt_data[0]==0) //LSB是否向MSB進位,若進位,則高8位和低8位都取反加一
{
tempt_data[0]=~tempt_data[0]+1;
tempt_data[1]=~tempt_data[1]+1;
}
else //沒有進位,則高8位取反,低8位取反加一
{
tempt_data[0]=~tempt_data[0]+1;
tempt_data[1]=~tempt_data[1];
}
}
temp=((tempt_data[0]&0xf0)>>4)|((tempt_data[1]&0x0f)<<4);
ddata[1]=temp/100;
ddata[2]=temp%100/10;
ddata[3]=temp%100%10;
temp_1=tempt_data[0]&0x0f;
ddata[0]=(temp_1*0.0625)*10000;
ddata[4]=ddata[0]/1000;
ddata[5]=ddata[0]%1000/100;
if(flag==1) //判斷溫度是否小于零
{
if(!ddata[1]) //若十位等于 零,十位顯示"-",百位關閉顯示
{
ddata[1]=0x0e;
if(!ddata[2]) //判斷十位是否為零
ddata[2]=0x0c;
}
}
else //溫度大于零時
{
if(!ddata[1]) //判斷百位是否為零
{
ddata[1]=0x0e; //百位為零,關閉百位顯示
if(!ddata[2]) //判斷十位是否為零
ddata[2]=0x0e; //十位為零,關閉十位顯示
}
}
//數碼管顯示
LE1=1;
delay_50us(20);
aa=0;
bb=0;
cc=0;
P0=table[ddata[1]];
delay_50us(200);
aa=1;
bb=0;
cc=0;
P0=table[ddata[2]];
delay_50us(200);
aa=0;
bb=1;
cc=0;
P0=table[ddata[3]];
delay_50us(200);
aa=0;
bb=1;
cc=0;
P0=table[0x0d];
delay_50us(200);
aa=1;
bb=1;
cc=0;
P0=table[ddata[4]];
delay_50us(200);
aa=0;
bb=0;
cc=1;
P0=table[ddata[5]];
delay_50us(200);
aa=1;
bb=0;
cc=1;
P0=table[0x0b];
delay_50us(200);
aa=0;
bb=1;
cc=1;
P0=table[0x0a];
delay_50us(200);
LE1=0;
P0=0x00;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -