打印

关于DS18b20的程序 怎么显示不出来呢?显示屏是12864

[复制链接]
2556|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sarang202|  楼主 | 2011-3-31 12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机是AT89c52,液晶12864,DS18b20;液晶只显示255,我写的程序应该是把温度的整数部分显示在液晶屏上;各位高手请帮忙一下,谢谢!
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code a[]={"0123456789"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit PSB=P2^3;
sbit RST=P2^5;
sbit DS18b20_data=P3^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void delay_10us()
{
_nop_();
_nop_();
_nop_();
}
void delay_15us(uint m)
{
uint x;
for(x=m;x>0;x--);
}
bit rstDS18b20(void)// DS18B20复位程序, 返回0-有设备连接,1-无设备连接
{
uchar i;
bit rstFlag;
rstFlag =1;
DS18b20_data=1;
_nop_();
DS18b20_data=0;//发送复位脉冲
delay_15us(40);//等待600us
DS18b20_data=1;
delay_15us(2);//15-60us
for(i=0;i<6;i++)//60-240us
{
  delay_15us(1);
   if( DS18b20_data==0)
    rstFlag=0;
}
delay_15us(15);//240us
return rstFlag;
}
void writeDS18b20(uchar ch)//写一个字节的命令
{
uchar i;
DS18b20_data=1;//拉高数据总线,准备写数据延时1us
_nop_();
for(i=0;i<8;i++)
{
   DS18b20_data=0;
   delay_10us();
   DS18b20_data=ch&0x01;//发送最低位,1或0
   delay_15us(2);//保持写入数据时间60-120us,实际可以是30us
       ch=ch>>1;//先写低位,后写高位
   _nop_();
}
}
uchar readDS18b20(void )//读一个字节的命令
{
uchar i,rd;
rd=0;
DS18b20_data=1;//拉高总线,准备启动,延时1us
_nop_();
for(i=0;i<8;i++)
{
  DS18b20_data=0;
  delay_10us();
  DS18b20_data=1;//拉高总线,准备收数据
  _nop_();
  rd=rd>>1;
  if( DS18b20_data==1)//接受 DS18b20的数据,若是0就翻到上面rd右移1位
   rd=rd+0x80;
  delay_15us(2);//延时45us保证读数据要60us
}
return rd;
}
uchar gettemp(void)
{
uchar i=0,j=0;
uchar T=0;
// float tt;
if(!rstDS18b20())//如果探头连接正常
{
  rstDS18b20();
  writeDS18b20(0xcc);//跳过rom指令
  writeDS18b20(0x44);//启动温度转换指令
  if(!rstDS18b20())
  {
   rstDS18b20();
   writeDS18b20(0xcc);
   writeDS18b20(0xbe);
   i=readDS18b20();//温度低位
   j=readDS18b20();//温度高位
    T=j*16+i/16;
       //TD=(TL%16)*10/16;
   
   return(T);

  }
  /*else
  {
   return 0xffff;
  }*/
}
/* else
{
  return 0xffff;
}*/
}
void write_com(uchar com)//给液晶写指令
{

RS=0;
delay(5);
RW=0;
delay(5);
E=1;
P0=com;
delay(5);
E=0;
}
void write_data(uchar date)//写数据
{

RS=1;
delay(5);
RW=0;
delay(5);
E=1;
P0=date;
delay(5);
E=0;
}
void init()  //初始化设置
{
RST=0;//reset单片机
delay(40);
RST=1;
E=0;
write_com(0x30);//8位或4位选择
write_com(0x01);//显示清零
write_com(0x02);//地址归位
write_com(0x0c);//光标显示或不显示设置
//write_com(0x14);

}
void main()
{
uchar g,h,k,TH;
//uint TH;
init();
while(1)
{
TH=gettemp();

//t1=gettemp();
//t1=x*16/10;
g=TH/100;
h=(TH%100)/10;
k=TH%10;

write_com(0x91);
write_data(a[g]);
    write_com(0x92);
write_data(a[h]);
write_com(0x93);
write_data(a[k]);
}
//while(1);
}

相关帖子

沙发
sarang202|  楼主 | 2011-4-1 16:18 | 只看该作者
上面的程序主要错误 我觉得 是对延时函数所用的时间 长度 有误解,还有一个是看DS18b20的时序图要好好看,经过调试 下面的程序可以运行
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char code a[]={"0123456789"};
uchar time;

sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit PSB=P2^3;
sbit RST=P2^5;
sbit DS18b20_data=P3^2;

void delay1(uint z)
{
        uint x;
        for(x=z;x>0;x--);//延时2us
}
void delay(uint m)
{
        uint x,y;
        for(x=m;x>0;x--)
                for(y=110;y>0;y--);
}

/*void delay_10us()
{
        uint z;
        for(z=5;z>0;z--);

}

void delay_15us(uint m)
{
        uint x,y;
        for(x=m;x>0;x--)
                for(y=6;y>0;y--);
}*/

bit rstDS18b20(void)// DS18B20复位程序, 返回0-有设备连接,1-无设备连接

{

        bit rstFlag;
        DS18b20_data=1;
        delay1(2);
        DS18b20_data=0;
        delay1(250);//总线拉低 延时500us
        DS18b20_data=1;
        delay1(10);//延时20us,要求是15-60us
        rstFlag=DS18b20_data;//检测存在脉冲
        delay1(100);//60-240us延时
        return(rstFlag);


}

void writeDS18b20(uchar ch)//写一个字节的命令
{
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
        DS18b20_data=1;//拉高总线,准备写数据
        _nop_();
        DS18b20_data=0;//拉低总线,开始写数据
        DS18b20_data=ch&0x01;//从低位开始发送数据,1或0;
        delay1(15);//延时30us,超过40us发送数据出错。原因是时序  (ds18b20时序图)
        DS18b20_data=1;
        delay1(1);//上升沿延时
        ch>>=1;
        }
   for(time=0;time<4;time++);
}

