18b20--c程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char

sbit dula=P2^6;
sbit wela=P2^7;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
// 0 1 2 3
0x66,0x6d,0x7d,0x07,
// 4 5 6 7
0x7f,0x6f,0x77,0x7c,
// 8 9 a b
0x39,0x5e,0x79,0x71,0x80};
// c d e f .
void display(
//uchar ,uchar ,uchar ,
uchar ,uchar ,uchar );
void delay_led(uint z);
void init_led();
void zhuanhuan();

uint aa;
uchar wei_1,wei_2,wei_3,v,wei_4,wei_5,wei_6;

uint shuju;//得到的温度值
uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值
uint value = 0;
sbit FWD=P1^1; //负温度显示指示
sbit DQ=P2^0; //数据线
sbit FM=P2^3; //控制蜂鸣器
void ReadSerialNumber(void);
uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8; //存放DS18B20的64位序列号

void ow_reset(void);
void tmstart (void);
void ReadSerialNumber(void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);

void baojing();

/*******主函数**********/
void main()
{
init_led();//初始化子程序
tmstart ();
delay_18B20(50); /*等待转换结束*/
while(1)
{
Read_Temperature();
delay_18B20(50);
tmstart();
delay_18B20(50); /*等待转换结束*/
zhuanhuan();
display(
//wei_1,wei_2,wei_3,
wei_4,wei_5,wei_6);

baojing();
}
}
/******转换************/
void zhuanhuan()
{
aa=shuju;
//wei_1=aa/100000;
//wei_2=aa/10000%10;
//wei_3=aa/1000%100%10;
wei_4=aa/100%1000%100%10;
wei_5=aa/10%10000%1000%100%10;
wei_6=aa/1%100000%10000%1000%100%10;
}

/******延时函数*********/
void delay_led(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******led初始化函数******/
void init_led()
{
wela=0;
dula=0; //一般位选和段选开始时要清零
}
/********显示函数*********/
void display(
//uchar wei_1,uchar wei_2,uchar wei_3,
uchar wei_4,uchar wei_5,uchar wei_6)
{
/* dula=1;
P0=table[wei_1];
dula=0;
wela=1;
P0=0xdf;
wela=0;
delay_led(1);//延时1秒

P0=0xdf;
dula=1;
P0=table[wei_2];
dula=0;
wela=1;
P0=0xef;
wela=0;
delay_led(1);

dula=1;
P0=table[wei_3];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delay_led(1); */

dula=1;
P0=table[wei_4];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay_led(1);

dula=1;
P0=table[wei_5]+0x80; //小数点显示+80H即可
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay_led(1);

dula=1;
P0=table[wei_6];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay_led(1);
}

//========18b20程序=================*/

void delay_18B20(uint seconds) //延时
{
for(;seconds>0;seconds--);
}

/******************************************
18b20程序
************************************

******/
//===============复位 ===========
void ow_reset(void)
{
uchar presence;
DQ = 0; //pull DQ line low
delay_18B20(44); //至少480微秒, leave it low for 501us
DQ = 1; // allow line to return high?
delay_18B20(3); // wait for presence18b20 36us
presence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy
//if(!presence)P1_0=0;
delay_18B20(12); // wait for end of timeslot
}

//=========从总线上读取一个字节========
uint read_byte(void)
{
uchar i;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
_nop_();_nop_();_nop_();_nop_();
DQ = 1; // then return high
if(DQ)
{
value|=0x80;
}
delay_18B20(4); // wait for rest of timeslot
}
return(value);
}

//===========向18B20写一个字节=================
void write_byte(char val)
{
uchar i,j;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
j++; /*延时4us*/
DQ = val&0x01;
delay_18B20(8); // hold value for remainder of timeslot
DQ = 1;
j++;
val>>=1;
}

}
//============读取温度============
void Read_Temperature(void)
{
int k,i;
int temple; /*存放读取的温度值 将其除以16即为得到的值*/
ow_reset();
k++; //延时4us
write_byte(0xCC); //Sk_nop_();ip ROM
k++; //延时4us
write_byte(0xBE); // read register
k++;k++; //延时8us
temp[0]=read_byte(); //读取低字节
temp[1]=read_byte(); //读取高字节
//if(!(temp[0]&0x80)) /*当低位寄存器第八位为0时*/
// {}
i=temp[1];
i<<=8; /*把b放到高八位上去*/
i|=temp[0]; /*将a放到底八位上去*/
i&=0x07ff;
if( (temp[1]&0x08))
{
temple=~i+1; //如果为负温则去除其补码
FWD=0; /*表示温度为负数*/
}
else
{
temple=i;
FWD=1; /*表示温度为正数*/
}
//temple=temp[1]*0x100+temp[0];
shuju=temple*10/16;

}
//以下是读取器件序列号的子程序,需要读取序列时可在程序中调用;
//调用时确保总线中只有一只器件,若有多个器件时则读取出来的号码无效;
//将读取出来的序列号填到前面的数组中即可使用;
//平时可以将此子程序删除以节约空间。
//////////////////////////读取器件序列号子程序////////////////////////////
void ReadSerialNumber(void)
{
ow_reset(); //复位
delay_18B20(1); //延时
write_byte(0x33); //发送读序列号子程序
sn1=read_byte(); //读取第一个序列号,应为1

6H;
sn2=read_byte(); //读取第二个序列号,应为10H;
sn3=read_byte(); //
sn4=read_byte(); //
sn5=read_byte(); //
sn6=read_byte(); //
sn7=read_byte(); //
sn8=read_byte();
}
//=======初始化============
void tmstart (void)
{
ow_reset(); //复位
delay_18B20(1); //延时
// ReadSerialNumber();
write_byte(0xCC); //跳过序列号命令,对所有器件有效
write_byte(0x44); //发转换命令 44H,
}
//========报警===========//
void baojing()
{
if(aa>=250)
FM=0;
else FM=1;
}


相关文档
最新文档