打印
[AVR单片机]

CodeVersion AVR 对多个18B20操作问题

[复制链接]
2520|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
addisonqhd|  楼主 | 2008-6-12 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁用过CodeVersion AVR , 对18B20操作时, #include <1wire.h>头文件中的函数只做了定义:

unsigned char w1_init(void)

unsigned char w1_read(void)

unsigned char w1_write(unsigned char data)

unsigned char w1_search(unsigned char cmd,void *p)返回 1 Wire bus上器件的个数


例程里都是直接调用这些函数,但函数体在哪呀,我一直也找不到?

相关帖子

沙发
zhanan| | 2008-6-23 14:32 | 只看该作者

CV只能支持一个

因为只能定义一个端口. 函数体在编译时直接加入汇编命令, 外部是查不到C程序的. 
C程序可以自己编写, 并不是很难, 并且自己编写的可以做到支持多个18B20.

使用特权

评论回复
板凳
addisonqhd|  楼主 | 2008-6-23 17:47 | 只看该作者

有没有程序代码供参考呀?

有没有程序代码供参考呀?
哪位编写过,请指点!!谢谢

使用特权

评论回复
地板
zhanan| | 2008-6-28 09:08 | 只看该作者

自编的CV程序

以下实际上为三个文件
增加测温路数就复制一份"测温X"文件, 修改其中的端口名及程序名.

/***** 测温1 *********/
#include "main.h"

#define DQf DDRB.1  // 0输入  1输出 
#define DQi PINB.1  // 读引脚
#define DQo PORTB.1 // 一线总线输出0。输入时高阻需外加上拉电阻。

#include "wire.h"  // 一线总线协议
/***/
int readtemp1(void)  // 读取温度值程序1
{
  uchar i;
  uint  j;

  wire_r();        // 复位
  wire_wr( 0xCC ); // 跳过匹配
  wire_wr( 0xBE ); // 读操作
  i=wire_rd();     // 读出数据低字节
  j=wire_rd();     // 读出数据高字节
  j=(j<<8)|i;      // 合并
  return j;
}
/***/
void cetemp1(void)  // 测温程序1
{
  wire_r();        // 复位
  wire_wr( 0xCC ); // 跳过匹配
  wire_wr( 0x44 ); // 测温
}
/***/
/*********************/


/***** 测温2 *********/
#include "main.h"

#define DQf DDRB.2  // 0输入  1输出 
#define DQi PINB.2  // 读引脚
#define DQo PORTB.2 // 一线总线输出0。输入时高阻需外加上拉电阻。

#include "wire.h"  // 一线总线协议
/***/
int readtemp2(void)  // 读取温度值程序2
{
  uchar i;
  uint  j;

  wire_r();        // 复位
  wire_wr( 0xCC ); // 跳过匹配
  wire_wr( 0xBE ); // 读操作
  i=wire_rd();     // 读出数据低字节
  j=wire_rd();     // 读出数据高字节
  j=(j<<8)|i;      // 合并
  return j;
}
/***/
void cetemp2(void)  // 测温程序2
{
  wire_r();        // 复位
  wire_wr( 0xCC ); // 跳过匹配
  wire_wr( 0x44 ); // 测温
}
/***/
/*********************/


/******** wire.h *********/
#include <delay.h>
//   wire准备(复位)
static void wire_r()
{
  DQo=0;   // 置DQ输出0
  DQf=!0; delay_us(254); // DQ拉低480us(230-480)
  DQf=!1; delay_us(254); // 释放480us(230-480),检查总线状态
}
/***/
//   wire读字节 (低位先收)
static uchar wire_rd()
{
  uchar i,j=0;
  for(i=1; i; i<<=1)
  {
    DQf=!0; delay_us(4); // DQ 拉低6us(1-10)
    DQf=!1; delay_us(4); // 释放9us(1-10)
    if(DQi) j|=i;  // 读取 DQ 组装字节
    delay_us(50);  // 延时55us(30-100)
  }
  return j;
}
/***/
//   wire写字节 (低位先发)
static void wire_wr(uchar k)
{
  uchar i,j=k;
  for(i=1; i; i<<=1)
  {
    DQf=!0; delay_us(4); // DQ 拉低6us(1-10)
    if(j&0x01) DQf=!1;   // 按位发送
    j>>=1;               // 下一位
    delay_us(50);        // 延时55us(30-100)
    DQf=!1; delay_us(4); // 释放9us(1-10)
  }
}
/***/
/********************/

使用特权

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

本版积分规则

51

主题

78

帖子

1

粉丝