打印

pic16F1936 与18b20 难题!!!

[复制链接]
1520|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taijing33|  楼主 | 2012-5-30 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
extern WORD T_SHI;
reset(void)
{
    WORD presence=1;
    DQT_HIGH();
    while(presence)
     {
        DQT_LOW() ;                              
        __delay_us(503);
        DQT_HIGH();                                
        __delay_us(70);     
        if(DQT==1) presence=1;                     
        else presence=0;                          
        __delay_us(430);  
      }
}
//**************  从18B20中读一个字节**************//
WORD read_byte()
{
        WORD i;
        WORD data;
        static bit j;   
        for(i=0;i<8;i++)
        {
         data>>=1;
         DQT_LOW();
          __delay_us(6);
         DQT_HIGH();
          __delay_us(6);
          j=DQT;
         if(j)data|=0x80;
         __delay_us(63);            //延时61us(从拉低电平开始60-120us之内释放总线)
  }
  return(data);
}
//*********************向18B20中 写一个字节**************//
void write_byte(WORD val)
{
   WORD i,temp;
  for(i=8;i>0;i--)          //写8位数据
  {
    temp=val&0x01;          //先写低位数据
    DQT_LOW();              //RA1输出低电平
     __delay_us(6);         //延时6us(15us之内把数据送到总线上)
    if(temp){DQT_HIGH();}   //设置RE0为输入口(写1时序)
   __delay_us(63);         //延时61us(总线采样时间15-60us)
    DQT_HIGH();            //设置RA1为输入口(写0时序)
    __delay_us(6);         //延时6us(写第二位时间间隙大于1us)
    val=val>>1;            //右移一位
  }      
}
void Get_Temp(void)
{
WORD i,TEMP1=0,TEMP2=0;
reset();
write_byte(0XCC);                        //忽略ROM匹配
write_byte(0X44);  
reset();                              //再次复位,等待从机应答
write_byte(0XCC);                        //忽略ROM匹配
write_byte(0XBE);                        //发送读温度命令
TEMP1=read_byte();
TEMP2=read_byte();
//TEMP1=TEMP1>>4;
//TEMP2=TEMP2<<4;
if(TEMP1>0)
{T_SHI=0x3f;       //此处我想验证temp1是否得到了数值,
ShowTempHum();  //取得了数值,就应该执行该句。
}                          //但是问题是temp1和temp2一直是0。
else
{T_SHI=0x22;  
ShowTempHum();


上面是我的函数,其中
#define nop asm("nop")
# define DQT        RA1          //定义18B20数据端口   
# define DQT_DIR        TRISA1   //定义18B20D口方向寄存器
//# define W1_INPUT    1      
//# define W1_OUTPUT    0      
# define FALSE        0
# define TRUE        !FALSE
# define DQT_HIGH()     DQT_DIR = 1         
# define DQT_LOW()      DQT = 0; DQT_DIR = 0
都定义好了。
我按照网上的n多例子,程序。,延时函数也是通过软件和示波器观察的,都很准确。,
我不知道为什么我一直读不出数据。
temp1和temp2一直是0.我弄了好几天了 郁闷死了。这个最基本的应用我也羞于问同事。谁能帮帮我,必有重谢。
单片机是pic16F1936.电路我也查过了,没问题。传感器也是好的。
沙发
junma10000| | 2012-5-30 14:10 | 只看该作者
最简单的办法,示波器量波形,

使用特权

评论回复
板凳
airwill| | 2012-6-3 07:36 | 只看该作者
首先确认连线和焊接的可靠, 很多时候遇到虚焊的原因, 却绞尽脑汁找软件问题而反复不得解.
继续用示波器, 验证时序和数据传输, 这个事情比较累人, 但是比猜问题原因更直接而有效的办法.

使用特权

评论回复
地板
clown_7| | 2012-6-4 17:02 | 只看该作者
顶楼上

使用特权

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

本版积分规则

163

主题

365

帖子

3

粉丝