微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机DS18B20温度计C语言程序

单片机DS18B20温度计C语言程序

时间:11-26 来源:互联网 点击:
  1. //功能:有负温度显示,高精度格度可以显示-9.99C到99.99C
    //带有报警装置
    //当温度为正时,显示十位 个位 十分位 百分位
    //当温度为负时,显示负号 十位 个位 十分位
    //缺点是上下限报警数值不能改变
    //注明:数码管是CC—共阴型
    //读取温度

  2. sbit DQ = P3^0;//定义通信端口
    bit fg=1;
    //晶振12MHz
    void delay_18B20(unsigned int i)
    {
    while(i--);
    }
    //初始化函数
    bit Init_DS18B20(void)
    {
    unsigned char x=0;
    DQ = 1;//DQ复位
    delay_18B20(8);//稍做延时
    DQ = 0;//单片机将DQ拉低
    delay_18B20(80); //精确延时 大于 480us
    DQ = 1;//拉高总线
    delay_18B20(14);
    x=DQ;//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    return(x); //Init_DS18B20(void) 被定义为bit则要有返回值
    delay_18B20(20);
    }
    //while(DQ);
    //while(~DQ);//检测到应答脉冲
    //
    //读一个字节
    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_18B20(4);
    }
    return(dat);
    }
    //写一个字节
    WriteOneChar(unsigned char dat)
    {
    unsigned char i=0;
    for (i=8; i>0; i--)
    {
    DQ = 0;
    DQ = dat&0x01;
    delay_18B20(5);
    DQ = 1;
    dat>>=1;
    }
    }
    ReadTemperature(void)
    {
    unsigned char a=0;
    unsigned char b=0;
    unsigned intt=0;

    Init_DS18B20();
    WriteOneChar(0xCC); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    delay_18B20(100);//至少750ms

  3. Init_DS18B20();
    WriteOneChar(0xCC); //跳过读序号列号的操作
    WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    a=ReadOneChar();
    b=ReadOneChar();
    if((b&0xf8)==0xf8) //位为1 时温度是负
    {
    b=~b;
    a=~a+1; //补码转换,取反加一
    (a==0)b++;
    fg=0; //读取温度为负时fg=0
    }
    //传感器返回值除16得实际温度值
    //技巧处理后先乘25,再除4,除4用右移实现
    t=((b*256+a)*25)>>2;
    //t=t+(t>0?0.5:-0.5); //四佘五入大于0加0.5, 小于0减0.5前面要把t定义为float型才可以
    return(t);
    }

  4. 显示头文件:display()

  5. char disp[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//数字0-9和‘-’的共阴段码
    char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
    void display(int tmp)
    {
    if(fg==0)
    {
    P2 = 0xff;
    P1 = 0x40;//"-"
    P2 = 0xEF;
    delay_18B20(2000);
    }
    P2 = 0xff;
    P1 = 0x39;//"C"//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码
    P2 = 0xFE;
    delay_18B20(200);

  6. P2 = 0xff;
    P1 = disp[tmp/10];
    P2 = 0xFD;
    delay_18B20(200);

  7. P2 = 0xff;
    P1 =disp_dot[tmp/10];
    P2 = 0xFB;
    delay_18B20(200);

  8. if(fg==1)

  9. {

  10. P2 = 0xff;
    P1 = disp[tmp/100];
    P2 = 0xF7;
    delay_18B20(200);
    }
    }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top