您的位置 首页 新能源

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

功能:有负温度显示,高精度格度可以显示-999C到9999C带有报警装置当温度为正时,显示十位个位十分位百分位当温度为负时,

  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);
    }
    }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/258035.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部