自己按摩卵巢的手法:DS18B20 完整的c51程序有吗 包括正个测试运行过程

来源:百度文库 编辑:中科新闻网 时间:2024/04/28 21:37:03
对于延时请说明晶振的频率 以及如何在程序中避免死循环

/*DS18b20温度传感器

p3.4作为数据传输口
p1.0~3控制显示led的位选 共阳极 经过PNP后 低电平有效
p0口是led的字形码
晶振:11.0592M
设计者:陈仲库
设计日期:2006年3月29日
*/
#include<reg51.H>
//#include<math.h>
//#include<stdio.h>
//#include <ctype.h>

sbit DQ= P3^4;
sbit p13= P1^3;
sbit p12= P1^2;
sbit p11= P1^1;
sbit p10= P1^0;
int flag;
unsigned char disp1, disp2,disp3,disp0;
unsigned char code ch[]={0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,0x80,0x90}; /*0~9*/

void delay(int us) { int s; for ( s=0; s<us; s++);}

void disp()
{
P0 = 0xff;
P0 = disp3;
p13=0;
delay(150);
p13=1;

P0 = 0xff;
P0= disp2;
p12=0;
delay(150);
p12=1;

P0 = 0xff;
P0 = disp1;
p11=0;
delay(150);
p11=1;

P0 = 0xff;
P0 = disp0;
p10=0;
delay(150);
p10=1;
}

void rst(void)
{
DQ = 1;
delay(2);
DQ = 0;
delay(30); //精确延时 480~960us
DQ = 1;
delay(8);
}

unsigned int read(void)
{
int i=0;
unsigned int u=0;
for (i=0;i<16;i++)
{
DQ=0;
u>>=1;
DQ=1;
if(DQ) u|=0x8000;
delay(4);
}
return (u);
}

void write(unsigned char ku)
{
int i=0;
for (i=0;i<8;i++)
{
DQ=0;
DQ =ku&0x01;
delay(3);
DQ=1;
ku>>=1;
}
}

void read0(void)
{
int t1,t2, t0;
unsigned int tp;
unsigned int lsb;
rst();
write(0xCC);
write(0x44);
rst();
write(0xCC);
write(0xBE);
tp=read();

lsb=(unsigned int)(tp*6.25); //
t0=lsb/1000;
disp0 = ch[t0]; //第1位,最高位p1.2
if(!t0) disp0 = 0xff;
t2= lsb%1000;
t1=t2/100;
disp1= ch[t1]&0x7f;
t1=t2%100;
t2=t1/10;
disp2=ch[t2]; //第3位,最低位p1.2
disp3=ch[t1%10];//第4位,最低位p1.3

}

void main(void)
{
while(1)
{
read0();
disp();
}
}

如需kuzi00@163.com