毕业设计:ds18b20温度采集控制 单片机C源程序具体点,急急急!!!

有程序分解的,再有总的源程序,不是c,是汇编的也行,具体完整,请发到我邮箱wangpingping619@163.com,谢谢~~~~是基于AT89C52的~~... 有程序分解的,再有总的源程序,不是c,是汇编的也行,具体完整,请发到我邮箱wangpingping619@163.com,谢谢~~~~
是基于AT89C52的~~
展开
 我来答
QQ1660827928
2011-05-26
知道答主
回答量:73
采纳率:0%
帮助的人:0
展开全部
  #include<reg51.h>

  #define uchar unsigned char
  #define uint unsigned int

  sbit DQ=P3^7;//ds18b20与单片机连接口
  sbit RS=P3^0;
  sbit RW=P3^1;
  sbit EN=P3^2;

  unsigned char code str1[]={"temperature: "};
  unsigned char code str2[]={" "};

  uchar data disdata[5];
  uint tvalue;//温度值
  uchar tflag;//温度正负标志

  /*************************lcd1602程序**************************/
  void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
  {unsigned int i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<100;j++);
  }

  void wr_com(unsigned char com)//写指令//
  { delay1ms(1);
  RS=0;
  RW=0;
  EN=0;
  P2=com;
  delay1ms(1);
  EN=1;
  delay1ms(1);
  EN=0;
  }

  void wr_dat(unsigned char dat)//写数据//
  { delay1ms(1);;
  RS=1;
  RW=0;
  EN=0;
  P2=dat;
  delay1ms(1);
  EN=1;
  delay1ms(1);
  EN=0;
  }

  void lcd_init()//初始化设置//
  {delay1ms(15);
  wr_com(0x38);delay1ms(5);
  wr_com(0x08);delay1ms(5);
  wr_com(0x01);delay1ms(5);
  wr_com(0x06);delay1ms(5);
  wr_com(0x0c);delay1ms(5);
  }

  void display(unsigned char *p)//显示//
  {
  while(*p!='\0')
  {
  wr_dat(*p);
  p++;
  delay1ms(1);
  }
  }

  init_play()//初始化显示
  { lcd_init();
  wr_com(0x80);
  display(str1);
  wr_com(0xc0);
  display(str2);
  }

  /******************************ds1820程序***************************************/
  void delay_18B20(unsigned int i)//延时1微秒
  {
  while(i--);
  }

  void ds1820rst()/*ds1820复位*/
  { unsigned char x=0;
  DQ = 1; //DQ复位
  delay_18B20(4); //延时
  DQ = 0; //DQ拉低
  delay_18B20(100); //精确延时大于480us
  DQ = 1; //拉高
  delay_18B20(40);
  }

  uchar ds1820rd()/*读数据*/
  { unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  { DQ = 0; //给脉冲信号
  dat>>=1;
  DQ = 1; //给脉冲信号
  if(DQ)
  dat|=0x80;
  delay_18B20(10);
  }
  return(dat);
  }

  void ds1820wr(uchar wdata)/*写数据*/
  {unsigned char i=0;
  for (i=8; i>0; i--)
  { DQ = 0;
  DQ = wdata&0x01;
  delay_18B20(10);
  DQ = 1;
  wdata>>=1;
  }
  }

  read_temp()/*读取温度值并转换*/
  {uchar a,b;
  ds1820rst();
  ds1820wr(0xcc);//*跳过读序列号*/
  ds1820wr(0x44);//*启动温度转换*/
  ds1820rst();
  ds1820wr(0xcc);//*跳过读序列号*/
  ds1820wr(0xbe);//*读取温度*/
  a=ds1820rd();
  b=ds1820rd();
  tvalue=b;
  tvalue<<=8;
  tvalue=tvalue|a;
  if(tvalue<0x0fff)
  tflag=0;
  else
  {tvalue=~tvalue+1;
  tflag=1;
  }
  tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
  return(tvalue);
  }

  /*******************************************************************/
  void ds1820disp()//温度值显示
  { uchar flagdat;
  disdata[0]=tvalue/1000+0x30;//百位数
  disdata[1]=tvalue%1000/100+0x30;//十位数
  disdata[2]=tvalue%100/10+0x30;//个位数
  disdata[3]=tvalue%10+0x30;//小数位

  if(tflag==0)
  flagdat=0x20;//正温度不显示符号
  else
  flagdat=0x2d;//负温度显示负号:-

  if(disdata[0]==0x30)
  {disdata[0]=0x20;//如果百位为0,不显示
  if(disdata[1]==0x30)
  {disdata[1]=0x20;//如果百位为0,十位为0也不显示
  }
  }

  wr_com(0xc0);
  wr_dat(flagdat);//显示符号位
  wr_com(0xc1);
  wr_dat(disdata[0]);//显示百位
  wr_com(0xc2);
  wr_dat(disdata[1]);//显示十位
  wr_com(0xc3);
  wr_dat(disdata[2]);//显示个位
  wr_com(0xc4);
  wr_dat(0x2e);//显示小数点
  wr_com(0xc5);
  wr_dat(disdata[3]);//显示小数位
  }
  /********************主程序***********************************/
  void main()
  { init_play();//初始化显示
  while(1)
  {read_temp();//读取温度
  ds1820disp();//显示
  }
  }
寂影无形
2011-05-24 · TA获得超过332个赞
知道小有建树答主
回答量:435
采纳率:0%
帮助的人:265万
展开全部
刚好有个,给你。
追问
你那个是实验的,我要有控制功能的,温度有上下限,有误差控制的,你看看有没有,还要有具体程序的,你的那个怎么看不了啊
追答
有是有,难找!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式