悬赏用51做一个5路测温,报酬可商量

2020-02-05 09:28发布

    因项目需要,要弄一个5路测温的这么一个东西出来,PCB板、电路图、和各种硬件都是现成的,只是需要编写软件,自己学了很长时间,但还是感觉有难度,入不了这个门,所以现在来这里求助各位大哥帮忙解决这个问题,有兴趣的可以加QQ 182188600 联系(最好是西安地区),备注请写上:51单片机,事成之后又酬劳感谢,报酬可以商量!



原标题:求助....
阿莫修改的标题:悬赏用51做一个5路测温,报酬可商量

打击“标题不能说明帖子内容”,处罚250莫元  
http://www.ourdev.cn/thread-5468735-1-1.html

此贴被网友举报, 楼主扣分250莫元。
举报成功的网友获得3莫元的奖励(已经发出)。
已经由阿莫修改成合格的标题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
XA144F
1楼-- · 2020-02-05 09:56
我给你个建议吧:先做出最原始、但是能实现功能的程序原型,然后对其不断改进优化。
lryxr2507
2楼-- · 2020-02-05 15:04
 精彩回答 2  元偷偷看……
hanhui
3楼-- · 2020-02-05 16:58
你把硬件列出来,使用的元器件列出来,硬件不同程序不同啦
gongnn
4楼-- · 2020-02-05 22:46
悲催的楼主啊!
cndavy
5楼-- · 2020-02-06 01:57
本帖最后由 cndavy 于 2012-4-26 13:57 编辑

下列 TMEX API 测试程序的源代码可从
ftp://ftp.dalsemi.com/pub/auto_id/public/an187.zip下载
搜索过程的‘C’程序代码实例图 4 接下页


转帖,以下没有试验,不过看来可以动态扫描DS18

uint  temp[8];
uchar snn[8][8];
uchar sensor_count;

/* 以下是对ds18b20的单总线操作子程序 11.0592MHz */
bit ds1820_init()       /* 单总线初始化,成功返回1,失败返回0 */
{
  uchar i;
  ds_1wire=0;
  for(i=0;i<57;i++);    //delay 500us
  ds_1wire=1;
  i=0;
  while(ds_1wire==1)    /* 最多延时70us,此期间若总线拉低(ds_1wire=0)则结束延时 */
  {
    i++;
    if(i>=8) return 0;
  }
  for(i=0;i<54;i++);    //delay 480us;
  if(ds_1wire==0) return 0;
  return 1;
}

void ds1820_wr(uchar dat)
{
  uchar i,j;
  bit b;
  for(i=0;i<8;i++)
  {
    ds_1wire=0;
    b=dat & 0x01;
    dat=dat>>1;
    ds_1wire=b;
    for(j=0;j<6;j++);    //delay 51us
    ds_1wire=1;
  }
}

uchar ds1820_rd(void)
{
  uchar i,j;
  uchar c;
  bit b;
  c=0;
  for(i=0;i<8;i++)
  {
    ds_1wire=0;
    c=c>>1;             //delay 4.3us
    ds_1wire=1;
    if(ds_1wire==1) c |= 0x80;
    for(j=0;j<6;j++);    //delay 59us
  }
  return c;
}

void get_temp(void)     /* 默认在750ms之前已经启动温度转换 */
{
  uchar i,j,lo,hi;
  EA=0;
  for(i=0;i<sensor_count;i++)
  {
    if(ds1820_init()==0) return;
    ds1820_wr(0x55);          /* 匹配rom命令 */
    for(j=0;j<8;j++) ds1820_wr(snn[j]);    /* 写64位序列号 */
    ds1820_wr(0xbe);          /* 读温度命令 */
    lo = ds1820_rd();         /* 读温度低字节 */
    hi = ds1820_rd();         /* 读温度高字节 */
    temp=hi*256+lo;
  }
  if(ds1820_init()==0) return;
  ds1820_wr(0xcc);          /* 跳过rom命令 */
  ds1820_wr(0x44);          /* 启动温度转换 */
  EA=1;
}

void scan_all_sensor()
{
  unsigned char i,j,c;
  unsigned char tag_old,tag_new;
  bit scan_over,b;
  unsigned char temp_sensor_addr[8];

  sensor_count=0;
  scan_over=0;
  tag_old=0;
  for(;scan_over==0;)
  {
     tag_new=0;
     //scan_start
     if(ds1820_init()==0) return;
     ds1820_wr(0xf0);              /* 搜索rom命令 */
     for (i=1;i<=64;i++)
     {
       //get c
       c=0;
       ds_1wire=0;
       j=j>>1;                     //delay 4.3us
       ds_1wire=1;
       if(ds_1wire==1) c|=0x02;
       for(j=0;j<6;j++);           //delay 51us
       ds_1wire=0;
       j=j>>1;                     //delay 4.3us
       ds_1wire=1;
       if(ds_1wire==1) c|=0x01;
       for(j=0;j<6;j++);           //delay 51us
       switch (c)
       {
       case 0x00:                /* 此位冲突 */
            if(i<tag_old)        /*  未到达标TAG_OLD,向TAG_OLD走,如果是向左则标记新的TAG_NEW*/
            {
              if ((temp_sensor_addr[(i-1)>>3] & 0x01) == 0x00) {b=0;tag_new=i;} else b=1;
            }
            if(i==tag_old) b=1;  /*  到达TAG_OLD,固定向右走  */
            if(i>tag_old)        /*  超过TAG_OLD,先选择向左走出,标记新的TAG_NEW */
            {
              b=0;
              tag_new=i;
            }
            break;
       case 0x01:                /* 此位为0 */
            b=0;
            break;
       case 0x02:                /* 此位为1 */
            b=1;
            break;
       case 0x03:                /* 无传感器 */
            scan_over=1;
            i=64;
            break;
       default: break;
       }
       temp_sensor_addr[(i-1)>>3]=temp_sensor_addr[(i-1)>>3] >> 1;
       if (b==1) temp_sensor_addr[(i-1)>>3] |= 0x80;
       //out bit b
       ds_1wire=0;
       j=j>>1;              //delay 4.3us
       ds_1wire=b;
       for(j=0;j<6;j++);    //delay 59us
       ds_1wire=1;
     }
     tag_old=tag_new;
     //reord sensor addr
     if (sensor_count<=7)
       for(j=0;j<8;j++) snn[sensor_count][j]=temp_sensor_addr[j];
     sensor_count++;
     if (tag_new==0) scan_over=1;
  }
}
jetli
6楼-- · 2020-02-06 04:04
cndavy 发表于 2012-4-26 13:54
下列 TMEX API 测试程序的源代码可从
ftp://ftp.dalsemi.com/pub/auto_id/public/an187.zip下载
搜索过程的 ...

  多谢共享。

有空测试一下,,,

一周热门 更多>