打印

ds18b20串口通信,求大神帮帮忙

[复制链接]
1451|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
先给程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^7;           
uint temp;            
uchar flag1;           
uchar buff[6];
void delay(uint count)     
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
void dsreset(void)      
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)      
{
   uint i;
   bit dat;
   DS=0;i++;         
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)  
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;      
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);
}

uchar tmp()               
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;            
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

void UART_init()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF9;                               
        TL1=0XF9;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;
}
void send(char *parr)
{
        do{
        SBUF = *parr++;//发送数据
        while(!TI);           //等待发送完成标志为一
        TI = 0;                        //标志请0
        }while(*parr);        //保持循环直到字符为'\0'
}


void main()
{
    uchar tempature,B1,B2t,B2,B3;
    UART_init();


while(1)
  {
        tmpchange();
        tempature = tmp();
    B1=tempature/100;
    B2t=tempature%100;
    B2=B2t/10;
    B3=B2t%10;
        buff[0]=0x00;
        buff[1]=B1+'0';
        buff[2]=B2+'0';
        buff[3]=0x2E;
        buff[4]=B3+'0';
        buff[5]=0xBB;
        send(buff);
        delay(1000);
        }
}
此程序在波特率为4800的情况下能够正常运行,一但到了9600的波特率的情况  
大佬们快帮帮我

相关帖子

沙发
xyz549040622| | 2018-1-11 07:55 | 只看该作者
这种情况,像是你只发了一部分,正常的显示应该是什么呢?

使用特权

评论回复
板凳
bioger2| | 2018-1-11 08:11 | 只看该作者
发一组固定的数据看看情况吧

使用特权

评论回复
地板
ayb_ice| | 2018-1-11 09:09 | 只看该作者
开了全局中断和串口中断,但没有看到串口中断程序

另外既然开了串口中断,但发送居然还是查询方式工作,有冲突
这样试试
void send(char *parr)
{
        ES = 0;//!!!!
        do{
                SBUF = *parr++;//发送数据
                while(!TI);           //等待发送完成标志为一
                TI = 0;                        //标志请0
        }while(*parr);        //保持循环直到字符为'\0'
}

使用特权

评论回复
5
im枫叶无情|  楼主 | 2018-1-12 09:14 | 只看该作者
xyz549040622 发表于 2018-1-11 07:55
这种情况,像是你只发了一部分,正常的显示应该是什么呢?

这是在波特率为4800的情况下正常的数据void UART_init(){
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                               
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;
}
void main()
{
    uchar tempature,B1,B2t,B2,B3;
    UART_init();
while(1)
  {
        tmpchange();
        tempature = tmp();
    B1=tempature/100;
    B2t=tempature%100;
    B2=B2t/10;
    B3=B2t%10;
        buff[0]=0x00;
        buff[1]=B1+'0';
        buff[2]=B2+'0';
        buff[3]=0x2E;
        buff[4]=B3+'0';
        buff[5]=0xBB;
        send(buff);
        delay(1000);
        }
}




TIM截图20180112091219.png (57.13 KB )

TIM截图20180112091219.png

使用特权

评论回复
6
im枫叶无情|  楼主 | 2018-1-12 09:17 | 只看该作者
bioger2 发表于 2018-1-11 08:11
发一组固定的数据看看情况吧

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//sbit DS=P3^7;           
//uint temp;            
//uchar flag1;           
uchar buff[6];
void delay(uint count)     
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
/*void dsreset(void)      
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

/*bit tmpreadbit(void)      
{
   uint i;
   bit dat;
   DS=0;i++;         
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

/*uchar tmpread(void)  
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   
  }
  return(dat);
}

/*void tmpwritebyte(uchar dat)   
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;      
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

/*void tmpchange(void)  
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);
}

/*uchar tmp()               
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;            
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}*/

void UART_init()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                       
        TH1=0XF9;                               
        TL1=0XF9;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;
}
void send(char *parr)
{
        ES=0;
        do{
        SBUF = *parr++;//发送数据
        while(!TI);           //等待发送完成标志为一
        TI = 0;                        //标志请0
        }while(*parr);        //保持循环直到字符为'\0'
}


void main()
{
    //uchar tempature,B1,B2t,B2,B3;
    UART_init();
while(1)
  {
        //tmpchange();
        //tempature = tmp();
    //B1=tempature/100;
    //B2t=tempature%100;
    //B2=B2t/10;
    //B3=B2t%10;
        buff[0]=0xAA;
        buff[1]=0x32;
        buff[2]=0X33;
        buff[3]=0x2E;
        buff[4]=0X44;
        buff[5]=0xBB;
        send(buff);
        delay(1000);
        }
}
循环发送单组数据   一单换成9600的波特率 会出现错误

22222222.png (52.7 KB )

22222222.png

使用特权

评论回复
7
im枫叶无情|  楼主 | 2018-1-12 09:18 | 只看该作者
ayb_ice 发表于 2018-1-11 09:09
开了全局中断和串口中断,但没有看到串口中断程序

另外既然开了串口中断,但发送居然还是查询方式工作,有 ...

没得用呀 老哥

使用特权

评论回复
8
ayb_ice| | 2018-1-12 09:38 | 只看该作者

系统还有没有其它中断,

中断会影响总线时序的,会导致错误的,关键时候需要关中断的

使用特权

评论回复
9
zqx1000| | 2018-4-10 21:18 | 只看该作者
kankan

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