搞了个DS18B20,但无论怎么搞温度总是01℃!费了好大得劲!用KEIL仿真时提示有错误!但我看不出来是哪里!希望那个能有人能够答疑解惑!这里先谢谢了!
DQ是P2^5,RW我直接接地了,RS接的P2^0,E接P2^1,液晶屏用的是LM016L
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^5;
sbit lcdrs=P2^0;
sbit lcden=P2^1;
uchar code table[]="I MISS YOU!";
uchar code table1[]="0123456789";
uchar num;
void delay (uint t);
void writecom(uchar com);
void writedat(uchar dat);
void txreset ();
void readbyt();
void init ();
readtemp(void);
void delay1 (uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void main ()
{
uchar tp,tp1,tp2;
init();
writecom(0x80);
for(num=0;num<11;num++)
{
writedat(table[num]);
delay1(15);
}
while(1)
{
tp=readtemp();
tp1=tp%10;
tp2=tp/10;
writecom(0x80+0x41);
writedat(table1[tp2]);
writecom(0x80+0x42);
writedat(table1[tp1]);
writecom(0x80+0x43);
writedat(0xdf);
writecom(0x80+0x44);
writedat('C');
}
}
/* 延时t毫秒 */
void delay (uint t)
{
while(t--);
}
/*初始化程序*/
void txreset ()
{
uchar h;
DQ=1; //首先主控为高电平
delay(4); //保持一会,无所谓!
DQ=0; //初始化开始,主控拉低电平
delay (80); //延时400~960us
DQ=1; //主控拉高电平
delay(14); //再延时到DS18B20应答拉低电平位置
h=DQ; //判x状态,如果是低电平则DS18B20已经应答
delay(20); //随意延时,等待写ROM
}
/*读一个字节*/
void readbyt()
{
uchar i=0; //定义变量用于循环读取8位RAM数据
uchar dat2=0; //定义dat用于按位存储8位RAM数据
for(i=8;i>0;i--) //循环读8位数据
{
DQ=0; //DQ置一次低电平
dat2=(dat2>>1); //dat向右移位1
DQ=1; //1us后DQ置一次高电平
if(DQ==1) //如果DQ等于1,则把1写进dat中
{
dat2=dat2|0x80; //右移移位后最高位与1000 0000相与
}
delay(4); //两次读字节之间时间间隙
}
}
/*写一个字节*/
void writebyt(uchar dat1) //设置写字节入口参数
{
uchar i=0; //定义循环变量
for(i=8;0>0;i--) //循环
{
DQ=0;
delay(1); //DQ置低电平大于1us
DQ=dat1&0x01; //输出低位(最低位与0000 0001相或)
delay(5);
dat1=dat1>>1; ////dat向右移位1
DQ=1;
}
delay(4);
}
/*初始化和读取温度值*/
readtemp(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
txreset ();
writebyt(0xcc);
writebyt(0x44);
txreset ();
writebyt(0xcc);
writebyt(0xbe);
a=readbyt();
b=readbyt();
t=(b>>4)||(a<<4);
if(t>128)
{
t=~t+1;
}
return(t);
}
/*LCD显示部分*/
/*lcd写指令*/
void writecom(uchar com)
{
lcdrs=0;
P0=com;
delay1(15);
lcden=1;
delay1(15);
lcden=0;
}
void writedat(uchar dat)
{
lcdrs=1;
delay1(15);
P0=dat;
lcden=1;
delay1(15);
lcden=0;
}
void init ()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
writecom(0x80+0X04);
writecom(0x80+0X40);
}
此帖出自
小平头技术问答
我以前做过,但那个程序现在找不到了,你可以在网上找现成的,对对时序。可以单步调试看看。
一周热门 更多>