pic16F1936 与18b20 难题!!!

[复制链接]
2712|9
 楼主| taijing33 发表于 2012-5-30 10:45 | 显示全部楼层 |阅读模式
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.电路我也查过了,没问题。传感器也是好的。
forgot 发表于 2012-5-30 11:44 | 显示全部楼层
软件硬件都很准确却读不出数据?

能不能写?
 楼主| taijing33 发表于 2012-5-30 11:52 | 显示全部楼层
谁知道啊。无法验证。我要崩溃了。
zhaofy521 发表于 2012-5-30 14:52 | 显示全部楼层
用示波器看波形吧,一点一点的来
ayb_ice 发表于 2012-5-30 16:06 | 显示全部楼层
1820很多假货,我也遇到过的,总线有应答,但没有功能,始终返回0
sedatefire 发表于 2012-6-26 17:31 | 显示全部楼层
用示波器看波形吧,一点一点的来
zhaofy521 发表于 2012-5-30 14:52
同理
原野之狼 发表于 2012-6-26 20:55 | 显示全部楼层
**住  这正式上台阶的时候啊
wukunshan 发表于 2012-6-27 12:39 | 显示全部楼层
哎呀,楼主真是马大哈呀。temp1和temp2你是读出来了,但没有付给ShowTempHum()函数显示呀。
wukunshan 发表于 2012-6-27 12:46 | 显示全部楼层
暮然发现,这是5月30号的贴子,怎么还有人翻出来让我跟帖呢?唉。。。。
hawk20022002 发表于 2012-7-13 17:22 | 显示全部楼层
少了个关键的延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

162

主题

364

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部