protues DS18B20仿真

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

程序代码

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define nops(); {_nop_();_nop_();_nop_();_nop_();} sbit DQ=P3^0;

uchar code led []=

{ 0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar code leddg []=

{ 0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87,

0xff,0xef,0xf7,0xfc

} ;

void display (double x);

void delayms(uint z);

void delay1(uint z);

uint ds18b20();

uchar reset18b20();

void main ()

{

double a;

while(1)

{

a=ds18b20();

display(a);

}

}

/////////////////////////////////////////////////////

void delayms(uint z) //延时函数{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

///////////////////////////////

void delay1(uint z)

{

while(--z);

}

/////////////////////////////////////////////////

void display (double x) //显示函数

{ uint a,b,d,e;

int c;

double g,h;

if (x<=128)

{ c=(int)x;//45 10.12

a=c/100; //提取个位,百位

b=c%100/10;

d=c%100%10;

g=x-c;//0.119999 有误差

/* if((((int)(g*100)+1)-g*100)<=0.0001 ) //判断下消除误差g=g+0.01;

d=(int)(g*10);

h=10*g-d;

e=(int)(h*10);

*/

e=(int)(10*g);

P2=0xfe;

P0=led[a];

delayms(10);

P2=0xfd;

P0=led[b];

delayms(10);

P2=0xfb;

P0=leddg[d];

delayms(10);

P2=0xf7;

P0=led[e];

delayms(10);

}

else

{

c=(int)(256-x);

b=c/10;

d=c%10;

e=0;

P2=0xfe;

P0=0x40;

delayms(10);

P2=0xfd;

P0=led[b];

delayms(10);

P2=0xfb;

P0=leddg[d];

delayms(10);

P2=0xf7;

P0=led[e];

delayms(10);

}

}

////////////////////////////////////////////////////

uchar reset18b20() //复位18B20

{

uchar a;

DQ=1;

_nop_();

_nop_();

DQ=0;

delay1(80);

DQ=1;

nops();

a=DQ;

delay1(20);

return a ;

}

////////////////////////////////////////

void write (uchar dat) //向18B20里写

{

uchar i;

DQ=1;

_nop_();

for(i=0;i<8;i++)

{

DQ=0;

DQ=dat&0x01;

delay1(51);

DQ=1;

dat>>=1;

}

}

/////////////////////////////////////

uchar read() //读取18b20

{

uchar i,dat=0;

DQ=1;

_nop_();

for(i=0;i<8;i++)

{

DQ=0;

nops();

dat>>=1;

DQ=1;

nops();

if(DQ)

{

dat|=0x80;

}

delay1(30);

DQ=1;

}

return dat;

}

/////////////////////////////////////////////

uint ds18b20() //启动18B20温度传感器

{

uint a,b;

reset18b20();

write(0xcc); //跳过ID地址

write(0x44); //启动温度转换

reset18b20();

write(0xcc);

write(0xbe); //读取温度

a=read();

b=read();

b=b&0x0f;

b<<=4;

b+=(a&0xf0)>>4 ; //取出A的低4位在和B相加刚好B中存的温度的高低值return b;

}

相关文档
最新文档