51单片机和DS18B20做温度检测

2019-03-24 20:09发布

 这个图可以做出温度检测的效果吗?我想用一个c51和4个DS18B20做一个多点温度检测系统。有没有哪位高手可以帮我编下程,或者谁有原理图和源程序都发我考下。我QQ104314787.谢谢了

[ 本帖最后由 happy104314787 于 2010-10-11 22:24 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
happy104314787
2019-03-25 05:09
4.3.2采集程序
主要程序代码及其说明(见注释语句)如下:
uchar tplsb,tpmsb;                                        //温度值低位、高位字节
sbit DQ=P0^0;                                                //数据通信线
/*延时t毫秒*/
void delay(uint t)
{
uint i ;
while (t--)
     {
/*对于11.0592Hz时钟,约延时1毫秒*/
for (i=0;i<125;i++)
{}
}
}

/*产生复位脉冲,初始化DS18B20*/
void Txreset (void)
{
     uint i ;
DQ =0;
/*拉低约900μs*/
i=100;
while(i>0)i--;
     DQ =1 ;                                                                //产生上升沿
i=4 ;
    while (i>0) i--;
}

/*等待应答脉冲*/
void RxWait (void)
{
     uint i ;
     while (DQ) ;
     while (~DQ) ;                                                        //检测到应答脉冲
i =4 ;
     while (i>0) i-- ;
}
/*读取数据的一位,满足读时序要求*/
bit RdBit (void)
{
uint i ;
     bit b ;
DQ=0;
i++;                              //保持低至1us
     DQ=1;
i++;  i++;                      //延时15us以上,读时序下降沿后15us,DS18B20输出数据才有效
    b=DQ;
    i=8;
    while(i>0)  i--;                    //读时隙不低于60us
    return(b);
}
/*读取数据的一个字节*/
uchar RdByte(void)
{
uchar i,j,b;
     b=0;
for (i=1;I<=8;i++)
{
j=RdBit();
b=(j<<7)|(b>>1);
}
     return(b);
}
/*写数据的一个字节,满足写”1”和写”0”的设计要求*/
void WrByte (uchar b)
{
uint i ;
     uchar j ;
     bit btmp ;
     for (j=1;j<=8;j++)
      {
        btmp =b&0x01;
        b=b>>1;                                                                //取下一位(由低位向高位)
        if (btmp)
        {
/*写1*/
          DQ=0;
           i++;i++;                                                   //延时,使得15us以内拉高
           DQ=1;
           i=8;
          while (i>0) i--;                                              //整个写1时序不低于60us
}
else
{

/*写0*/
DQ=0;
i=8;
         while (i>0) i--;                                //保持低电平在60us到120us之间
         DQ=1;
         i++;
i++;
}
}
}
/*启动温度转换*/
void convert (void)
{
      TxTeset ();                                                          //产生复位脉冲,初始化DS18B20
      RxWait ();                                                          //等待DS18B20给出应答脉冲
delay (1);                                                          //延时
      WrByte (0xcc);                                                  //skip rom命令
      WrByte (0x44);                                                  //convert T 命令
}
/*读取温度值*/
void Rdtemp (void)
{
      TxReset ();                                                          //产生复位脉冲,初始化DS18B20
      RxWait ();                                                          //等待DS18B20给出应答脉冲
      delay (1);                                                          //延时
      WrByte (0xcc);                                                  //skip rom 命令
      WrByte (0xbe);                                                  //read scratchpad 命令
      tplsb=RdByte ();        //温度值低位字节(其中低4位为二进制的”小数”部分)
      tpmsb=RdByte();                                                       
}
/*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。tplsb其中低4位为二进制的”小数”部分;tpmsb其中高5位为符号位;真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分)的转换*/
void main (void)
{
do
      {
delay (1);                                                          //延时1ms
convert ();                                                          //启动温度转换,需要750ms
delay (1000);                                                  //延时1s
RdTemp ();                                                  //读取温度
}
while (1);
}















4.4温度显示程序的设计
4.4.1程序流程图
温度显示程序流程图如图4.5所示。






















图4.5 LED显示流程图
4.4.2显示程序
void display(unsigned char *lp)         //显示
{
          unsigned char i;                             //定义变量
          P3=0;                        //LED段选共阴极送1点亮某段
          P1=0;                        //LED位选共阴极送0选中某位
          P3=0xfe;                  //先用1111,1110显示第一位
          P1=table[lp[0]];
          delay();                                          //延时5个空指令
          P1=0;
          P3=0xfd;                      //1111,1101显示第二位
          P1=table[lp[1]];
          delay();                                         //延时5个空指令       
          P1=0;
          P3=0xfb;                      //1111,1011显示第三位
          P1=table[lp[2]]|0x80;
          delay();                                         //延时5个空指令       
          P1=0;
          P3=0xf7;                      //1111,0111显示第四位
          P1=table[lp[3]];
P1=P1;                        //发光二极管,用来显示小数点后一位的数字段,送0点亮,所以不亮的灯就是段码
          delay();                                          //延时5个空指令
          P2=1;       







这个是那份资料里面的程序。我觉得它很乱。应该是错的。请大侠指正修改吧

一周热门 更多>