因项目需要,要弄一个5路测温的这么一个东西出来,PCB板、电路图、和各种硬件都是现成的,只是需要编写软件,自己学了很长时间,但还是感觉有难度,入不了这个门,所以现在来这里求助各位大哥帮忙解决这个问题,有兴趣的可以加QQ 182188600 联系(最好是西安地区),备注请写上:51单片机,事成之后又酬劳感谢,报酬可以商量!
原标题:求助....
阿莫修改的标题:悬赏用51做一个5路测温,报酬可商量
打击“标题不能说明帖子内容”,处罚250莫元
http://www.ourdev.cn/thread-5468735-1-1.html
此贴被网友举报, 楼主扣分250莫元。
举报成功的网友获得3莫元的奖励(已经发出)。
已经由阿莫修改成合格的标题。
下列 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;
}
}
多谢共享。
有空测试一下,,,
一周热门 更多>