OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6010|回复: 3

关于郭天祥书上18b20代码扩展,出问题了。。。

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-8-14
在线时间
10 小时
发表于 2014-8-14 12:04:44 | 显示全部楼层 |阅读模式
5金钱
要做一个温度多点采集系统,用了郭天祥书上的例程(一个点采集),然后扩展成多个点就不行了。。。,高手帮忙看看
郭天祥代码:
#include <reg52.h>   
#include <stdio.h>   
#define  uchar unsigned char   
#define  uint  unsigned int   
sbit ds=P2^2;     //温度传感器信号线   
sbit dula=P2^6;   //数码管段选线   
sbit wela=P2^7;   //数码管位选线   
sbit beep=P2^2;   //蜂鸣器   
   
uint temp;   
float f_temp;   
uint warn_l1=260;   
uint warn_l2=250;   
uint warn_h1=300;   
uint warn_h2=320;   
   
sbit led0=P1^0;   
sbit led1=P1^1;   
sbit led2=P1^2;   
sbit led3=P1^3;   
   
unsigned char code table[]={   
0x3f,0x06,0x5b,0x4f,   
0x66,0x6d,0x7d,0x07,   
0x7f,0x6f,0xbf,0x86,   
0xdb,0xcf,0xe6,0xed,   
0xfd,0x87,0xff,0xef};     //不带小数点的编码   
   
void delay(uint z)//延时函数   
{   
    uint x,y;   
    for(x=z;x>0;x--)   
        for(y=110;y>0;y--);   
}   
   
   
   
void dsreset(void)    //18B20复位,初始化函数   
{   
  uint i;   
  ds=0;   
  i=103;   
  while(i>0)i--;   
  ds=1;   
  i=4;   
  while(i>0)i--;   
}   
   
bit tempreadbit(void)   //读1位函数   
{   
   uint i;   
   bit dat;   
   ds=0;i++;          //i++ 起延时作用   
   ds=1;i++;i++;   
   dat=ds;   
   i=8;while(i>0)i--;   
   return (dat);   
}   
   
uchar tempread(void)   //读1个字节   
{   
  uchar i,j,dat;   
  dat=0;   
  for(i=1;i<=8;i++)   
  {   
    j=tempreadbit();   
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里   
  }   
  return(dat);   
}   
   
void tempwritebyte(uchar dat)   //向18B20写一个字节数据   
{   
  uint i;   
  uchar j;   
  bit testb;   
  for(j=1;j<=8;j++)   
  {   
    testb=dat&0x01;   
    dat=dat>>1;   
    if(testb)     //写 1   
    {   
      ds=0;   
      i++;i++;   
      ds=1;   
      i=8;while(i>0)i--;   
    }   
    else   
    {   
      ds=0;       //写 0   
      i=8;while(i>0)i--;   
      ds=1;   
      i++;i++;   
    }   
   
  }   
}   
   
void tempchange(void)  //DS18B20 开始获取温度并转换   
{   
  dsreset();   
  delay(1);   
  tempwritebyte(0xcc);  // 写跳过读ROM指令   
  tempwritebyte(0x44);  // 写温度转换指令   
}   
   
uint get_temp()         //读取寄存器中存储的温度数据   
{   
  uchar a,b;   
   
  dsreset();   
  delay(1);   
  tempwritebyte(0xcc);   
  tempwritebyte(0xbe);   
  a=tempread();         //读低8位   
  b=tempread();         //读高8位   
  temp=b;   
  temp<<=8;            //两个字节组合为1个字   
  temp=temp|a;   
  f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°   
  temp=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5是四舍五入   
  f_temp=f_temp+0.05;    
  return temp;         //temp是整型   
}   
   
   
////////////////////显示程序//////////////////////////   
void display(uchar num,uchar dat)   
{   
  uchar i;   
  dula=0;   
  P0=table[dat];   
  dula=1;   
  dula=0;   
   
  wela=0;   
  i=0XFF;   
  i=i&(~((0X01)<<(num)));   
  P0=i;   
  wela=1;   
  wela=0;       
  delay(1);   
}   
   
void dis_temp(uint t)   
{   
  uchar i;   
  i=t/100;   
  display(0,i);   
  i=t%100/10;   
  display(1,i+10);   
  i=t%100%10;   
  display(2,i);   
}   
//////////////////////////////////////////////   
void warn(uint s,uchar led)   //蜂鸣器报警声音 ,s控制音调   
{   
    uchar i;i=s;   
    dula=0;   
    wela=0;   
    
    beep=0;   
    P1=~(led);   
    while(i--)   
    {   
      dis_temp(get_temp());   
    }      
    beep=1;   
    P1=0XFF;     
    i=s;     
     while(i--)   
    {   
      dis_temp(get_temp());   
    }     
}   
void deal(uint t)   
{   
  uchar i;   
  if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度   
    {   
       warn(40,0x01);   
          
    }   
  else if(t<=warn_l2)                   //小于25度    
    {   
       warn(10,0x03);   
    }   
  else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度   
    {   
       warn(40,0x04);   
    }   
  else if(t>=warn_h2)                   //大于32度   
    {   
       warn(10,0x0c);   
    }   
  else   
    {   
       i=40;   
       while(i--)   
       {   
        dis_temp(get_temp());   
       }    
    }   
}   
   
void init_com(void)   
{   
     TMOD = 0x20;   
     CON = 0x00;   
     SCON = 0x50;   
     TH1 = 0xFd;   
     TL1 = 0xFd;   
     TR1 = 1;   
}   
   
void comm(char *parr)            
{   
    do   
    {   
     SBUF = *parr++;                                                           //发送数据                             
     while(!TI);                                                               //等待发送完成标志为1   
     TI =0;                                                                    //标志清零   
    }while(*parr);                                                             //保持循环直到字符为'\0'   
}   
   
void main()   
{   
  uchar buff[4],i;   
  dula=0;   
  wela=0;   
  init_com();   
  while(1)   
 {       
      tempchange();   
      for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
      deal(temp);    
   
      sprintf(buff,"%f",f_temp);   
   
    for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
   
      comm(buff);   
   
     for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
       
 }   
}   
我的代码:
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit ds0=P1^4;
sbit ds1=P3^4;
uint temp;
float f_temp;
uchar code gtable[]="\n";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(uchar k)
{
uint i;
switch(k)
{
case 1:
ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;
break;
case 2:
ds0=0;i=103;while(i>0)i--;ds0=1;i=4;while(i>0)i--;
break;
case 3:
ds1=0;i=103;while(i>0)i--;ds1=1;i=4;while(i>0)i--;
break;
}

}
bit tempreadbit(uchar k)
{
uint i;
bit dat;
switch(k)
{
case 1:
ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);
break;
case 2:
ds0=0;i++;ds0=1;i++;i++;dat=ds0;i=8;while(i>0)i--;return(dat);
break;
case 3:
ds1=0;i++;ds1=1;i++;i++;dat=ds1;i=8;while(i>0)i--;return(dat);
break;
}
}
uchar tempread(uchar k)      
{   
  uchar i,j,dat;
  dat=0;   
  switch(k)
  {
  case 1:
  for(i=1;i<=8;i++)   
 {   
   j=tempreadbit(1);   
   dat=(j<<7)|(dat>>1);    
 }   
 return(dat);
 break;
    case 2:
  for(i=1;i<=8;i++)   
 {   
   j=tempreadbit(2);   
   dat=(j<<7)|(dat>>1);    
 }   
 return(dat);
 break;
case 3:
  for(i=1;i<=8;i++)   
 {   
   j=tempreadbit(3);   
   dat=(j<<7)|(dat>>1);    
 }   
 return(dat);
 break;

  }   
}
void tempwritebyte(uchar k,uchar dat)
{
uint i;
uchar j;
bit testb;
switch(k)
{
case 1:
for(j=1;j<=8;j++)   
 {   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)       
   {   
     ds=0;   
     i++;i++;   
     ds=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds=0;         
     i=8;while(i>0)i--;   
     ds=1;   
     i++;i++;   
   }   
  } 
  break;

case 2:
for(j=1;j<=8;j++)   
 {   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)       
   {   
     ds0=0;   
     i++;i++;   
     ds0=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds0=0;         
     i=8;while(i>0)i--;   
     ds0=1;   
     i++;i++;   
   }   
  }
  break;

case 3:
for(j=1;j<=8;j++)   
 {   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)       
   {   
     ds1=0;   
     i++;i++;   
     ds=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds1=0;         
     i=8;while(i>0)i--;   
     ds1=1;   
     i++;i++;   
   }   
  }
  break;     
}
}
void tempchange(uchar k)
{
switch(k)
{
case 1:
dsreset(1);delay(1);tempwritebyte(1,0xcc);tempwritebyte(1,0x44);
break;
case 2:
dsreset(2);delay(1);tempwritebyte(2,0xcc);tempwritebyte(2,0x44);
break;
case 3:
dsreset(3);delay(1);tempwritebyte(3,0xcc);tempwritebyte(3,0x44);
break;
}
}
uint get_temp(uchar k)
{
uchar a,b;
switch(k)
{
case 1:
 dsreset(1);   
 delay(1);   
 tempwritebyte(1,0xcc);   
 tempwritebyte(1,0xbe);   
 a=tempread(1);            
 b=tempread(1);          
 temp=b;   
 temp<<=8;            
 temp=temp|a;   
 f_temp=temp*0.0625;      
 temp=f_temp*10+0.5;     
 f_temp=f_temp+0.05;    
 return temp;  
 break;
case 2:
 dsreset(2);   
 delay(1);   
 tempwritebyte(2,0xcc);   
 tempwritebyte(2,0xbe);   
 a=tempread(2);            
 b=tempread(2);          
 temp=b;   
 temp<<=8;            
 temp=temp|a;   
 f_temp=temp*0.0625;      
 temp=f_temp*10+0.5;     
 f_temp=f_temp+0.05;    
 return temp;  
 break; 
case 3:
 dsreset(3);   
 delay(1);   
 tempwritebyte(3,0xcc);   
 tempwritebyte(3,0xbe);   
 a=tempread(3);            
 b=tempread(3);          
 temp=b;   
 temp<<=8;            
 temp=temp|a;   
 f_temp=temp*0.0625;      
 temp=f_temp*10+0.5;     
 f_temp=f_temp+0.05;    
 return temp;  
 break;          
}
return temp;
}  
void init_com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
void comm(char *parr)
{
do
{
SBUF=*parr++;
while(!TI);
TI=0;
}
while(*parr);
 //SBUF=gtable[0];
}
void main()
{
uchar buff[4],i;
uint tt=0;
init_com();
while(1)
{
    
      tempchange(1);
 delay(10);   
 get_temp(1);  
 sprintf(buff,"%f",f_temp);
 delay(10);    
      comm(buff);
 delay(10); 
 
 tempchange(2);
 delay(10);   
      get_temp(2);
 sprintf(buff,"%f",f_temp);
 delay(10);   
      comm(buff);
 delay(10);
 
 tempchange(3);
 delay(10);   
      get_temp(3);
 sprintf(buff,"%f",f_temp);
 delay(10);   
      comm(buff);
 delay(10);  
   
    }
}








  
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-14 23:36:19 | 显示全部楼层
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-8-14
在线时间
10 小时
 楼主| 发表于 2014-8-15 09:33:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好吧,原子哥,已经搞出来了。原子哥,问你个问题,摄像头采集图像通过wifi上传到上位机显示是怎么个操作方法啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-15 23:23:51 | 显示全部楼层
回复【3楼】偶有信仰:
---------------------------------
上位机得写代码才行.
你会自己写上位机就简单了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表