uchar readDS18b20(void )//读一个字节的命令
{
        uchar i,rd;
        rd=0;
        //DS18b20_data=1;//拉高总线,准备启动,延时1us
        _nop_();
        for(i=0;i<8;i++)
        {
                DS18b20_data=1;//拉高总线 为读数据做准备
                _nop_();
                DS18b20_data=0;//拉低总线 开始接受数据
                rd=rd>>1;
                _nop_();
                DS18b20_data=1;//这个必须加 要不然显示为0,程序读不了数据
                //for(time=0;time<2;time++);
                _nop_();
                _nop_();
                _nop_();
                _nop_();//这里延时4us,用delay1 函数可能超过4us
                if(DS18b20_data==1)
                rd=rd+0x80;//加1.
                else
                rd=rd+0x00;//总线控制器有高电平就执行前面的if句子,有低电平就就是加一个0,
                delay1(8);//这里延时16us

        }
        return(rd);
}

uint gettemp(void)
{
        uchar i=0,j=0;
        uint temp=0;
        float tt;
        if(!rstDS18b20())//如果探头连接正常
        {
                rstDS18b20();
                writeDS18b20(0xcc);//跳过rom指令
                writeDS18b20(0x44);//启动温度转换指令
                if(!rstDS18b20())
                {
                        rstDS18b20();
                        writeDS18b20(0xcc);
                        writeDS18b20(0xbe);
                        i=readDS18b20();//温度低位
                        j=readDS18b20();//温度高位
                  temp=j;
                  temp<<=8;
                  temp=temp|i;
                  tt=temp*0.0625;     //温度读取的解释我记录在 "倒塌 18B20"里面
                  temp=tt*10+0.5;

                       
                        return(temp);


                }
               

        }

}

void write_com(uchar com)
{
       
        RS=0;
        delay(5);
        RW=0;
        delay(5);
        E=1;
        P0=com;
        delay(5);
        E=0;
}

void write_data(uchar date)
{
       
        RS=1;
        delay(5);
        RW=0;
        delay(5);
        E=1;
        P0=date;
        delay(5);
        E=0;
}

void init()  //初始化设置
{
        RST=0;//reset单片机
        delay(40);
        RST=1;
        E=0;
        write_com(0x30);//8位或4位选择
        write_com(0x01);//显示清零
        write_com(0x02);//地址归位
        write_com(0x0c);//光标显示或不显示设置
        //write_com(0x14);
       
}
void main()
{
        uint g,h,k;
        uint TH;
        init();
        while(1)
        {
        TH=gettemp();
       
        //t1=gettemp();
        //t1=x*16/10;
        g=TH/100;
        h=(TH%100)/10;
        k=TH%10;
       
        write_com(0x91);
        write_data(a[g]);
    write_com(0x92);
        write_data(a[h]);
         write_com(0x93);
        write_data('.');
        write_com(0x94);
        write_data(a[k]);
        }
        //while(1);
}

使用特权

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

本版积分规则

8

主题

68

帖子

0

粉丝