看的眼都直了

2019-03-24 20:03发布

搞了个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);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
lalahu
2019-03-26 04:02
硬件上主意上拉电阻,软件主意管脚的是推挽还是开漏,特别注意软件那个延时的长短,可以用示波器观察一下,也许就差那么一点点。

一周热门 更多>