protues DS18B20仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}