产品资料搜索:

最新产品展示

  • LDM8035接触式模块
    接触式IC卡读写模块 支持SLE4442/4428 小型化 低功耗 方便使用
  • LDM522-MINI射频模块
    体积小(1.9cm*1.4cm) ISO14443-A以及Mifare, Ultrlight&EV1等的低功耗模块
  • LDM-A3射频读卡器
    支持ISO14443A/B 二代证ID 低功耗 免驱
  • LDM523射频读卡模块
    支持iso14443A/B 韦根接口 二代证ID
  • 18B20单线温度检测的应用样例程序

    2009-5-12

    //18B20单线温度检测的应用样例程序
    //用三个数码管显示,P2.0,P2.1,P2.2接三个位码,P2接段码,P1.7接18B20的DQ
    //This program comes from the MCU开发板,it can`t show the minus temperature on the leds
    #include<REG52.H>
    #include<math.h>
    #include<INTRINS.H>

    #define uchar unsigned char
    #define uint   unsigned int;
    /*****************************************************************************/
    sbit seg1=P2^0;
    sbit seg2=P2^1;
    sbit seg3=P2^2;
    sbit DQ=P1^7;//ds18b20 端口
    sfr dataled=0x80;//显示数据端口,P0
    /**********************************************************************/
    uchar temp;
    uchar flag_get,count,num,minute,second;
    uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳
    uchar  str[3];
    /***********************************************************************/
    unsigned char ReadTemperature(void);
    uchar Init_DS18B20(void);
    unsigned char ReadOneChar(void);
    void WriteOneChar(unsigned char dat);
    void delay(unsigned int i);
    /************************************************************************/
    main()
    {

    TMOD|=0x01;//定时器设置
    TH0=0xef;
    TL0=0xf0;
    IE=0x82;
    TR0=1;
    P2=0x00;  
    count=0;


    while(1)
    {
       str[2]=0xc6;//显示C符号
       str[0]=tab[temp/10]; //十位温度
       str[1]=tab[temp%10]; //个位温度
      if(flag_get==1)  //定时读取当前温度
        {
      temp=ReadTemperature();
      flag_get=0;
        }
      }
    }


    /*************************************************************************/
    void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
    {
    TH0=0xef;//定时器重装值
    TL0=0xf0;
    num++;
    if (num==50)
        {num=0;
          flag_get=1;//标志位有效
          second++;
           if(second>=60)
             {second=0;
               minute++;  
              }
          }
    count++;
    if(count==1)
       {P2=0xf7;
        dataled=str[0];}//数码管扫描
    if(count==2)
       {P2=0xfb;
        dataled=str[1];}
    if(count==3)
       { P2=0xfd;
         dataled=str[2];
         count=0;}
    }
    /*************************************************************************************/
    void delay(unsigned int i)//延时函数
    {
    while(i--);
    }
    /***************************************************************************************/
    //18b20初始化函数
    uchar Init_DS18B20(void)
    {
    unsigned char x=0;
    DQ = 1;    //DQ复位
    delay(8);  //稍做延时
    DQ = 0;    //单片机将DQ拉低
    delay(80); //精确延时 大于 480us
    DQ = 1;    //拉高总线
    delay(10);
    x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    delay(5);
    return (x);
    }
    /******************************************************************************************/
    //读一个字节
    unsigned char ReadOneChar(void)
    {
    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(5);
    }
    return(dat);
    }
    /************************************************************************************************/
    //写一个字节
    void WriteOneChar(unsigned char dat)
    {
    unsigned char i=0;
    for (i=8; i>0; i--)
    {
      DQ = 0;
      DQ = dat&0x01;
      delay(5);
      DQ = 1;
      dat>>=1;
    }
    delay(5);
    }
    /*********************************************************************************************************/
    //读取温度
    unsigned char ReadTemperature(void)
    {
    unsigned char a=0;
    unsigned char b=0;
    unsigned char t=0;
    //float tt=0;
    while(Init_DS18B20());
    WriteOneChar(0xCC); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    delay(200);
    while(Init_DS18B20());//why initial again?
    WriteOneChar(0xCC); //跳过读序号列号的操作
    WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    a=ReadOneChar();
    b=ReadOneChar();

    b<<=4;
    b+=(a&0xf0)>>4;//b and a make the 8bit of the temperature
    t=b;
    //tt=t*0.0625;
    //t= tt*10+0.5; //放大10倍输出并四舍五入
    return(t);
    }

    © 2014 龙达科技有限公司版权所有,所有内容未经许可严禁复制