| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 377 人关注过本帖
标题:18B20测温(求助 C语言)
只看楼主 加入收藏
NT06
Rank: 1
等 级:新手上路
帖 子:27
专家分:2
注 册:2011-3-24
结帖率:40%
收藏
 问题点数:0 回复次数:0 
18B20测温(求助 C语言)
这个程序我参考了 我们老师的思路 利用定时器来实现测温 高手请别嫌程序冗长 帮忙看看


 #include "REG52.H"
#include "math.h"
#include <intrins.h>
sbit gewei=P2^0;
sbit shiwei=P2^1;
sbit baiwei=P2^2;
sbit qianwei=P2^3;
#define uint unsigned int
#define uchar unsigned char
uchar *p,id_buff[9];
 uchar temp_buff[9];
 uint  adcvalue;
   uchar  display_value[4]={0,0,0,0};
uchar  code gongyang[]={0xC0,0xF9,0xA4,0xB0,
                    0x99,0x92,0x82,0xF8,
                    0x80,0x90,0x88,0x83,
                    0xC6,0xA1,0x86,0x8E};  


   
     #define FOSC 11059200
     #define SETTIME 1000
     #define BAUD 9600
     sbit ds18b20= P3^3;
     bit flag;
     uint Temperature;
          uint  counttimes;
 void SendData(char dat);
void delay_ms(int m);
void shumagua_test();
void Init18b20();
void TempDelay(uint us);
void  shumaguan_display();
void GemTemp();
void TemperatuerResult();
void ReadID();
void read_bytes();
void WriteByte();
uchar ReadByte();
void WriteByte();
void  timer_init();
void  inter_init();
void  timer0_inter();
void  serial_init();
void   mcu_init();
main()
{  mcu_init();
shumagua_test();   
Init18b20();
 timer_init();
  serial_init();

 
  inter_init();
   delay_ms(10);
   
   p=id_buff;
   ReadID();
   while(1)
      {shumaguan_display();
         }
  }
 void Init18b20()
  {     ds18b20=1;
  _nop_();
  ds18b20=0;
 TempDelay(550);
  _nop_();
  ds18b20=1;
  TempDelay(120);
  _nop_();
  _nop_();
  _nop_();

  if(ds18b20==0)
 flag=1;
 else
 flag=0;
  TempDelay(550);
  _nop_();
  _nop_();
  ds18b20=1;
  
  }   
void delay_ms(int m)

{ unsigned int i,j;
for(i=0;i<m;i++)
 for(j=0;j<300;j++);
 }
void TempDelay (uint us)
{
     while(us--);
}

void shumagua_test()
{   gewei=0;
  shiwei=0;
  baiwei=0;
  qianwei=0;
  P0=0x00;
     delay_ms(500);
       gewei=1;
  shiwei=1;
  baiwei=1;
  qianwei=1;
  P0=0xff;
  delay_ms(500);
   

}
/************************************************************
*Function:向18B20写入一个字节
*************************************************************/
void WriteByte (uchar wr)  //单字节写入
{
    uchar i;
    for (i=0;i<8;i++)
    {
        ds18b20 = 0;
        _nop_();
    ds18b20=wr&0x01;
        TempDelay(5);   //delay 45 uS //5   TempDelay(2);//
        _nop_();
        _nop_();
        ds18b20=1;
        wr >>= 1;
    }
}
/************************************************************
*Function:读18B20的一个字节
*************************************************************/
uchar ReadByte (void)     //读取单字节
{
    uchar i,u=0;
    for(i=0;i<8;i++)
    {
        ds18b20 = 0;
        u >>= 1;
        ds18b20 = 1;
        if(ds18b20==1)
        u |= 0x80;
        TempDelay (4);  // TempDelay(2);//
        _nop_();
    }
    return(u);
}
/************************************************************
*Function:读18B20 多字节读
*************************************************************/
void read_bytes (uchar j)
{
    uchar i;
    for(i=0;i<j;i++)
    {
        *p = ReadByte();
        p++;
    }
}

