打印
[AVR单片机]

DS18B20测温,可液晶上显示的温度一直不变,真心希望师兄们帮帮初学小弟

[复制链接]
2997|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wzcyy|  楼主 | 2015-12-31 20:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<iom16v.h>
#include<macros.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define QW_IN   DDRB&=~BIT(4)
#define QW_OUT  DDRB|=BIT(4)
#define QW_SET  PORTB|=BIT(4)
#define QW_CLR  PORTB&=BIT(4)
//#DEFINE QW_R    PINB&BIT(4)      
void delay(uint ms)
{
        uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}

//定义 1us 延时函数
void delay_us(uint n)
{
  {asm("nop");}
}

uchar  digit[]={"0123456789"};              //定义字符数组显示数字
uchar error[]={"Error!"};                   //没有检测到DS18B20
uchar temp[]={"Temp:"};                     //显示的是温度

//对液晶模块的操作程序
void write_com(uchar com)
{
   PORTC&=~BIT(0);                         //RS=0,指令寄存器
   PORTC&=~BIT(1);                          //R/W=0写数据到LCD
   PORTA=com;
   PORTB|=BIT(2);
   delay(3);
   PORTB&=~BIT(2);
}

void write_dat(uchar dat)
{
   PORTC|=BIT(0);                         //RS=1,数据寄存器
   PORTC&=~BIT(1);                          //R/W=0写数据到LCD
   PORTA=dat;
   PORTB|=BIT(2);
   delay(3);
   PORTB&=~BIT(2);
}

void LCD()
{
  
  DDRA=0XFF;
  DDRC|=BIT(0)|BIT(1);
  DDRB|=BIT(2);
  PORTB&=~BIT(2);
  
  write_com(0X38);
  delay(9);
  write_com(0X01);
  delay(9);
  write_com(0X0C);
  delay(9);
  write_com(0X06);
  delay(9);
}

//显示温度值
void display_error()
{
  uchar i;
  i=0;
  LCD();
  write_com(0X80+0X40);
  delay_us(5000);
  while(error[i]!=0)
  {
  write_dat(error[i]);
     i++;
  delay_us(100);
  }
}

void display_temp()
{
  uchar i;
  
  write_com(0X80+0X00);
  delay(9);
  while(temp[i]!='\0')
  {
   write_dat(temp[i]);
   i++;
   delay(9);
  }
}

void xsd()
{

  write_com(0X80+0X0A);
  delay(9);
  write_dat('.');
  delay(9);
}

void dw()
{
  
  write_com(0X80+0X0D);
  delay(9);
  write_dat('C');
  delay(9);
}

void wd(uint temp)
{
  uint a;
  uint b;
  uint c;
  uint d;
  a=temp/1000;
  temp=temp%1000;
  b=temp/100;
  temp=temp%100;
  c=temp/10;
  d=temp%10;
  write_com(0X80+0X07);
  delay(9);
  write_dat(digit[a]);
  write_com(0X80+0X08);
  delay(9);
  write_dat(digit[b]);
  write_com(0X80+0X09);
  delay(9);
  write_dat(digit[c]);
  delay(9);
  write_com(0X80+0X0B);
  delay(9);
  write_dat(digit[d]);
  delay(9);
}

/* void wdx(uint temp)
{
  uint a;
  uint b;
  uint c;
  uint d;
  a=temp/1000;
  temp=temp%1000;
  b=temp/100;
  temp=temp%100;
  c=temp/10;
  temp=temp%10;
  d=temp;
  write_com(0X80+0X0B);
delay(9);
  write_dat(digit[d]);
}*/

//DS18B20初始化
uchar ds18b20_reset()
{
  uchar i;
  QW_OUT;
  QW_CLR;
  delay_us(600);
  QW_SET;
  delay_us(100);
  QW_IN;
  i=PINB&BIT(4);
  delay_us(500);
  return i;
}

//DB18B20写操作程序
void ds18b20_write_byte(char ha)
{
  uchar i;
  for(i=0;i<0;i++)
  {
  QW_OUT;
  QW_CLR;
  delay_us(5);
  if(ha&0x01)
  {
   QW_SET;
  }
    delay_us(100);
        QW_SET;
        ha=ha>>1;
  }
}

//DS18B20读操作程序
uchar ds18b20_read_byte()
{
  uchar i;
  uchar ha;
  ha=0;
  for(i=0;i<8;i++)
  {
  ha=ha>>1;
  QW_OUT;
  QW_CLR;
  delay_us(5);
  QW_SET;
  QW_IN;
  if(PINB&BIT(4))
  {
   ha|=0x80;
  }
  delay_us(60);
  }
  return ha;
}

//主函数程序
void main()
{
  uchar i;
  uchar j;
  uint temp;
  LCD();
  if(ds18b20_reset()==1)
  {
  display_error();
  }
  display_temp();
  xsd();
  dw();
  
  while(1)
  {
   ds18b20_reset();                 //DS18B20初始化
   ds18b20_write_byte(0XCC);          //对ROM操作,跳过ROM
   ds18b20_write_byte(0X44);         //启动温度转换
   delay(9);
   
   ds18b20_reset();
   ds18b20_write_byte(0XCC);
  ds18b20_write_byte(0xBE);            //读暂存器
   
   i=ds18b20_read_byte();                //LSB
    j=ds18b20_read_byte();                //MSB
   
   temp=j*256+i;
  
   temp=temp*0.625;
   
   wd(temp);
   //wdx(temp);
   delay(10);
  }
}



相关帖子

沙发
airwill| | 2016-1-1 07:59 | 只看该作者
先验证一下与 DS18B20 的通信是否正常,借助示波器和逻辑分析仪。
好好地学习一下调试的技巧, 这个比写代码更为重要

使用特权

评论回复
板凳
wzcyy|  楼主 | 2016-1-1 11:07 | 只看该作者
airwill 发表于 2016-1-1 07:59
先验证一下与 DS18B20 的通信是否正常,借助示波器和逻辑分析仪。
好好地学习一下调试的技巧, 这个比写代 ...

我是做课程设计,第一次接触DS18B20,求师兄帮忙看看究竟哪出错了!!!

使用特权

评论回复
地板
liuw2010| | 2016-1-3 16:28 | 只看该作者
一是让18B20数据从串口发送出来看看是否有变化;二是给液晶不同的数据(程序中写一个常数),看液晶是否有变化。

使用特权

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

本版积分规则

2

主题

3

帖子

0

粉丝