打印

pic16F1936 与18b20 难题!!!

[复制链接]
2004|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 | 只看该作者
用示波器看波形吧,一点一点的来

使用特权

评论回复
5
ayb_ice| | 2012-5-30 16:06 | 只看该作者
1820很多假货,我也遇到过的,总线有应答,但没有功能,始终返回0

使用特权

评论回复
6
sedatefire| | 2012-6-26 17:31 | 只看该作者
用示波器看波形吧,一点一点的来
zhaofy521 发表于 2012-5-30 14:52
同理

使用特权

评论回复
7
原野之狼| | 2012-6-26 20:55 | 只看该作者
**住  这正式上台阶的时候啊

使用特权

评论回复
8
wukunshan| | 2012-6-27 12:39 | 只看该作者
哎呀,楼主真是马大哈呀。temp1和temp2你是读出来了,但没有付给ShowTempHum()函数显示呀。

使用特权

评论回复
9
wukunshan| | 2012-6-27 12:46 | 只看该作者
暮然发现,这是5月30号的贴子,怎么还有人翻出来让我跟帖呢?唉。。。。

使用特权

评论回复
10
hawk20022002| | 2012-7-13 17:22 | 只看该作者
少了个关键的延时

使用特权

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

本版积分规则

162

主题

364

帖子

3

粉丝