/************************************************************
*Function:读取温度
*************************************************************/
void GemTemp (void)
{
    unsigned char temp1;
    read_bytes (2);                        // 读取scratchpad中的值

    temp1 = (temp_buff[0]>>4)&0x0f;        // 舍去小数点
    if((temp_buff[0]&0x08)==0x08)        // 四舍五入
        temp1 += 1;
    temp1 = ((temp_buff[1]<<4)&0x70)|temp1;
    Temperature = temp1;
    TempDelay(1);
}

/************************************************************
*Function:读18B20ID
*************************************************************/
void ReadID (void)//读取器件 id
{
    Init18b20();
    WriteByte(0x33);  //read rom
    read_bytes(8);
}
/************************************************************
*Function:18B20 测温处理
*************************************************************/
void TemperatuerResult(void)
{
    Init18b20 ();
    WriteByte(0xcc);   //skip rom
    WriteByte(0x44);   //温度转换指令
    TempDelay(6000);

    Init18b20 ();
    WriteByte(0xcc);   //skip rom
    WriteByte(0xbe);   //读取温度指令, 即读 scratchpad
    p = temp_buff;
    GemTemp();
}
void  shumaguan_display(void)
{
  P0=gongyang[display_value[3]];
  gewei=0;
 delay_ms(1);
  gewei=1;

  P0=gongyang[display_value[2]];
  shiwei=0;
delay_ms(1);
  shiwei=1;

  P0=gongyang[display_value[1]];
  baiwei=0;
  delay_ms(1);
  baiwei=1;

  P0=gongyang[display_value[0]]&0x7f;   //0111 1111
  qianwei=0;
 
delay_ms(1);
  P0=0xff;
}
  void  timer_init()      //定时器初始化
{
  TMOD=TMOD&0xf0|0x01;
  TL0= 0;
  TH0= 0;
  TR0=1;

  TMOD=TMOD&0x0f|0x20;
  TL1=TH1=0;
  TR1=1;
}
void  inter_init()    //中断初始化
{
  
  ET0=1;
  ES=1;
  EA=1;

}
void  timer0_inter()  interrupt 1    //定时器0中断函数
{
   TL0= 0;
   TH0= 0;

   counttimes++;
  
  if((counttimes%10)==0)
    {
      // keyvalue=keypad();
  //   adcvalue=getadcvalue(0);
  //   adcvalue=adcvalue*4.883;
      TemperatuerResult();
      Temperature=Temperature*0.0625;
     adcvalue=Temperature*10;
     display_value[0]=adcvalue/1000;
     display_value[1]=(adcvalue%1000)/100;
      display_value[2]=(adcvalue%1000%100)/10;
      display_value[3]=(adcvalue%1000%100)%10;

    }

  if((counttimes%100)==0)
    {     

     SendData(display_value[0]+0x30);
     SendData(0x2e);
     SendData(display_value[1]+0x30);
     SendData(display_value[2]+0x30);
     SendData(display_value[3]+0x30);
     counttimes=0;
    }

  if((counttimes%1000)==0)
     {

     }

}
void  serial_init()
{
   SCON=0X50;
   PCON=0X00;
   
//   AUXR=AUXR|0x40;  
   delay_ms(10);
}
   void SendData(char dat)
{   
    SBUF = dat;                     //Send current data
    while (!TI)
     {
      ;
     }                     //Wait for the previous data is sent
    TI = 0;                         //Clear TI flag
}
void   mcu_init(void)
{
  P0=0xff;
  P1=0xff;
  P2=0xff;
  P3=0xff;  
  //pwmadc=0;
 // P4SW=0xff;
//  P4=0xff;
}




























搜索更多相关主题的帖子: 定时器 include C语言 
2012-05-21 15:28
快速回复:18B20测温(求助 C语言)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024047 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved