微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于DS18B20和串口通信的问题,跪求各位大大帮忙,谢谢了!

关于DS18B20和串口通信的问题,跪求各位大大帮忙,谢谢了!

时间:10-02 整理:3721RD 点击:
我是一名单片机新手。前几天我做了一个DS18B20的温度计,晶振是11.0952,通过上位机显示,但一直显示得是这个

,不知道该怎么下手整改好,我觉得可能是时序不对了,于是我采用查询法还是不行,有哪位写过这个的能给我参考下吗?
主程序是:
#include "reg52.h"
#include "ds18b20.h"
unsigned int tflag;
bit secflag = 0;
unsigned char text[] = "Temperature = ";
unsigned char enter[] = {0x0A,0x0D};    //回车符
void uart_tx(unsigned char *p,unsigned char length);
char dat(char a);
void main(void)
{
  unsigned char temp;
  SCON = 0x50;
  TMOD = 0x22;
  TH1 = 0xFD;
  TL1 = 0xFD;
  TH0 = 0x06;
  TL0 = 0x06;
  EA = 1;
  ET0 = 1;
  TR0 = 1;
  TR1 = 1;
  while(1)
  {
        if(secflag == 1)
        {
          secflag = 0;
          uart_tx(text,14);
          
          temp = rd_temperature();
          if(temp>99)
          {
                  SBUF = temp/100 + 0x30;
                  while(TI == 0);
                  TI = 0;
          }
          if(temp>9)
          {
                  SBUF = temp%100/10 + 0x30;
                  while(TI == 0);
                  TI = 0;
          }
          SBUF = temp%100%10 + 0x30;
          while(TI == 0);
          TI = 0;
          uart_tx(enter,2);
        }        
  }
}
//定时器TO中断服务函数
void isr_t0(void) interrupt 1
{
  tflag++;
  if(tflag == 4000)
  {
    tflag = 0;
        secflag = 1;
  }
}
//串口传输函数
void uart_tx(unsigned char *p,unsigned char length)
{
  unsigned char i;
  for(i=0;i<length;i++)
  {
        SBUF = *(p+i);
        while(TI == 0);
        TI = 0;
  }
}
ds18b20的程序是:
#include "ds18b20.h"
//延时函数
void delay(unsigned int t)
{
  while(t--);
}
//DS18B20初始化函数
bit init_ds18b20(void)
{
  bit initflag = 0;
  DQ = 1;
  delay(8);
  DQ = 0;
  delay(80); // 延时大于480us
  DQ = 1;
  delay(14);  // 14
  initflag = DQ;     // initflag等于1初始化失败
  delay(20);
  return initflag;
}
//通过单总线向从器件写一个字节
void wr_ds18b20(unsigned char byt)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    DQ = 0;
    DQ = byt&0x01;
    delay(5);
    DQ = 1;
    byt >>= 1;
  }
  delay(5);
}
//通过单总线从从器件读一个字节
unsigned char rd_ds18b20(void)
{
  unsigned char i;
  unsigned char byt;
  for(i=0;i<8;i++)
  {
    DQ = 0;
    byt >>= 1;
    DQ = 1;
    if(DQ)
    {
      byt |= 0x80;
    }   
    delay(5);
  }
  return byt;
}
//温度转换、读取及数据处理器函数
unsigned char rd_temperature(void)
{
  unsigned char low,high;
  char temp;
  init_ds18b20();
  wr_ds18b20(0xCC);
  wr_ds18b20(0x44); //启动温度转换
  delay(200);
  init_ds18b20();
  wr_ds18b20(0xCC);
  wr_ds18b20(0xBE); //读取寄存器
  low = rd_ds18b20(); //低字节
  high = rd_ds18b20(); //高字节
  temp = high<<4;
  temp |= (low>>4);
  return temp;
}
先谢谢了!


既然知道时序不对,为什么不自己去查呢?程序是调出来的,自己调吧

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq = P1^7;
bit flag=0;
uint temp1;
uchar y=2;
uchar disp[4];
uchar b[4],k,kk;
uchar h,Recflag,low,high;
#define  fuhao  0xbf
#define Delay2us()   _nop_();_nop_();
#define Delay8us()   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
uchar  code  dispTAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar  code  dispbit[]={0xfe,0xfd,0xfb,0xf7};   
void Delayus(uint us)   
{
   while(us--)
        ;
}
/***DS18B20初始化  ***/
bit Ds18b20_Init(void)
{
  bit temp=1;
   dq=1;
   Delay2us();
   dq=0;
   Delayus(100);
   dq=1;
   Delayus(10);
   temp = dq;
   dq=1;
   Delayus(30);  
   return temp;
}
/***写bit2DS18B20***/
void Ds18b20_WriteBit(bit bitdata)
{
  dq=1;
  Delay2us();   
  if(bitdata)
        {
           dq=0;
           Delay2us();   
           dq=1;
           Delayus(12);
        }
  else
   {
   dq=0;
   Delayus(12);
   }
   dq=1;
   Delay2us();   
}
/***写Byte DS18B20***/
void Ds18b20_WriteByte(uchar chrdata)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                   Ds18b20_WriteBit(chrdata&0x01);
                   chrdata>>= 1;
        }
}
/***读bit From DS18B20***/
bit Ds18b20_ReadBit(void)
{
        bit bitdata;
        dq=1;
        Delay2us();   
        dq=0;
        Delay2us();   
        Delay2us();   
        dq=1;
        Delay8us();   
        Delay8us();   
        bitdata = dq;
           Delayus(10);
        dq=1;
        return bitdata;
}
/***读Byte DS18B20***/
uchar Ds18b20_ReadByte()
{
uchar i,chardata;
for(i=0;i<8;i++)
{
   chardata>>=1;
   if(Ds18b20_ReadBit())
      chardata|=0x80;
}
   return chardata;
}
/***读 DS18B20 BE***/
bit Ds18b20_ReadBE(uchar *P)
{
uchar z=2;
if(Ds18b20_Init())
    return 1;
Ds18b20_WriteByte(0xCC);
Ds18b20_WriteByte(0xBE);
while(z--)
   {
      *P=Ds18b20_ReadByte();
      P++;
   }
   return 0;
}
/***温度采集计算***/
uint  Tempsnach( uchar temp[2] )
{
        uint wendu;
        wendu = temp[1];   
        wendu<<= 8;   
        wendu|= temp[0];  
        if(wendu&0x8000)
         {
           wendu=(~wendu)+1;
          temp1= wendu *0.625+0.5;
           flag=1;
         }
        else
         {
flag=0;
  temp1= wendu *0.625+0.5;
}
        return          wendu;
}
/***温度转换***/
void  Tempdisp( uint temperature )
{
        uchar tmp,i,temper1,temper2;
        temper1=temperature/16;
        temper2=temperature%16;
        if(flag)
        disp[0]=fuhao;
        else
        disp[0]=temper1/100;
        disp[1]=(temper1%100)/10;
        disp[2]=(temper1)%10;
        disp[3]=temper2*5/8;
        for(i=0;i<4;i++)
        {       
                P2=dispbit[i];
                tmp=disp[i];
                if(i==2)
                P0=dispTAB[tmp]&0x7f;
                else  if(i==0&&tmp==0)
                P0=0xff;
                else
                P0=dispTAB[tmp];
                Delayus(200) ;
                P0=0xff;
        }
}
  void senddata(uchar a)             //串口发送
{
       SBUF=a;
       while(TI==0);
       TI=0;

}
void receive_inter() interrupt 4                //串口接收中断
  {
if(RI==1)
    {
      h=SBUF;
      RI=0;
   if(h==0x01)                  //收到0X01开始发送数据
     {
Recflag=1;
      h=0x00;
      }  
   else if(h==0x02)               //收到0X02停止发送数据
{
Recflag=0;
         h=0x00;
        }
    }
  
   
  }
void main()
{   
       
        uchar a[2],j=0;
       EA=1;
ES=1;
      TMOD=0x20; //定时器T1方式2
      SCON=0x50;
      PCON=0x00;
      TH1=0xfd; //波特率9600
      TL1=0xfd;
      TR1=1;
        EX0=1;
        IT0=0;
        EX1=1;
        IT1=0;
        while(1)
        {       
                Ds18b20_Init();
                Ds18b20_WriteByte(0xCC);
                Ds18b20_WriteByte(0x44);
                Tempdisp(Tempsnach(a));
                Delayus(50);
                while(j--)
                Tempdisp(Tempsnach(a));
                Ds18b20_Init();
                Ds18b20_ReadBE(a);
                Tempdisp(Tempsnach(a));
       if(Recflag==1)
           {   
low=temp1;//temp1的低8位
              high=(temp1&0xff00)>>8;//temp1的高8位
              senddata (high);
              senddata (low);
}
}
}

       

恩,可能我不太耐心了,我再去试试,已经调出来了,谢谢了。

谢谢了,我自己的也调出来了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top